2013-12-16 2 views
6

Я знаю, что есть другие сообщения об этом, но моя система движения немного от тех, которые я нашел, поэтому впоследствии я задаю этот вопрос.Pygame: Может кто-нибудь помочь мне реализовать двойной прыжок?

Моя система движения на основе имени кортежа называется Move(up,left,right,down) Тогда это:

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 или нет.

Чтобы вызвать его, я использовал это в цикле обработки событий:

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

Но это не работало хорошо на всех! У кого-нибудь есть предложения?

+1

http://www2.hawaii.edu/~chin/215S10/Assignments/A8/gameSprites.py Это может быть реализация его с быстрого взгляда. –

+1

Существует также полная рабочая версия (* just test *) Super Mario Bros, использующая pygame: http://www.pygame.org/project-Super+Mario+Python+Beta-1339-4650.html - У нее есть * Удерживайте Z, чтобы увеличить время эфира во время прыжка * –

ответ

3

Вы должны поддерживать какое-то состояние, чтобы отслеживать, какие «фаза» прыжков вы в

Эти «фазы» являются:.

  • на земле
  • сделать прыжок (прыжок кнопка нажата)
  • прыгает и в воздухе (перепрыгивать кнопка отпущена)
  • двойной прыжок (перепрыгивать кнопка нажата снова)

Таким образом, вы должны быть в состоянии сделать что-то вроде:

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' 

    ... 

Вы получаете идею.

+0

Немного изменил его и работал как шарм! Благодаря! –

Смежные вопросы