万能的Python和Pygame模块构建一个游戏框架(3)

使用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键时观察控制台窗口的输出。

扫描二维码关注公众号,回复: 6537798 查看本文章

$ 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.xself.rect.y属性指定)重新定义为当前位置加上任何数量movexmovey应用的位置。(稍后设置移动所需的像素数。)


    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技术分享交流

猜你喜欢

转载自blog.csdn.net/zhizhun88/article/details/90707108