Pygame中某一精灵组无法更新,其余精灵组正常工作的问题求助
Pygame中某一精灵组无法更新,其余精灵组正常工作的问题求助
大家好,我正在开发一款横版太空射击游戏,目前大部分精灵组(玩家、玩家武器、推进器等)都能通过spriteGroup.update()正常更新,但新做的Drone精灵所在的drones组却完全无法触发更新,试了各种办法都没效果,实在搞不懂哪里出问题了,想请大家帮忙看看。
问题详情
- 我通过按键
K_0生成Drone,它会正常出现在指定位置,但之后完全静止不动 - 我在Drone类的
update()方法里加了print("drone update")测试,但终端完全没输出,说明这个方法根本没被调用 - 尝试过的更新方式:
- 把
drones.update()放到玩家控制逻辑里执行 - 将它加入UpdateManager,和其他正常工作的精灵组update放在一起执行
- 专门做了一个按键
K_9,按下时强制调用drones.update(),但依然没反应
- 把
- Drone类的结构和我其他能正常工作的精灵几乎完全一致,所以我怀疑问题出在精灵组的使用上,但实在找不到哪里出错了
相关代码片段
玩家类与精灵组定义
player_weapons = pg.sprite.Group() drones = pg.sprite.Group() class Player(pg.sprite.Sprite): def __init__(self): super(Player, self).__init__() # ... 玩家初始化代码 ... self.droneCount = 0 def update(self, pressed_keys): # ... 玩家移动、开火等控制逻辑 ... # DEV CONTROLS (REMOVE ON RELEASE) # 生成无人机 if pressed_keys[K_0]: if player.droneCount < 1: new_drone = Drone() drones.add(new_drone) all_sprites.add(new_drone) player.droneCount += 1 # 强制更新无人机 if pressed_keys[K_9]: drones.update() # 该尝试无效 # ... 玩家边界限制逻辑 ... player = Player()
Drone类定义
class Drone(pg.sprite.Sprite): def __init__(self): super(Drone, self).__init__() self.div = 52 self.x = 0 self.sheet = SpriteSheet(os.path.join("gfx", "ares", "drone", "DroneSheet.png")) self.sheetArray = [] self.sheet_W = self.sheet.sheet.get_rect().width while self.x < self.sheet_W: self.sheetArray.append(self.sheet.image_at(pg.Rect(self.x, 0, self.div, self.div))) self.x += self.div self.image = self.sheetArray[0] self.rect = self.image.get_rect() self.frameRate = 3 self.counter = 0 self.built = False self.lastPosition = [] self.droneNumber = player.droneCount self.droneList = drones.sprites() # 根据无人机编号设置初始位置 if self.droneNumber == 0: for x in range(0, 10): self.lastPosition.append([player.rect.centerx, player.rect.centery]) self.rect = self.image.get_rect(center=(self.lastPosition[0][0], self.lastPosition[0][1])) # ... 其他编号无人机的位置设置逻辑 ... def update(self): print("drone update") # 测试输出,从未触发 rate = self.frameRate arr = self.sheetArray # 无人机生成动画逻辑 if self.built == False: if self.counter == rate * 0: self.image = arr[0] sound.playSound(sound.pBoost, 0.3, 1) if self.counter == rate * 1: self.image = arr[1] # ... 其他帧的切换逻辑 ... if self.counter == rate * 7: self.built = True self.counter+=1 # 无人机跟随逻辑 self.droneList = drones.sprites() self.lastPosition.pop(0) if self.droneNumber == 0: self.lastPosition.append([player.rect.centerx, player.rect.centery]) # ... 其他编号无人机的跟随逻辑 ... self.rect = self.image.get_rect(center=(self.lastPosition[0][0], self.lastPosition[0][1]))
更新管理器类
class UpdateManager(): def __init__(self): super(UpdateManager, self).__init__() self.ticks = 0 self.seconds = 0 def update(self, pressed_keys): self.ticks += 1 if self.ticks % 60 == 0: self.seconds += 1 print(self.seconds) # 标题屏逻辑 if game.STATE == "title": # ... 标题屏相关逻辑 ... # 主游戏逻辑 elif game.STATE == "active": if player.alive == False: all_sprites.add(playerThrust) all_sprites.add(player) player.alive = True # 尝试遍历无人机组手动调用update for drone in drones: drone.update() print(drone) # 能打印出drone对象,但update内的print无输出 bg.update() player.update(pressed_keys) playerThrust.update() enemies.update() pickups.update() player_weapons.update() enemy_weapons.update() drones.update() # 尝试调用组更新,无效 # ... 暂停菜单逻辑 ... # 绘制所有精灵 for item in all_sprites: SCREEN.blit(item.image, item.rect) # ... 其他绘制逻辑 ... updater = UpdateManager()
主程序循环
from display import * from player import * from enemies import * from pickups import * from logic import * from sound import * import pygame as pg from pygame.locals import * pg.init() ADDENEMY = pg.USEREVENT + 1 pg.time.set_timer(ADDENEMY, 250) clock = pg.time.Clock() while game.RUNNING == True: SCREEN.fill((0,0,0)) pressed_keys = pg.key.get_pressed() for event in pg.event.get(): if event.type == pg.KEYDOWN: if event.key == K_ESCAPE: if game.STATE == "active": game.STATE = "paused" pg.mixer.music.pause() sound.playSound(sound.pause, 0.3, 0) elif game.STATE == "paused": game.STATE = "active" pg.mixer.music.unpause() # ... 其他事件处理逻辑 ... if event.type == pg.QUIT: game.STATE.RUNNING = False updater.update(pressed_keys) if pg.sprite.spritecollideany(player, enemies): player.kill() pg.display.flip() clock.tick(60) pg.quit()
我已经排查的点
- 对比了Drone类和其他正常工作的精灵类(比如PlayerBullet),结构几乎一致,都是继承
pg.sprite.Sprite且初始化时调用了super() - 生成Drone时确实把它加到了
drones组和all_sprites组里,能正常显示在屏幕上 - 按键
K_9的其他逻辑(如果添加)能正常执行,但drones.update()就是没反应 - 在UpdateManager里遍历
drones组调用drone.update(),能打印出drone对象,但drone自己的update方法内的print始终不输出
实在想不通哪里出问题了,有没有大佬能帮我看看?
备注:内容来源于stack exchange,提问作者Dan Brown
相关产品推荐
相关产品推荐

