当前位置: 首页 > 科技观察

使用Pygame让您的游戏角色移动

时间:2023-03-14 22:26:42 科技观察

在本系列的第4部分中,学习如何编写控制移动游戏角色的控件。在本系列的第一篇文章中,我解释了如何使用Python创建一个简单的基于文本的骰子游戏。在第二部分中,我向您展示了如何从头开始构建游戏,从创建游戏环境开始。然后在第三部分,我们创建一个玩家精灵并让它在您的(非空的)游戏世界中生成。您可能已经注意到,如果您不能移动角色,游戏就没有那么有趣。在本文中,我们将使用Pygame添加键盘控件,以便您可以控制角色的移动。Pygame中有很多功能可以用来添加其他控件(除了键盘),但是如果你是在敲Python代码,那么你必须有一个键盘,这就是我们接下来要用到的控件。了解键盘控件后,您可以自行探索其他选项。在本系列的第二篇文章中,您创建了一个退出游戏的按钮,移动角色的原理是一样的。然而,让你的角色移动有点复杂。让我们从简单的部分开始:设置控制器按钮。设置用于控制玩家精灵的键在IDLE、Ninja-IDE或文本编辑器中打开Python游戏脚本。因为游戏需要一直“监听”键盘事件,所以你写的代码需要持续运行。你知道在游戏周期中需要持续运行的代码放在哪里吗?如果您回答“在主循环中”,那么您是正确的!请记住,除非代码处于循环中,否则它(在大多数情况下)只会运行一次。如果它是在一个从未使用过的类或函数中编写的,它可能根本无法运行。要让Python监听传入的击键,请将以下代码添加到主循环中。当前代码不会产生任何效果,因此使用print语句表示成功。这是一种常见的调试技术。whilemain==True:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit();sys.exit()main=Falseifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFTorevent.key==ord('a'):print('left')ifevent.key==pygame.K_RIGHT或event.key==ord('d'):print('right')如果event.key==pygame.K_UP或event.key==ord('w'):print('jump')ifevent.type==pygame.KEYUP:ifevent.key==pygame.K_LEFTorevent.key==ord('a'):print('leftstop')ifevent.key==pygame.K_RIGHT或者event.key==ord('d'):print('rightstop')ifevent.key==ord('q'):pygame.quit()sys.exit()main=False有些人喜欢使用键盘字母W、A、S和D来控制玩家角色,而其他人则优先使用方向键。因此,请确保包括这两个选项。注意:当你在编程的时候,同时考虑所有的用户是非常重要的。如果您编写代码只是为了自己运行它,那么您很可能是您编写的程序的唯一用户。更重要的是,如果你想要一份通过编写代码赚钱的工作,你应该编写每个人都可以运行的代码。为您的用户提供选择,例如提供使用箭头键或WASD的选项,是优秀程序员的标志。使用Python启动您的游戏,并在您按下“上、下、左、右”箭头键或A、D和W键时在控制台窗口中观察输出。$python./your-name_game.pyleftleftstoprightrightstopjump这验证Pygame可以正确检测按键。现在是让妖精移动的艰巨任务了。编写玩家移动函数为了让您的精灵移动,您必须为您的精灵创建一个属性来表示移动。当您的精灵不移动时,此变量设置为0。如果您正在为您的小妖精制作动画,或者您决定在将来制作它的动画,您还必须跟踪帧以保持步行循环在轨道上。在Player类中创建以下变量。前两行用于上下文(如果你一直在跟进,你的代码中已经有这两行),所以只需要添加***三行:def__init__(self):pygame.sprite。Sprite.__init__(self)self.movex=0#沿X方向移动self.movey=0#沿Y方向移动self.frame=0#帧数设置好这些变量后,就可以编写妖精的代码了移动。玩家精灵不需要一直响应控件,有时它不会移动。控制地精的代码只是玩家地精能做的一小部分。在Python中,当您想让一个对象独立于您的其余代码执行某些操作时,您可以将新代码放入一个函数中。Python函数以关键字def开头,def代表定义一个函数。在您的Player类中创建以下函数,以将几个像素添加到您的精灵在屏幕上的位置。现在不要担心添加几个像素,稍后将在代码中确定。defcontrol(self,x,y):'''Controlplayermovement'''self.movex+=xself.movey+=y要在Pygame中移动小妖精,你需要告诉Python在新的位置重新绘制小妖精位置,以及这个新位置在哪里。由于玩家精灵并不总是在移动,更新只需要成为Player类中的一个函数即可。在前面创建的控制函数之后添加此函数。要使小妖精看起来像是在行走(或飞行,或任何您的小妖精应该做的事),您需要在按下适当的键时更改它在屏幕上的位置。要使其在屏幕上移动,您需要将其位置(由self.rect.x和self.rect.y属性指定)重新定义为其当前位置加上已应用的任何movex或movey。(后面会设置移动像素个数)defupdate(self):'''更新小仙女的位置'''self.rect.x=self.rect.x+self.movex对Y方向:self.rect.y=self.rect.y+self.movey对于动画,随着妖精的移动推进动画帧,并使用相应的动画帧作为玩家的图像:#moveleftifself.movex<0:自己。frame+=1ifself.frame>3*ani:self.frame=0self.image=self.images[self.frame//ani]#向右移动ifself.movex>0:self.frame+=1ifself.frame>3*ani:self.frame=0self.image=self.images[(self.frame//ani)+4]告诉代码通过设置变量将多少像素添加到精灵的位置,然后在触发玩家精灵的功能时使用此变量。首先,在您的设置部分创建此变量。在下面的代码中,前两行是上下文控制,所以只需要在你的脚本中添加第三行代码:player_list=pygame.sprite.Group()player_list.add(player)steps=10#多少像素到立即移动现在您已经有了函数和变量,使用您的按键来触发函数并将变量传递给您的小妖精。为此,请将主循环中的打印语句替换为玩家精灵的名称(player)、函数(.control)以及您希望玩家精灵在每个循环中沿X轴和Y轴移动的步数。ifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFTorevent.key==ord('a'):player.control(-steps,0)ifevent.key==pygame.K_RIGHT或event.key==ord('d'):player.control(steps,0)ifevent.key==pygame.K_UP或event.key==ord('w'):print('jump')ifevent.type==pygame.KEYUP:如果event.key==pygame.K_LEFT或event.key==ord('a'):player.control(steps,0)如果event.key==pygame.K_RIGHT或event.key==ord('d'):player.control(-steps,0)ifevent.key==ord('q'):pygame.quit()sys.exit()main=False记住,steps变量表示按下按钮时精灵移动的像素数。如果当您按D或向右箭头键时,您的精灵的位置会增加10个像素。然后,当您停止按下该键时,您必须(step)减去10(-steps)才能使精灵的动量恢复为0。现在试试您的游戏。注意:它不会像您预期的那样工作。为什么你的地精还是动弹不得?因为主循环还没有调用更新函数。将以下代码添加到您的主循环中,以告知Python更新玩家精灵的位置。添加注释行:player.update()#Updateplayerpositionplayer_list.draw(world)pygame.display.flip()clock.tick(fps)再次开始你的游戏,见证你的玩家精灵在你的命令下来回移动屏幕上。目前还没有垂直运动,因为这部分功能是由重力控制的,但这是另一篇文章的教训。同时,如果您拥有一个操纵杆,您可以尝试阅读Pygame中操纵杆模块的文档,看看是否可以让您的小妖精以这种方式移动。或者,看看你是否可以用鼠标与你的小妖精互动。最重要的是,玩得开心!本教程中使用的所有代码为了便于参考,以下是本系列文章到目前为止使用的所有代码。#!/usr/bin/envpython3#DrawWorld#AddPlayerandPlayerControl#AddPlayerMovementControl#GNUAll-PermissiveLicense#复制和分发此文件,无论是否修改,#都允许在任何媒体中使用,无需版税前提是保留版权#通知和本通知。此文件按原样提供,#无任何保证。sprite.Sprite.__init__(self)self.movex=0self.movey=0self.frame=0self.images=[]foriinrange(1,5):img=pygame.image.load(os.path.join('images','hero'+str(i)+'.png')).convert()img.convert_alpha()img.set_colorkey(ALPHA)自我。images.append(img)self.image=self.images[0]self.rect=self.image.get_rect()defcontrol(self,x,y):'''控制玩家移动'''self.movex+=xself.movey+=ydefupdate(self):'''更新妖精的位置'''self.rect.x=self.rect.x+self.movexself.rect.y=self.rect.y+自我。movey#向左移动ifself.movex<0:self.frame+=1ifself.frame>3*ani:self.frame=0self.image=self.images[self.frame//ani]#向右移动ifself.movex>0:self.frame+=1ifself.frame>3*ani:self.frame=0self.image=self.images[(self.frame//ani)+4]'''Set'''worldx=960worldy=720fps=40#帧刷新率ani=4#动画循环clock=pygame.time.Clock()pygame.init()main=TrueBLUE=(25,25,200)BLACK=(23,23,23)WHITE=(254,254,254)ALPHA=(0,255,0)world=pygame.display.set_mode([worldx,worldy])backdrop=pygame.image.load(os.path.join('images','stage.png')).convert()backdropbox=world.get_rect()player=Player()#生成播放器player.rect.x=0player.rect.y=0player_list=pygame.sprite.Group()player_list.add(player)steps=10#移动速度'''主循环'''whilemain==True:foreventinpygame.event.get():ifevent.type==pygame.QUIT:pygame.quit();sys.exit()main=Falseifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_LEFTorevent.key==ord('a'):player.control(-steps,0)ifevent.key==pygame.K_RIGHT或event.key==ord('d'):player.control(steps,0)ifevent.key==pygame.K_UP或event.key==ord('w'):print('jump')ifevent.type==pygame.KEYUP:ifevent.key==pygame.K_LEFTorevent.key==ord('a'):player.control(steps,0)ifevent.key==pygame.K_RIGHT或event.key==ord('d'):player.control(-steps,0)ifevent.key==ord('q'):pygame.quit()sys.exit()迈n=False#world.fill(BLACK)world.blit(backdrop,backdropbox)player.update()player_list.draw(world)#更新玩家位置pygame.display.flip()clock.tick(fps)你已经学会了很多,但您仍然可以做很多事情在接下来的几篇文章中,您将实现添加敌人地精、模拟重力等。与此同时,练习Python!