pygame.colliderect返回True,尽管彼此没有碰触

时间:2020-05-24 16:27:41

标签: python pygame collision-detection collision

我正在修补PyGame,阅读文章,然后发现了这种奇怪的现象。由于某些原因,当两个精灵没有接触时,pygame.colliderect返回True

import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
running = True
spriteX = 100
spriteY = 100
spriteVY = 3
clock = pygame.time.Clock()
class Sprite(pygame.sprite.Sprite):
    def __init__(self):
        super(Sprite, self).__init__()
        self.vel = (0, 0)
        self.surf = pygame.Surface((100, 200))
        self.surf.fill((255, 255, 255))
        self.rectangle = self.surf.get_rect()
class Platform(pygame.sprite.Sprite):
    def __init__(self):
        super(Platform, self).__init__()
        self.surf = pygame.Surface((200, 10))
        self.surf.fill((142, 212, 25))
        self.rectangle = self.surf.get_rect()
on_ground = True
while running:
    platform_group = pygame.sprite.Group()
    platform_group.add(Platform())
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    if pygame.key.get_pressed()[pygame.K_SPACE]: spriteY -= 10
    if pygame.key.get_pressed()[pygame.K_d]: spriteX += 10
    if pygame.key.get_pressed()[pygame.K_a]: spriteX -= 10
    print((Platform().rectangle.colliderect(Sprite().rectangle)))
    screen.fill((0, 0, 0))
    if spriteX >= 300:
        spriteX = 300
    if spriteX <= 0:
        spriteX = 0
    if not on_ground:
        spriteY += spriteVY
        spriteVY -= 3
    screen.blit(Sprite().surf, ((spriteX, spriteY)))
    screen.blit(Platform().surf, ((50, 20)))
    pygame.display.flip()
    clock.tick(24)

1 个答案:

答案 0 :(得分:0)

pygame.Surface没有位置。因此,pygame.Rect返回的get_rect()对象的位置为(0,0)。
请注意,必须在Surface为blit()时指定位置。

从表面获取矩形时,通过关键字参数指定位置。 在主应用程序循环之前创建对象的实例(请参见Instance Objects)并将其添加到pygame.sprite.Group。每个pygame.sprite.Sprite应具有属性.rect.image,该属性由组的方法draw()使用。
掌握全局变量spriteXspriteY并使用精灵的.rect属性。

例如:

import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
running = True
spriteVY = 3
clock = pygame.time.Clock()

class MySprite(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.vel = (0, 0)
        self.image = pygame.Surface((100, 200))
        self.image.fill((255, 255, 255))
        self.rect = self.image.get_rect(topleft = (x, y))

class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((200, 10))
        self.image.fill((142, 212, 25))
        self.rect = self.image.get_rect(topleft = (x, y))

sprite = MySprite(100, 100)
platform = Platform(50, 20)
group = pygame.sprite.Group([sprite, platform])

on_ground = True
while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if pygame.key.get_pressed()[pygame.K_SPACE]: sprite.rect.y -= 10
    if pygame.key.get_pressed()[pygame.K_d]: sprite.rect.x += 10
    if pygame.key.get_pressed()[pygame.K_a]: sprite.rect.x -= 10

    if platform.rect.colliderect(sprite.rect):
        print("hit")

    if sprite.rect.x >= 300:
        sprite.rect.x = 300
    if sprite.rect.x <= 0:
        sprite.rect.x = 0
    if not on_ground:
        sprite.rect.y += spriteVY
        spriteVY -= 3

    screen.fill((0, 0, 0))
    group.draw(screen)
    pygame.display.flip()
    clock.tick(24)
相关问题