如何使pygame冲突起作用

时间:2017-12-23 19:58:00

标签: python pygame

我正在制作一个飞扬的鸟类复制品,但我无法获得碰撞机制。目前我正在尝试使用randomMessage,但我并非100%确定如何使用.coliderect()。这是两个班级。我喜欢程序要做某事,或者当鸟和管道发生碰撞时只是print('x'),但是当它们在程序不执行或输出任何内容时碰撞时。

import pygame

vec = pygame.math.Vector2
BLACK = (0,0,0)
WIDTH = 500
HEIGHT = 400

pygame.init()
window = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Flappy Bird')
clock = pygame.time.Clock()

class Bird():

    def __init__(self):

        self.skin = pygame.image.load('bird2.png')
        self.rect = self.skin.get_rect()
        self.rect.center = (WIDTH / 2, HEIGHT / 2)

        self.vx = 0
        self.vy = 0

        self.pos = vec(WIDTH / 2, HEIGHT / 2)
        self.vel = vec(0, 0)
        self.acc = vec(0, 0)

    def update(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        window.fill(BLACK)
        self.acc = vec(0, 0.7) #having 0.5 adds gravity
        self.vy = 0

        keys = pygame.key.get_pressed()

        if keys[pygame.K_SPACE]:
            self.vel.y = -7

        if keys[pygame.K_LEFT]:
            self.acc.x = -0.5  #change to y to add vertical motion

        if keys[pygame.K_RIGHT]:
            self.acc.x = 0.5   #change to y to add vertical motion

        #applys friction
        self.acc.x += self.vel.x * -0.08 #FRICTION
        #motion equations
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc

        self.rect.center = self.pos

        window.blit(self.skin, self.pos)


class Pipe():

    def __init__(self,x,y):
        self.image = pygame.Surface((50,60))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.pos = vec(x,y)

    def blit_pipe(self):
        window.blit(self.image, self.pos)

def border_check():
    if (flappy.pos.y)+32 > HEIGHT: #this is the very top of the flappy
        print("You are under\n")
        pygame.quit()
        quit()

    if flappy.pos.y < 0:
        print("You are over\n") #this is the very top of the flappy
        pygame.quit()
        quit()


pipey = Pipe(300,200)
pipey.blit_pipe()

pipey2 = Pipe(100,200)
pipey2.blit_pipe()

flappy = Bird()

window.blit(flappy.skin, flappy.pos)


while True:

    border_check()
    flappy.update()
    pipey.blit_pipe()
    pipey2.blit_pipe()

    if flappy.rect.colliderect(pipey.rect):
        print('x')

    clock.tick(30)
    pygame.display.update()

1 个答案:

答案 0 :(得分:1)

您永远不会设置rect个实例Pipe的位置,因此它们仍位于默认坐标(0, 0)。有几种方法可以设置坐标,例如,您可以将坐标作为topleft参数传递给get_rect

self.rect = self.image.get_rect(topleft=(x, y))

如果碰撞检测出现问题,请打印rects以查看实际位置。