繁体   English   中英

我如何知道一个多维数据集与另一个移动的多维数据集碰撞?

[英]How do I know when a cube collide with another moving cube?

我正在尝试创建一个小游戏作为训练,但由于不知道如何碰撞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()

我应该如何检测碰撞?

由于我没有安装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)

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

由于您仅考虑多维数据集,并且如果它们具有相同的大小,则两个多维数据集将“当且仅当”一个多维数据集的一个角位于(包括)另一个平行的两个平行平面之间时占用相同的空间。 在实践中有很多方法可以做到这一点。

我将通过评估从多维数据集1的任意一个角到多维数据集2的某个角的矢量点缀的多维数据集1的向内法向矢量来检查是否之间。 对平行的两面都这样做。 如果两者均为正,则为内部。

对于不同的形状和不同的大小,它稍微复杂一些。

使用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功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM