Pygame:有人可以帮我实现双跳吗? [英] Pygame: Can someone help me implement double jumping?
问题描述
我知道已经有其他关于这个的帖子了,但是我的运动系统与我发现的有点不同,所以我随后问了这个问题.
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屋!