2014-02-19 67 views
0

在我参与的一些平台游戏中,我遇到了一个问题,玩家控制的单元暂时停下来,然后继续下降。pygame.sprite.spritecollideany没有碰撞?

简要说明 - 处于坠落状态的单位在坠落时会加速。我使用它的当前速度来确定它是否会与给定对象发生碰撞。

我认为这样做的方式是处于自由下落状态(下降状态),pg.sprite.spritecollideany将返回false直到它碰到某物(或预计碰到某物)。在那个时候,它总是会触及一些东西,因此返回是,不再掉落。实际上发生的事情是,一旦碰撞发生,单位会暂时停下来,但随后又回到下降状态,直到它碰到别的东西,然后重复。

我真的为此感到茫然

这里是相关的代码。我认为重要的代码是up_down_collision函数

class Unit(pg.sprite.Sprite): 

    def create_self_rect(self): 
     self.rect = pg.Rect(50, 50, 10, 20) 

    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.x = 100 
     self.y = 100 
     self.y_vel = 0 
     self.x_vel = 0 
     self.jumping_velocity = 3 
     self.gravity = .1 
     self.jumped = 0 
     self.state = {} 
     self.state['jumping'] = False 
     self.state['falling'] = True 
     self.state['grounded'] = False 
     self.create_self_rect() 

    def update_rect(self): 
     self.rect = pg.Rect(self.x, self.y, 10, 20) 

    def change_state(self, new_state): 
     for state in self.state: 
      self.state[state] = False 
     self.state[new_state] = True 

    def return_state(self): 
     for state in self.state: 
      if self.state[state]: 
       return state 

    def update(self): 
     self.left_right_collision(worlds.all_obstacles, self.x_vel) #worlds is a seperate module that holds all the collidables. nothing special 
     self.up_down_collision(worlds.all_obstacles, self.y_vel) 
     if self.return_state() is 'falling': 
      self.falling_state() 
     if self.return_state() is 'grounded': 
      self.y_vel = 0 
     self.update_position() 
     self.update_rect() 

    def update_position(self): 
     self.x += self.x_vel 
     self.y += self.y_vel 

    def falling_state(self): 
     time = pg.time.get_ticks() 
     self.y_vel = self.y_vel + \ 
      (((time - self.jumped)/1000) * self.gravity) 

    def up_down_collision(self, collidables, velocity): 
     self.rect.move_ip(0, velocity) 
     if pg.sprite.spritecollideany(self, collidables): 
      collidables = pg.sprite.spritecollide(self, collidables, False) 
      for platform in collidables: 
       if abs(velocity) == velocity: 
        self.rect.move_ip(0, -velocity) 
        self.rect.bottom = platform.rect.top 
        self.change_state('grounded') 
       else: 
        self.rect.move_ip(0, -velocity) 
        self.rect.top = platform.rect.bottom 
        self.y_vel = 0 
     else: 
      self.change_state('falling') 

class Platform(pg.sprite.Sprite): 
    def __init__(self, start_pos, size): #startpos, size are tuples 
     pg.sprite.Sprite.__init__(self) 
     self.x = start_pos[0] 
     self.y = start_pos[1] 
     self.width = size[0] 
     self.height = size[1] 
     self.rect = pg.Rect(self.x, self.y, self.width, self.height) 

pg.draw.rect(game_screen, (200, 200, 200), player.rect) 
lp = pf.Platform((300, 800), (500, 10)) 
pg.draw.rect(game_screen, (200, 200, 200), lp.rect) 
hp = pf.Platform((800, 700), (200, 10)) 
pg.draw.rect(game_screen, (200, 200, 200), hp) 
base = pf.Platform((0, 900), (1680, 200)) 
pg.draw.rect(game_screen, (200, 200, 200), base) 
wall = pf.Platform((1500, 700), (50, 300)) 
pg.draw.rect(game_screen, (200, 200, 200), wall) 
worlds.all_obstacles = [lp, hp, base, wall] 

也请原谅糟糕的代码。发布很令人尴尬!

回答

1

你有update一个问题:

if self.return_state() is 'falling': 
        #^should be == not is 

您正在测试的身份,不等价。

+0

对不起!更新了代码以显示返回状态。即使我做出你所建议的改变,该单位仍然下降。如果您需要更多信息,请让我知道!它的一切有点kludgey和im有点尴尬显示更多! –

+0

你有没有放入任何'印刷品'来确定状态?单独测试程序的某些部分? – jonrsharpe