【问题标题】:Pygame is always sensing collision between two rect objectsPygame 总是感知两个矩形对象之间的碰撞
【发布时间】:2019-04-02 19:20:40
【问题描述】:

我一运行代码,Pygame 就会返回 Bird 和 Pipe 正在碰撞,即使它们显然没有碰撞。

我尝试使用colliderect 函数,并为我正在渲染到屏幕上的每张图片添加了get_rect

代码:

import pygame
from random import randint
pygame.init()

screen = pygame.display.set_mode((500, 750))
gravity = 0


class Pipe(pygame.sprite.Sprite):
    def __init__(self, x_change, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.x_change = x_change
        self.x = x
        self.y = y
        self.pic1 = pygame.image.load('file/path.png')
        self.pic1 = pygame.transform.scale(self.pic1, (28*2, 600*2)).convert_alpha()
        self.pic2 = pygame.image.load('file/path.png')
        self.pic2 = pygame.transform.scale(self.pic2, (28*2, 600*2)).convert_alpha()
        self.rect1 = self.pic1.get_rect()
        self.rect2 = self.pic2.get_rect()

    def collision(self, sprite):
        return self.rect1.colliderect(sprite) or self.rect2.colliderect(sprite)


class Bird(pygame.sprite.Sprite):
    def __init__(self, bird_width, bird_height, y_change, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.pic = pygame.image.load('file/path.png').convert_alpha()
        self.pic = pygame.transform.scale(self.pic, (bird_width, bird_height))
        self.rect = self.pic.get_rect()
        self.bird_width = bird_width
        self.bird_height = bird_height
        self.y_change = y_change
        self.x = x
        self.y = y
        self.velocity = 0
        self.term_velocity = 15


bird = Bird(40, 30, 5, 0, 0)
pipe = Pipe(3, 500, randint(30, 650))

while True:
    if pipe.collision(bird.pic.get_rect()):
        print('collision')
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    gravity += 0.01
    pygame.display.flip()
    pygame.time.Clock().tick(60)

编辑: 按照下面 Hoog 的建议后,两个矩形的位置都是 0、0。我将如何更改 get_rect() 的位置?

【问题讨论】:

  • 如果您没有足够的代码,请告诉我 :) !我不确定我应该投入多少,以免投反对票……如果您需要,我会编辑问题。
  • 肯定有更多的代码,你应该以最小完成问题为目标。我可以复制粘贴到我的机器上并立即收到相同的错误消息。如果您需要超过 50 行代码,那么您应该花时间将代码减少到仅显示您遇到的问题所需的代码。您可以先打印出矩形的位置和大小,以便您可以手动检查这些数字是否对碰撞有意义(这些数字可能与您期望的不完全相符)。
  • 在这种情况下sprite 是什么?
  • 我的猜测是您实际上并没有使用矩形来定位游戏对象,并且两个矩形的位置都是(0, 0)....
  • @Hoog,我改变了我的问题代码......希望这能回答你的问题。附言抱歉回复晚了,我得处理一些事情。 :) 编辑:矩形的 x 和 y 位置毕竟是 0, 0!我稍后会编辑我的问题!

标签: python-3.x pygame sprite collision-detection


【解决方案1】:

我实际上回答了我自己的问题。在我说get_rect() 的地方,rect 的位置是 (0, 0)。多亏了上面的 cmets,我才知道这一点。我需要说: self.rect = self.pic.get_rect(center=(self.x, self.y)) 现在,我已经成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多