pygame.colliderect返回True,尽管彼此未接触

2024-07-05 11:58:02 发布

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

我在修补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)

Tags: selftruegetifinitscreenpygamerunning
1条回答
网友
1楼 · 发布于 2024-07-05 11:58:02

A^{}没有位置。因此^{}返回的^{}对象的位置是(0,0)。
注意:当曲面为^{}时,必须指定位置

从曲面获取矩形时,通过关键字参数指定位置。 在主应用程序循环之前创建对象的实例(请参见Instance Objects),并将它们添加到^{}。每个^{}应该具有组的方法^{}使用的属性.rect.image
使用全局变量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)

相关问题 更多 >