【问题标题】:pygame.colliderect returning True despite not touching each other [duplicate]尽管没有相互接触,pygame.colliderect仍返回True [重复]
【发布时间】:2020-05-24 16:27:41
【问题描述】:

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

【问题讨论】:

    标签: python pygame collision-detection collision


    【解决方案1】:

    pygame.Surface 没有位置。因此get_rect()返回的pygame.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)
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2020-09-19
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多