2015-12-28 28 views
2

我正在尝试创建一个小游戏作为训练,但是我被阻止,因为我不知道如何碰撞2个移动的立方体。我如何知道立方体与另一个正在移动的立方体相碰撞?

游戏很简单,有一个红色的盒子,你可以移动,如果这个盒子碰到一个绿色的立方体,那么你输了。 (绿色立方体总是在移动)

我尝试阅读一些文档,但作为初学者并不容易理解。

下面是代码:

import pygame 
import random 
from threading import Timer 

pygame.init() 

screenWidth = 1100 
screenHeight = 600 

white = (255,255,255) 
red = (255, 0, 0) 
yellow = (50, 250, 20) 

FPS = 60 

gameDisplay = pygame.display.set_mode((screenWidth, screenHeight)) 
pygame.display.set_caption('Tekken') 
pygame.display.update() 

clock = pygame.time.Clock() 
font = pygame.font.SysFont(None, 28) 
class Players: 
    def __init__(self, playerName, playerAttribute, cubeheight, cubewidth, missilesHeight, missilesWidth): 
     self.playerName = playerName 
     self.playerAttribute = playerAttribute 
     self.playerLife = 100 
     self.droite_x = 300 
     self.droite_y = 600 
     self.cubeheight = cubeheight 
     self.cubewidth = cubewidth 
     self.missiles = True 
     self.missilesHeight = missilesHeight 
     self.missilesWidth = missilesWidth 
     self.missiles_droite_x = 0 
     self.missiles_droite_y = round(random.randrange(50, screenHeight-50)) 
     self.missiles_droite_x_inverse = screenWidth-50 
     self.missiles_droite_y_inverse = round(random.randrange(50, screenHeight-50)) 
     self.vitesse_missiles = 10 

     print(self.playerName, self.playerAttribute, self.playerLife) 

    def environment_un(self): 
     gameExit = False 
     gameOver = False 

     droite_x_change = 0 
     droite_y_change = 0 
     missiles_droite_x_change = 0 
     missiles_droite_x_change_inverse = 0 

     while not gameExit: 

      while gameOver: 
       gameDisplay.fill(red) 
       screen_text = font.render("Game Over, do you want to play again? [Q] to quit", True, white) 
       gameDisplay.blit(screen_text, [100, 300]) 
       pygame.display.update() 

       for event in pygame.event.get(): 
        if event.type == pygame.KEYDOWN: 

         if event.key == pygame.K_q: 
          gameOver = False 
          gameExit = True 
          break 

        if event.type == pygame.QUIT: 
         gameOver = False 
         gameExit = True 
         break 

      for event in pygame.event.get(): #va chercher les events 
       if event.type == pygame.QUIT: #Si j'appuie sur X 
        gameExit = True 

       if event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_LEFT: 
         droite_x_change = -3 

        if event.key == pygame.K_RIGHT: 
         droite_x_change = +3 

        if event.key == pygame.K_UP: 
         droite_y_change = -3 

        if event.key == pygame.K_DOWN: 
         droite_y_change = +3 

        if event.key == pygame.K_SPACE: 
         missiles_droite_x_change = self.vitesse_missiles 
         missiles_droite_x_change_inverse = -self.vitesse_missiles 

       if event.type == pygame.KEYUP: 
        if event.key == pygame.K_LEFT: 
         droite_x_change = 0 

        if event.key == pygame.K_RIGHT: 
         droite_x_change = 0 

        if event.key == pygame.K_UP: 
         droite_y_change = 0 

        if event.key == pygame.K_DOWN: 
         droite_y_change = 0 


      self.missiles_droite_x_inverse += missiles_droite_x_change_inverse 
      self.missiles_droite_x += missiles_droite_x_change 
      self.droite_x += droite_x_change 
      self.droite_y += droite_y_change 

      if self.droite_y + self.cubeheight <= 0: 
       self.droite_y = 0 
      elif self.droite_y + self.cubeheight >= screenHeight: 
       self.droite_y = screenHeight-self.cubeheight 
      elif self.droite_x + self.cubewidth <= 0: 
       self.droite_x = 0 
      elif self.droite_x + self.cubewidth >= screenWidth: 
       self.droite_x = screenWidth-self.cubewidth 



      gameDisplay.fill(white) 
      gameDisplay.fill(red, rect=[self.droite_x, self.droite_y, self.cubewidth, self.cubeheight]) 
      gameDisplay.fill(yellow, rect=[self.missiles_droite_x, self.missiles_droite_y, self.missilesWidth, self.missilesHeight]) 
      gameDisplay.fill(yellow, rect=[self.missiles_droite_x_inverse, self.missiles_droite_y_inverse, self.missilesWidth, self.missilesHeight]) 
      pygame.display.update() 

      if self.missiles_droite_x + self.missilesWidth >= screenWidth: 
       missiles_droite_x_change = 0 
       if missiles_droite_x_change == 0: 
        self.missiles_droite_x = 0 
        self.missiles_droite_y = round(random.randrange(50, screenHeight-50)) 
        missiles_droite_x_change = self.vitesse_missiles 

      if self.missiles_droite_x_inverse <= 0: 
       missiles_droite_x_change_inverse = 0 
       if missiles_droite_x_change >= 0: 
        self.missiles_droite_x_inverse = screenWidth-50 
        self.missiles_droite_y_inverse = round(random.randrange(50, screenHeight-50)) 
        missiles_droite_x_change_inverse = -12 

      clock.tick(FPS) 
     pygame.quit() 

