Pygame角色移动与射击问题求助:角色垂直跳跃消失、子弹无法显示
嘿,我帮你排查了代码里的问题,刚好找到了导致角色跳跃消失和子弹不显示的原因,咱们一步步来修复:
问题1:角色跳跃时消失
你有没有发现,跳跃的时候角色的左右移动状态被设为False,但此时角色的standing属性还是False(因为之前移动时设置过,跳跃逻辑里没改它)?看你的Player.Draw()方法:
def Draw(self, win): if not (self.standing): if self.walkCount + 1 >= 27: self.walkCount = 0 if self.left: win.blit(walkLeft[self.walkCount//3], (self.x,self.y)) self.walkCount += 1 elif self.right: win.blit(walkRight[self.walkCount//3], (self.x,self.y)) self.walkCount += 1 else: if self.right: win.blit(walkRight[0], (self.x, self.y)) else: win.blit(walkLeft[0], (self.x, self.y))
当self.standing是False,但self.left和self.right都是False时,代码会进入if not (self.standing)的块,但既不执行左移也不执行右移的绘制分支,结果就是完全没画角色,看起来就像消失了。
修复方法:在没有左右移动的情况下(包括跳跃时),把man.standing设为True。修改你的移动逻辑:
if keys[pygame.K_a] and man.x > man.vel: man.x -= man.vel man.left = True man.right = False man.standing = False elif keys[pygame.K_d] and man.x < WinWidth - man.vel - man.width: man.x += man.vel man.right = True man.left = False man.standing = False else: man.walkCount = 0 man.standing = True # 新增这一行,标记角色处于站立状态
这样跳跃时,角色会触发这个else块,把standing设为True,Draw方法就会绘制站立的角色了。
问题2:子弹无法显示
你的子弹发射逻辑有两个小错误:
- 条件写反了:
if len(bullets) > 5意味着只有当子弹数量超过5时才允许发射新子弹,这和你想限制最多5颗子弹的逻辑完全相反,应该改成if len(bullets) < 5。 - 语法错误:创建
Projectile对象时多打了一个右括号,导致参数传递失败,根本没生成子弹。原代码里的这一行:
bullets.append(Projectile(round(man.x + man.width //2)), round(man.y + man.height), 30,(138,43,226), facing)
应该把round(man.x + man.width //2)后面的右括号去掉,另外我把子弹的y坐标改成了角色的中心位置(man.y + man.height //2),这样发射位置更合理:
bullets.append(Projectile(round(man.x + man.width // 2), round(man.y + man.height // 2), 30, (138,43,226), facing))
修改后的完整子弹发射代码:
if keys[pygame.K_SPACE]: if man.left: facing = -1 else: facing = 1 if len(bullets) < 5: # 改为小于5,限制最多5颗子弹 bullets.append(Projectile(round(man.x + man.width // 2), round(man.y + man.height // 2), 30, (138,43,226), facing))
把这两处修改后,再运行代码试试:角色跳跃时会正常显示站立状态,按下空格键也能发射紫色的子弹啦!
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

