You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

我已经排查的点

  1. 对比了Drone类和其他正常工作的精灵类(比如PlayerBullet),结构几乎一致,都是继承pg.sprite.Sprite且初始化时调用了super()
  2. 生成Drone时确实把它加到了drones组和all_sprites组里,能正常显示在屏幕上
  3. 按键K_9的其他逻辑(如果添加)能正常执行,但drones.update()就是没反应
  4. 在UpdateManager里遍历drones组调用drone.update(),能打印出drone对象,但drone自己的update方法内的print始终不输出

实在想不通哪里出问题了,有没有大佬能帮我看看?

备注:内容来源于stack exchange,提问作者Dan Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:09:36