跳跃游戏python_将跳跃添加到您的Python平台游戏

跳跃游戏python

    在本系列的上一篇文章中,您模拟了重力,但是现在您需要为玩家提供一种通过跳跃来对抗重力的方法。

    跳跃是重力的暂时缓解。 过了好一会儿,你跳起来不降下来的,重力的方式拉你。 但是,一旦您达到了跳跃的顶峰,重力就会再次开始并将您拉回地面。

    在代码中,这转换为变量。 首先,必须为播放器精灵建立变量,以便Python可以跟踪精灵是否在跳跃。 一旦播放器精灵跳跃,然后将重力再次施加到播放器精灵,将其拉回最近的对象。

    设置跳跃状态变量

    您必须向Player类添加两个新变量:

    • 用来跟踪播放器是否在跳跃的方式,取决于播放器精灵是否站立在坚实的地面上
    • 一种将玩家带回地面的游戏

    将这些变量添加到Player类。 在以下代码中,注释上方的行是针对上下文的,因此只需添加最后两行:

    
       
       
       
                    self . movex = 0
                    self . movey = 0
                    self . frame = 0
                    self . health = 10
                    # gravity variables here
                    self . collide_delta = 0
                    self . jump_delta = 6

    第一个变量( collide_delta )设置为0,因为在其自然状态下,播放器精灵不在中间跳跃中。 另一个变量( jump_delta )设置为6,以防止精灵在第一次进入游戏世界时反弹(实际上是跳跃)。 完成本文的示例后,请尝试将其设置为0以查看会发生什么。

    跳中碰撞

    如果您在蹦床上跳跃,您的跳跃将给人留下深刻的印象。 但是,如果您跳入墙壁会发生什么? (不要尝试找出它!)无论您开始跳动多么令人印象深刻,当您与比自己大得多且坚固得多的物体碰撞时,跳动都会很快结束。

    要在视频游戏中模仿这一点,必须在玩家精灵与地面(例如地面)碰撞时将self.collide_delta变量设置为0。 如果self.collide_delta的值不是0,则说明您的播放器正在跳跃,并且当播放器撞到墙壁或地面时它不会跳跃。

    Player类的update函数中,将地面碰撞块修改为如下所示:

    
       
       
       
            ground_hit_list = pygame. sprite . spritecollide ( self , ground_list , False )
            for g in ground_hit_list:
                self . movey = 0
                self . rect . y = worldy-ty-ty
                self . collide_delta = 0 # stop jumping
                if self . rect . y > g. rect . y :
                    self . health - = 1
                    print ( self . health )

    此代码块检查地面精灵与播放器精灵之间是否发生冲突。 在发生碰撞的情况下,它将玩家的Y位置设置为等于游戏窗口的高度( worldy )减去一个图块的高度减去另一个图块的高度的值(这样,游戏者精灵会显示为站在地上而不是中间)。 它还将self.collide_delta设置为0,以使程序知道播放器不在跳跃中。 此外,它还将self.movey设置为0,这样程序就可以知道玩家没有受到重力的牵拉(这是游戏物理学的怪癖,您无需在玩家被拉回地面后继续将其拉向地面。接地)。

    if语句检测玩家是否下降 地面以下; 如果是这样,它将扣除健康分数作为罚款。 假设您希望您的玩家因摔倒而失去健康点。 这不是绝对必要的; 这只是平台游戏中的常见约定。 不过,您更可能希望该事件触发某些事件,否则您的现实世界玩家将被困在玩掉落在屏幕外的精灵的游戏。 一种简单的恢复方法是将 self.rect.y再次设置为0,这样当玩家精灵掉落到世界上时,它会在世界的顶部重生并落在坚实的地面上。

    击中地面

    您的模拟重力希望玩家的Y轴运动为0或更大。 要创建跳跃,请编写代码,将您的播放器精灵从坚实的地面传送到空中。

    Player类的更新函数中,添加一个因重力而暂时搁置的命令:

    
       
       
       
            if self . collide_delta < 6 and self . jump_delta < 6 :
                self . jump_delta = 6 * 2
                self . movey - = 33   # how high to jump
                self . collide_delta + = 6
                self . jump_delta    + = 6

    根据此代码,跳跃将玩家精灵向空中发送了33个像素。 它是负数 33,因为Pygame中的数字越小,表示它离屏幕顶部越近。

    但是,此事件是有条件的。 仅当self.collide_delta小于6(其默认值在Player精灵的init函数中建立)并且self.jump_delta小于6时,这种情况才会发生。这种情况会阻止玩家触发另一次跳跃,直到它与平台碰撞为止。 换句话说,它可以防止空中跳跃。

    您不必阻止空中跳跃,也可以在特殊条件下允许空中跳跃。 例如,如果玩家获得了特殊的战利品,那么您可以授予其执行空中跳跃的能力,直到下一次被敌人击中为止。

    完成本文的示例后,请尝试将self.collide_deltaself.jump_delta设置为0,以获得100%的机会跳入空中。

    登陆平台

    到目前为止,您已经为玩家精灵击中地面时定义了反重力条件,但是游戏代码将平台和地面保留在单独的列表中。 (与本文中的许多选择一样,这并不是绝对必要的,您可以尝试将地面视为另一个平台。)要使游戏者精灵能够站在平台的顶部,您必须检测到玩家精灵和平台精灵,然后执行与地面碰撞相同的操作。 将此代码放入您的更新函数中:

    
       
       
       
            plat_hit_list = pygame. sprite . spritecollide ( self , plat_list , False )
            for p in plat_hit_list:
                self . collide_delta = 0 # stop jumping
                self . movey = 0

    不过,还有另外一个问题:平台悬空悬挂,这意味着玩家可以通过从顶部或底部接近它们来与它们交互。

    由您决定平台如何对播放器做出React。 阻止玩家从下方访问平台并不少见。 将此代码添加到上面的代码块中,将平台视为一种天花板或凉棚,以便玩家精灵可以跳到平台上,只要它跳得比平台的顶部高,但在试图从平台跳下时会阻塞玩家下面:

    
       
       
       
                if self . rect . y > p. rect . y :
                    self . rect . y = p. rect . y +ty
                else :
                    self . rect . y = p. rect . y -ty

    如果播放器精灵直接位于平台之下,则此if语句的第一子句会阻止播放器访问平台。 通过检测玩家精灵的位置更大(在Pygame中,这意味着屏幕上从上到下的位置更低),然后将玩家精灵的新Y位置设置为其当前的Y位置加上图块的高度,来完成此操作。有效地将玩家从其下方穿过平台的高度保持在一个瓷砖的高度之外。

    else子句则相反。 如果程序正在运行此代码,则播放器精灵的Y位置大于平台,这意味着播放器精灵正在从天上掉落(要么是因为它是从那里新生成的,要么是因为播放器已经跳了)。 在这种情况下,将玩家精灵的位置设置为平台位置减去一个图块的高度(因为请记住,在Pygame中,数字越小表示屏幕上的内容就越高)。 除非播放器跳离平台,否则它将使播放器保持在平台顶部。

    您可以尝试其他处理Sprite和平台交互的方法。 例如,假设玩家被假定在平台的“前面”,并且可以无缝地跳过平台以站在平台之上。 或者平台可以减慢玩家的飞跃,但不能完全阻止它。 您甚至可以通过将平台分组到不同列表中来进行混合和匹配。

    触发跳跃

    您的代码现在可以模拟所有必要的跳转条件,但是仍然缺少跳转触发器。 播放器精灵的self.jump_delta最初设置为6,并且跳转更新代码仅在小于6时触发。

    若要触发跳跃变量的新设置,请在Player类中创建一个跳转函数,将self.jump_delta设置为小于6,从而通过向播放器精灵发送33个像素到空中来暂时取消重力:

    
       
       
       
        def jump ( self , platform_list ) :
            self . jump_delta = 0

    不管您相信与否,这就是跳转功能所需要的。 其余的发生在更新功能中,并且您已经编写了该代码。

    在游戏中起作用之前,还有最后一件事要做。 如果您不知道这是什么,请尝试玩游戏以了解跳跃对您的影响。

    问题在于主循环中没有任何东西在调用Jump函数。 您很早就为此做了一个占位符按键,但是现在,所有的跳转键所做的只是打印跳转到终端。

    调用跳转功能

    在主循环中,将向上箭头的结果从打印调试语句更改为调用跳转函数。

    注意, 跳转功能(如更新功能)需要了解冲突,因此您必须告诉它要使用哪个plat_list

    
       
       
       
                if event. key == pygame. K_UP or event. key == ord ( 'w' ) :
                    player. jump ( plat_list )

    如果您想使用空格键进行跳跃,请将键设置为pygame.K_SPACE而不是pygame.K_UP 。 或者,您可以同时使用两者(作为单独的if语句),以便播放器可以选择。

    立即尝试游戏。 在下一篇文章中,您将滚动世界。

    Pygame platformer

    到目前为止,所有代码如下:

    
       
       
       
    #!/usr/bin/env python3
    # draw a world
    # add a player and player control
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值