Python中Player与Obstacle类间矩形位置同步问题求助
问题根源
你在Obstacle类里新建了一个独立的Player实例,这个对象和你实际通过键盘控制的Player是完全分开的两个个体,它的rect.x自然不会跟着你操作的角色更新,导致判断永远触发不了。
解决方法
1. 直接传入实际Player实例
不要在Obstacle内部创建新Player,而是在初始化Obstacle时,把你正在控制的那个Player对象传进去并保存,之后直接用这个保存的实例获取最新位置:
import pygame class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((50,50)) self.image.fill((255,0,0)) self.rect = self.image.get_rect(x=100, y=100) def update(self): keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: self.rect.x -= 5 if keys[pygame.K_RIGHT]: self.rect.x += 5 class Obstacle(pygame.sprite.Sprite): def __init__(self, player): super().__init__() self.player = player # 保存外部传入的实际Player实例 self.image = pygame.Surface((50,50)) self.image.fill((0,255,0)) self.rect = self.image.get_rect(x=300, y=100) def test(self): # 使用保存的player实例获取最新rect.x if self.player.rect.x == self.rect.x: print("test") # 主程序逻辑 pygame.init() screen = pygame.display.set_mode((800,600)) clock = pygame.time.Clock() player = Player() obstacle = Obstacle(player) # 创建Obstacle时传入实际Player all_sprites = pygame.sprite.Group(player, obstacle) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False all_sprites.update() obstacle.test() # 调用检测方法 screen.fill((0,0,0)) all_sprites.draw(screen) pygame.display.flip() clock.tick(60) pygame.quit()
2. 通过精灵组获取Player(适合多精灵场景)
如果你用pygame.sprite.Group管理所有精灵,可以在Obstacle的检测方法里从组中筛选出Player实例:
class Obstacle(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((50,50)) self.image.fill((0,255,0)) self.rect = self.image.get_rect(x=300, y=100) def test(self, sprite_group): # 从精灵组中找到Player实例 player = next(s for s in sprite_group if isinstance(s, Player)) if player.rect.x == self.rect.x: print("test") # 主程序调用时传入精灵组 obstacle.test(all_sprites)
额外提醒:避免精确相等判断
角色移动通常是逐帧增减像素,很容易错过rect.x完全相等的瞬间,建议改用范围判断:
if abs(self.player.rect.x - self.rect.x) < 5: print("test")
内容的提问来源于stack exchange,提问作者Captain_Wiz08
相关产品推荐
相关产品推荐

