
使用Pygame移动你的游戏角色
Pygame中有一些函数可以添加其他类型的控件,但是如果你输入Python代码肯定有一个键盘,那就是我们将要使用的。
您在本系列的第二篇文章中创建了一个退出游戏的键,其原理与移动相同。但是,让你的角色移动要复杂一些。
让我们从简单的部分开始:设置控制器键。
设置用于控制播放器精灵的按键
在IDLE,Ninja-IDE或文本编辑器中打开Python游戏脚本。
由于游戏必须不断地“监听”键盘事件,因此您将编写需要连续运行的代码。你能想出在游戏期间需要经常运行的代码放在哪里吗?
如果你回答“在主循环中”,那你就是对的!请记住,除非代码在循环中,否则它将只运行一次 - 如果它隐藏在永远不会被使用的类或函数中,它可能根本不会运行。
要对传入的按键进行Python监视,请将此代码添加到主循环中。没有任何代码可以使任何事情发生,所以使用print
语句来表示成功。这是一种常见的调试技术。
而主要== 真:
对于事件的 pygame的。事件。get ():
if event。type == pygame。退出:
pygame。退出(); SYS。exit ()
main = 如果是事件则为False。type == pygame。KEYDOWN:if event。key == pygame。K_LEFT 或事件。
key == ord ('a' ):
print ('left' )
if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
print ('right' )
if event。key == pygame。K_UP 或事件。key == ord ('w' ):
print ('jump' )
if event。type ==pygame的。KEYUP:
if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
print ('left stop' )
if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
print ('right stop' )
if event。key == ord ('q' ):
pygame的。quit ()
sys。exit ()
main = False
有些人喜欢使用键盘字符W,A,S和D来控制玩家角色,而其他人更喜欢使用箭头键。一定要包括这两个选项。
**注意: **在编程时考虑所有用户至关重要。如果您编写的代码仅适用于您,则您很可能是唯一使用您的应用程序的代码。更重要的是,如果你找一份写钱代码的工作,你应该编写适合每个人的代码。为用户提供选择,例如使用箭头键或WASD的选项,是一个优秀程序员的标志。
使用Python启动游戏,并在按下向右,向左和向上箭头或A,D和W键时观察控制台窗口的输出。
$ python ./your-name_game。PY
左
左边停止
右
右停止
跳跃
这证实了Pygame正确检测到按键。现在是时候做精灵移动的艰苦工作了。
编码玩家移动功能
要使精灵移动,必须为表示移动的精灵创建一个属性。当您的精灵没有移动时,此变量设置为0
。
如果您要为您的精灵设置动画,或者您决定将来为其设置动画,则还必须跟踪帧以使步行循环保持正常。
在Player类中创建变量。前两行用于上下文(如果你一直在跟随,你已经在代码中使用了它们),所以只添加最后三行:
def __init__ (self ):
pygame。精灵。雪碧。__init__ (自我)
自我。movex = 0 #沿X
self 移动。movey = 0 #沿着Y
self 移动。frame = 0 #counts frames
设置好这些变量后,就可以对精灵的运动进行编码了。
玩家精灵不需要一直响应控制; 有时它不会移动。因此,控制精灵的代码只是玩家精灵所做的所有事情的一小部分。当你想在Python中创建一个对象时,可以独立于其余的代码,将新代码放在一个函数中。Python函数以关键字开头def
,代表define。
在您的Player类中创建一个函数,为精灵在屏幕上的位置添加一些像素数。不要担心你添加了多少像素; 这将在以后的代码中决定。
def控制(自我, x , y ):
'''
控制球员运动
'''
自我。movex + = x
self。movey + = y
要在Pygame中移动精灵,你必须告诉Python在其新位置重新绘制精灵 - 以及新位置的位置。
由于Player精灵并不总是在移动,因此更新只需要是Player类中的一个函数。在control
您之前创建的函数之后添加此函数。
为了使sprite看起来像是在行走(或飞行,或者你的精灵应该做的任何事情),你需要在按下适当的键时改变它在屏幕上的位置。要使其在屏幕上移动,您可以将其位置(由属性self.rect.x
和self.rect.y
属性指定)重新定义为当前位置加上任何数量movex
或movey
应用的位置。(稍后设置移动所需的像素数。)
def update (self ):
'''
更新精灵位置
'''
self。RECT。x = 自我。RECT。x + 自我。的Movex
对Y位置做同样的事情:
自我。RECT。y = 自我。RECT。y + 自我。movey
对于动画,每当精灵移动时前进动画帧,并使用相应的动画帧作为播放器图像:
#向左移动
,如果 自我。movex < 0:
自我。帧 + = 1
如果 自己。frame > 3 * ani:
self。frame = 0
self。image = self。图像[ 自我。帧 // ANI ]
#向右移动
,如果 自我。movex > 0:
自我。帧 + = 1
如果 自我。frame > 3 * ani:
self。frame = 0
self。image = self。图像[ (自我。帧 // ANI ) + 4 ]
通过设置变量告诉代码要添加到精灵位置的像素数,然后在触发Player精灵的功能时使用该变量。
首先,在设置部分创建变量。在此代码中,前两行用于上下文,因此只需将第三行添加到脚本中:
player_list = pygame。精灵。Group ()
player_list。add ( player )
steps = 10 #要移动的像素数
现在你有了相应的函数和变量,使用你的按键来触发函数并将变量发送到你的精灵。
通过print
使用播放器精灵的名称(播放器),函数(.control)替换主循环中的语句,以及希望播放器精灵随每个循环移动的沿X轴和Y轴的步数来执行此操作。
如果事件。type == pygame。KEYDOWN:
if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
玩家。控制( -steps ,0 )
if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
玩家。控制(步骤,0 )
如果事件。key == pygame。K_UP 或事件。key == ord ('w' ):
print ('jump' )
if event。type == pygame。KEYUP:
if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
玩家。控制(步骤,0 )
如果事件。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
玩家。控制( -steps ,0 )
if event。key == ord ('q' ):
pygame。quit ()
sys。exit ()
main = False
请记住,steps
是一个变量,表示按下键时精灵移动的像素数。如果在按D或右箭头时向玩家精灵的位置添加10个像素,则当您停止按下该键时,必须减去10(-steps
)以将精灵的动量恢复为0。
立即试试你的游戏吧。警告:它不会按预期执行。
为什么你的精灵没有移动?因为主循环不调用该update
函数。
将代码添加到主循环以告诉Python更新播放器精灵的位置。添加注释行:
播放器。update () #
upcate player position player_list。画(世界)
pygame。显示。翻转()
时钟。tick ( fps )
再次启动游戏,看看您的玩家精灵在您的出价中移动屏幕。还没有垂直运动,因为这些功能将受到重力控制,但这是另一篇文章的另一个教训。
在此期间,如果您可以访问操纵杆,请尝试阅读Pygame的操纵杆模块文档,看看是否可以让您的精灵移动。或者,看看你是否可以让鼠标与你的精灵进行交互。
最重要的是,玩得开心!
本教程中使用的所有代码
供您参考,这是迄今为止本系列文章中使用的所有代码。
#!/ usr / bin / env python3
#画一个世界
#添加玩家和玩家控制
#add player movement
#GNU All-Permissive License
#复制和分发此文件,无论有没有修改,
#都允许在任何媒体中使用#版税提供版权
#通知,此通知保留。此文件按原样提供,
#没有任何保证。
进口 pygame的
进口 SYS
进口 OS
“”“
对象
‘’”
类的播放器(。pygame的精灵。精灵):
‘’“
生成一个播放器
‘’”
def __init__ (self ):
pygame。精灵。雪碧。__init__ (自我)
自我。movex = 0
self。movey = 0
self。frame = 0
self。图像 = [ ]
为我在 范围(1 ,5 ):
IMG = pygame的。图像。负载(操作系统。路径。加入('images' ,'hero' + str ( i ) + '。png' ))。convert ()
img。convert_alpha ()
img。set_colorkey ( ALPHA )
self。图像。追加( img )
自我。image = self。图像[ 0 ]
自我。矩形 = 自我。图像。get_rect ()
def控制(self , x , y ):
'''
控制玩家运动
'''
自我。movex + = x
self。movey + = y
def update (self ):
'''
更新精灵位置
'''
self。RECT。x = 自我。RECT。x + 自我。movex
self。RECT。y = 自我。RECT。y + 自我。movey
#向左移动
,如果 自我。movex < 0:
自我。帧 + = 1
如果 自己。frame > 3 * ani:
self。frame = 0
self。image = self。图像[ 自我。帧 // ANI ]
#向右移动
,如果 自我。movex > 0:
自我。帧 + = 1
如果 自己。frame > 3 * ani:
self。frame = 0
self。image = self。图像[ (自我。帧 // ANI ) + 4 ]
'' '
设置
'''
worldx = 960
worldy = 720
fps = 40 #frame rate
ani = 4 #animation cycles
clock = pygame。时间。时钟()
pygame。初始化()
主要= 真
BLUE = (25 ,25 ,200 )
BLACK = (23 ,23 ,23 )
WHITE = (254 ,254 ,254 )
ALPHA = (0 ,255 ,0 )
世界= pygame的。显示。set_mode ([ worldx , worldy ] )
backdrop = pygame。图像。负载(OS。路径。加入('图像' ,'stage.png' ))。convert ()
backdropbox = world。get_rect()
player = Player () #profen player
player。RECT。x = 0
玩家。RECT。y = 0
player_list = pygame。精灵。Group ()
player_list。添加(播放器)
步骤= 10 #如何快速移动
“”“
主回路
‘’”
而主要== 真:
对于事件的 pygame的。事件。get ():
if event。type == pygame。退出:
pygame。退出(); SYS。exit ()
main = 如果是事件则为False。type == pygame。KEYDOWN:if event。key == pygame。K_LEFT 或事件。key == ord ('a' ): 玩家。
控制( -steps ,0 )
if event。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
玩家。控制(步骤,0 )
如果事件。key == pygame。K_UP 或事件。key == ord ('w' ):
print ('jump' )
if event。type ==pygame的。KEYUP:
if event。key == pygame。K_LEFT 或事件。key == ord ('a' ):
玩家。控制(步骤,0 )
如果事件。key == pygame。K_RIGHT 或事件。key == ord ('d' ):
玩家。控制( -steps ,0 )
if event。键 == ord ('q' ):
pygame。quit ()
sys。exit ()
main = False
#world.fill(黑色)
世界。blit (背景, backgroundbox )
播放器。update ()
player_list。draw ( world ) #refresh player position
pygame。显示。翻转()
时钟。打勾( fps)
你已经走得很远,学到了很多,但还有很多工作要做。在接下来的几篇文章中,您将添加敌人的精灵,模拟引力等等。与此同时,用Python练习!
大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每日分享一些学习的方法和需要注意的小细节
点击:python技术分享交流
网友评论