2016-02-15 132 views
-1

如果你可以帮助我们解决这个问题,那将会非常棒。我们目前正在学校开展一个游戏项目,我们想创建一个类似炸弹人的迷宫游戏。Pygame碰撞变速

问题是以下几点: 炸弹的位置和速度取决于使用浮点值跟踪的鼠标,但是如果点击很远,它会变得太高,因此它可以跳过碰撞检测,因为它刚好有时太快。现在还有其他奇怪的错误,当你用炸弹的底部和其他碰撞排列炸弹时。

方法是否碰撞错误?我们是否需要检查每个站点,或者有没有更好的解决方案来解决这个问题。我们也考虑过只使用4个方向,但即使这样也不能正常工作。

我真的希望有人能帮助。

class Block(pygame.sprite.Sprite): 

    def __init__(self,color = SCHWARZ, width = 40, height = 40, movable = 0): 

     super().__init__() 

     self.width = width 
     self.height = height 

     self.color = color 

     self.movable = movable 

     self.image = pygame.Surface((width,height)) 
     self.image.fill(color) 

     self.properties() 

    def properties(self): 

     self.rect = self.image.get_rect() 

     self.origin_x = self.rect.centerx 
     self.origin_y = self.rect.centery 

    def set_pos(self, x, y): 
     self.rect.x = x 
     self.rect.y = y 

    def render(self,window): 
     pygame.draw.rect(window,self.color,(self.rect.x,self.rect.y,self.width,self.height)) 

class Bomb(Block): 

    def __init__(self,player, target_x, target_y,countdown,zeit,color = BLAU): 

     super().__init__(color, width = 20, height = 20) 
     self.target_x = round(target_x) 
     self.target_y = round(target_y) 

     self.countdown = countdown 
     self.zeit = zeit 

     self.player_x = player.rect.left + player.width/2 
     self.player_y = player.rect.top + player.height/2 

     self.set_pos(player.rect.center[0]-self.width/2,player.rect.center[1]-self.height/2) 
     self.truepos = list(self.rect.center) 

     self.setspeed(3) 

    def setspeed(self,factor): 

     self.speed_x = (self.target_x - self.player_x)/100 
     self.speed_y = (self.target_y - self.player_y)/100 




     """self.direction = [0,0] 

     if self.target_x - self.player_x < 0: 
      self.direction[0] = -1 
     elif self.target_x - self.player_x > 0: 
      self.direction[0] = 1 
     if self.target_y - self.player_y > 0: 
      self.direction[1] = 1 
     elif self.target_y - self.player_y < 0: 
      self.direction[1] = -1 

     self.speed_x = self.direction[0]* factor 
     self.speed_y = self.direction[1]* factor 

     print(self.speed_x) 
     print(self.speed_y)""" 

    def move(self): 

     if self.speed_x != 0: 
      self.collision() 
     if self.speed_y != 0: 
      self.collision() 

    def update(self): 

     self.move() 

     if self.countdown > 0: 
      self.countdown -= self.zeit 

     elif self.countdown <= 0: 
      bomblist_list.remove(self) 

    def collision(self): 
     for block in block_list: 
      if block.movable != 1: 
       if self.rect.colliderect(block.rect): 
        self.distance = [abs(block.rect.centerx - (self.truepos[0] + self.speed_x)), abs(block.rect.centery - (self.truepos[1] + self.speed_y))] 
        if self.distance[0] > self.distance[1]: 
         if self.speed_x < 0: 
          self.rect.left = block.rect.right - self.speed_x 
         elif self.speed_x > 0: 
          self.rect.right = block.rect.left -self.speed_x 
         self.speed_x = -self.speed_x 
        elif self.distance[0] < self.distance[1]: 
         if self.speed_y < 0: 
          self.rect.top = block.rect.bottom - self.speed_y 
         elif self.speed_y > 0: 
          self.rect.bottom = block.rect.top - self.speed_y 
         self.speed_y = -self.speed_y 



     self.truepos[0] += self.speed_x 
     self.truepos[1] += self.speed_y 
     self.rect.center = self.truepos 

# -------- Main Program Loop ----------- 
while not done: 
    clock.tick(fps) 
    millisekunde = float(clock.tick(fps)) 
    zeit = millisekunde /500 
    vergangen += zeit 

    # --- Main event loop 
    for event in pygame.event.get(): # User macht irgendwas 

     if event.type == pygame.QUIT: # Wenn der User Quit klickt 
      done = True # Verlässt die Schleife 

     elif event.type == pygame.KEYDOWN: 
      pass 



      #if event.key == pygame.K_UP: 
       #if e 


     elif event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: 
       mx,my = pygame.mouse.get_pos() 
       bomb = Bomb(player,mx,my,3,zeit) 
       bomblist_list.append(bomb) 
       planted = True 

    keys = pygame.key.get_pressed() 

    if keys[pygame.K_RIGHT]: 
      player.move(speedx,0) 
    if keys[pygame.K_LEFT]: 
      player.move(-speedx,0) 
    if keys[pygame.K_DOWN]: 
      player.move(0,speedy) 
    if keys[pygame.K_UP]: 
      player.move(0,-speedy) 

    if planted: 
     for bomb in bomblist_list: 
      bomb.update() 

    screen.fill(SCHWARZ) 

    for block in block_list: 
     block.render(screen) 

    if planted: 
     for bomb in bomblist_list: 
      bomb.render(screen) 

    pygame.draw.rect(screen,red,player.rect) 

    pygame.display.update() 

pygame.quit() 
+2

欢迎来到StackOverflow。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。 “让路太高”和“其他一些奇怪的错误”并不构成问题描述。 – Prune

回答

0

当检查对快速移动的物品碰撞,可以在一帧传递一个对象,你想要做的就是保存它的最后一帧上的位置,并得到它的当前画面什么位置。有了这个,你可以检查它是否应该与最后一帧和当前帧之间的任何内容相冲突。

然后,您可以通过将其放回应该停止的位置并随后绘制该对象来修改其位置。