Player_1 = Players('John', 'sometext', 50, 50, 100, 100) 
Player_1.environment_un() 

我应该做的我,以检测碰撞?

+0

_tried阅读一些documentations_ < - 哪些文件准确?列出你尝试过的将有助于未来的海报获得有关这个主题的更多信息 – Caridorc

+1

[立方体碰撞检测算法?]可能的重复?(http://stackoverflow.com/questions/3631437/cube-on-cube-collision-detection -algorithm) – LondonRob

回答

3

我目前无法运行你的代码,因为我没有安装pygame。但是,如果您声明对象在其类中具有pygame.sprite.Sprite对象或从该类继承(如下所示),则可以使用pygame.sprite.collide_rect()。下面的代码可能会注意工作,因为我无法测试它,但它应该接近正在运行的代码片段。在这种情况下,你想测试一个精灵与多个其他精灵的碰撞 - 请考虑查看pygame.sprite.Group()。我相信,这样的事情应该工作:

class SpriteObject(pygame.sprite.Sprite): 
    def __init__(self,pos_x, pos_y): 
     pygame.sprite.Sprite.__init__(self) 
     self.rect = self.original.get_rect() 
     self.rect.center = (pos_x, pos_y) 

class Players: 
    def __init__(self, playerName, playerAttribute, cubeheight, cubewidth, missilesHeight, missilesWidth): 
     sprite1 = SpriteObject(1,2) 
     sprite2 = SpriteObject(1,2) 
     sprite1.rect.collide_rect(sprite2) 
2

如果你正在寻找一个概念性的答案:

既然你只考虑立方体,如果它们是相同的大小,两个立方体将占据相同的空间“当且仅当”一个立方体的角落在另一个的(包含的)两个平行平面之间。在实践中有很多方法可以做到这一点。

我会检查是否通过评估从立方体1的任何角落(立方体2)的角落点缀有矢量的立方体1的向内法向量。对于两个平行的边都这样做。如果两者都是积极的,它的内部。

对于不同的形状和不同的尺寸稍微复杂一些。

+0

是的,它的大小不同。 – Lindow

+0

检查第二个立方体中两个拐角之间的直线和整个外壳是否满足其余冲突的可能性。如果fps和相对速度之间的比率足够低,则可以忽略外壳。我会抽样检查两个角落之间的线。 –

-2

使用pygame.Rect()保持立方体的位置和大小 - 然后你可以使用pygame.Rect.colliderect()两个立方体之间的碰撞检查。

cube1 = pygame.Rect((x1, y1), (width, height)) 
cube2 = pygame.Rect((x2, y2), (width, height)) 

if cube1.colliderect(cube2): 
    print("Collision !") 

pygame的具有其他有用的类 - pygame.sprite.Spritepygame.sprite.Group - 它们使用Rectcollision detection功能。

+0

立方体和矩形之间有区别:https://en.wikipedia.org/wiki/Dimension – LittleByBlue

+0

@LittleByBlue OP称它为“立方体”,但他的对象是二维矩形 - 请参阅他的代码。 – furas

+0

好的,对不起,错过了。 – LittleByBlue