Pygame:有人可以帮我实现双跳吗? [英] Pygame: Can someone help me implement double jumping?

查看:62
本文介绍了Pygame:有人可以帮我实现双跳吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道已经有其他关于这个的帖子了,但是我的运动系统与我发现的有点不同,所以我随后问了这个问题.

I know there are already other posts about this out there, but my movement system is a little from the ones that I have found, so subsequently I am asking this question.

我的移动系统基于一个名为 Move(up,left,right,down) 的命名元组然后是这个:

My movement system is based on a named tuple called Move(up,left,right,down) Then there is this:

def update(self, move, blocks):
    # check if we can jump 
    if move.up and self.on_ground:
        self.yvel -= self.jump_speed
    # simple left/right movement
    if move.left:
            self.xvel = -self.move_speed
    if move.right:
            self.xvel = self.move_speed

    # if in the air, fall down
    if not self.on_ground:
        self.yvel += 0.3
        # but not too fast
        if self.yvel > max_gravity: self.yvel = max_gravity

    # if no left/right movement, x speed is 0, of course
    if not (move.left or move.right):
        self.xvel = 0

    # move horizontal, and check for horizontal collisions
    self.rect.left += self.xvel
    self.collide(self.xvel, 0, blocks)

    # move vertically, and check for vertical collisions
    self.rect.top += self.yvel
    self.on_ground = False
    self.collide(0, self.yvel, blocks)

def collide(self, xvel, yvel, blocks):
    # all blocks that we collide with
    for block in [blocks[i] for i in self.rect.collidelistall(blocks)]:

        # if xvel is > 0, we know our right side bumped 
        # into the left side of a block etc.
        if xvel > 0:
                self.rect.right = block.rect.left;self.xvel=0
        if xvel < 0:
                self.rect.left = block.rect.right;self.xvel=0

        # if yvel > 0, we are falling, so if a collision happpens 
        # we know we hit the ground (remember, we seperated checking for
        # horizontal and vertical collision, so if yvel != 0, xvel is 0)
        if yvel > 0:
            self.rect.bottom = block.rect.top
            self.on_ground = True
            self.yvel = 0
        # if yvel < 0 and a collision occurs, we bumped our head
        # on a block above us
        if yvel < 0: self.rect.top = block.rect.bottom;self.yvel=0

我尝试向名为 upUp 的元组添加第五个变量,当它被调用时,它会触发另一个跳转,无论 on_ground 是否为真.

I tried adding a fifth variable to the tuple called upUp, and when that was called it would trigger another jump, regardless of if on_ground was true or not.

为了触发它,我在事件循环中使用了它:

To trigger it I used this in the event loop:

if e.type==KEYUP:
    if dj==0:
        dj=-1
    if dj=-1:
        dj='true'
Move(K_w,K_a,K_d,K_s,dj)

但是这根本不起作用!有人有什么建议吗?

But this didn't work well at all! Anyone got any suggestions?

推荐答案

你必须保持某种状态来跟踪你处于跳跃的哪个阶段".

You have to maintain some kind of state to keep track of which "phase" of jumping you're in.

这些阶段"是:

  • 地面
  • 执行跳跃(按下跳跃按钮)
  • 跳跃并在空中(松开跳跃按钮)
  • 双跳(再次按下跳跃键)

因此您应该能够执行以下操作:

So you should be able to do something like:

def update(self, move, blocks):
    if self.on_ground:
        self.jump_state = 'on_ground'

    if move.up and self.on_ground:
        # jump!
        self.yvel -= self.jump_speed
        self.jump_state = 'jumped'

    if self.jump_state = 'jumped' and not move.up and not self.on_ground:
        self.jump_state = 'ready_for_double_jump'

    if self.jump_state = 'ready_for_double_jump' and move.up:
        # jump!
        self.yvel -= self.jump_speed
        self.jump_state = 'double_jumped'

    ...

你会明白的.

这篇关于Pygame:有人可以帮我实现双跳吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