我怎么知道一个立方体和另一个移动的立方体相撞?

2024-09-29 17:09:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个小游戏作为训练,但我被阻止了,因为我不知道如何才能碰撞两个移动立方体。在

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

我试着看一些文件,但作为一个初学者并不容易理解。在

代码如下:

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()

我该怎么做才能检测到碰撞?在


Tags: keyselfeventifchangepygameinversegamedisplay
3条回答

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

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

我将通过计算立方体1的向内法向量来检查是否介于两者之间,其中有一个向量从立方体1的任何一个角点到(立方体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,它们使用Rect和{}函数。在

我现在不能运行你的代码,因为我没有安装pygame。但是,您可以使用游戏精灵碰撞()如果您声明对象的类中有游戏精灵精灵精灵-对象或继承自该类(如下所示)。下面的代码可能会注意到工作,因为我无法测试它,但它应该接近一个正常运行的代码片段。如果你想测试一个精灵与多个其他精灵的碰撞-考虑看看游戏精灵组(). 我相信这样的事情应该行得通:

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)

相关问题 更多 >

    热门问题