Pygame 玩家碰撞

时间:2021-08-01 03:35:18

标签: pygame collision-detection

我正在尝试创建一个游戏,如果玩家与敌人发生碰撞,玩家就会失败。但是现在我试图通过将 rect 绘制为碰撞框来使玩家与敌人发生碰撞,但是由于我对代码的了解有限,我被困在如何检查它们是否接触上。如果有比使用矩形更好的方法,那么我想知道,因为圆形上的矩形碰撞盒不是世界上最棒的东西。

我试过 if Player == Enemy: 看看它是否有效,但它没有。

这是我的代码。

    """Dot Game"""

#Imports
import pygame, sys

#Constants
WIDTH, HEIGHT = 900, 900
TITLE = "Dot."

#pygame initialization
pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(TITLE)
#fps
FPS = 60
fpsclock = pygame.time.Clock()

#colors
bgc = (247, 226, 222)
pc = (152, 193, 217)
pc2 = (61, 90, 128) #dark
ec = (119, 2, 26) #dark
ec2 = (220, 66, 73)

#accel
x_change = 0
y_change = 0
accel_x = 0
accel_y = 0
max_speed = 10

display_width, display_height = pygame.display.get_surface().get_size()
x = display_width * 0.45
y = display_height * 0.8

#Player Class
class Player:
    def __init__(self, x, y):
        self.x = int(x)
        self.y = int(y)
        self.radius = 32
        self.width = 2
        self.color = pc
        self.color2 = pc2
        self.velX = 0
        self.velY = 0
        self.left_pressed = False
        self.right_pressed = False
        self.up_pressed = False
        self.down_pressed = False
        self.a_pressed = False
        self.d_pressed = False
        self.w_pressed = False
        self.s_pressed = False
        self.hitbox = (self.x -20, self.y -20, 40, 40)




        self.acceleration = 0.4
        self.friction = 0.92 # = 1  is no friction
    
    def draw(self, win):
        pygame.draw.circle(win, self.color2, (self.x,self.y), 20)
        pygame.draw.circle(win, self.color, (self.x,self.y), 14)
        self.hitbox = (self.x -20, self.y -20, 40, 40)
        pygame.draw.rect(win, ec2, self.hitbox, 2)


    def update(self):
        if self.left_pressed:
            if self.velX > -max_speed:
                self.velX -= self.acceleration
        if self.right_pressed:
            if self.velX < max_speed:
                self.velX += self.acceleration
        if self.up_pressed:
            if self.velY > -max_speed:
                self.velY -= self.acceleration
        if self.down_pressed :
            if self.velY < max_speed:
                self.velY += self.acceleration
        
        self.x += self.velX
        self.y += self.velY
        self.velX *= self.friction
        self.velY *= self.friction

        

    def collide(self):
        print('hit')
        pass

class Enemy:
    def __init__(self, x, y):
        self.x = int(x)
        self.y = int(y)
        self.radius = 32
        self.color = ec
        self.color2 = ec2
        self.vel = 3
        self.hitbox = (self.x -20, self.y -20, 40, 40)
        self.points = [(self.x -10, self.y +14), (self.x, self.y -6), (self.x +10, self.y +14)]
        self.points2 = [(self.x -20, self.y +20), (self.x, self.y -20), (self.x +20, self.y +20)] # L U R

    def draw(self, win):
        pygame.draw.polygon(win, self.color, self.points2)
        pygame.draw.polygon(win, self.color2, self.points)
        self.hitbox = (self.x -20, self.y -20, 40, 40)
        #pygame.draw.rect(win, ec2, self.hitbox, 2)
    def update(self):
        pass





#Player Initialization
player = Player(WIDTH/2, HEIGHT/2)
enemy = Enemy(WIDTH/2, HEIGHT/2)

#Main Loop
collide = False
while not collide:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            collide == True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.left_pressed = True
            elif event.key == pygame.K_a:
                player.left_pressed = True
            elif event.key == pygame.K_RIGHT:
                player.right_pressed = True
            elif event.key == pygame.K_d:
                player.right_pressed = True
            elif event.key == pygame.K_UP:
                player.up_pressed = True
            elif event.key == pygame.K_w:
                player.up_pressed = True
            elif event.key == pygame.K_DOWN:
                player.down_pressed = True
            elif event.key == pygame.K_s:
                player.down_pressed = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player.left_pressed = False
            elif event.key == pygame.K_a:
                player.left_pressed = False
            elif event.key == pygame.K_RIGHT:
                player.right_pressed = False
            elif event.key == pygame.K_d:
                player.right_pressed = False
            elif event.key == pygame.K_UP:
                player.up_pressed = False
            elif event.key == pygame.K_w:
                player.up_pressed = False
            elif event.key == pygame.K_DOWN:
                player.down_pressed = False
            elif event.key == pygame.K_s:
                player.down_pressed = False
    
    x_change += accel_x  # Accelerate.
    if abs(x_change) >= max_speed:  # If max_speed is exceeded.
        # Normalize the x_change and multiply it with the max_speed.
        x_change = x_change/abs(x_change) * max_speed

    y_change += accel_y  # Accelerate.
    if abs(y_change) >= max_speed:  # If max_speed is exceeded.
        # Normalize the x_change and multiply it with the max_speed.
        y_change = y_change/abs(y_change) * max_speed

    #Draw
    win.fill((bgc))  
    player.draw(win)
    enemy.draw(win)


    #update
    enemy.update
    player.update()
    pygame.display.update()

    fpsclock.tick(FPS)

0 个答案:

没有答案