Pygame实现无限滚动云朵效果时程序运行报错该如何解决?
问题修复方案
错误原因
你代码里的变量cloud是Cloud类的单个实例对象,不是pygame.sprite.Group精灵组类型:
- Pygame中单个
Sprite子类实例的add()方法作用是把自身添加到传入的精灵组中,要求参数是可迭代的精灵组对象 - 你往这个方法里传入了另一个
Cloud实例,不符合参数要求,所以触发类型错误
修复方法
直接删除事件处理里多余的cloud.add(new_cloud)这行代码即可,你已经把新建的云朵实例加到all_sprites全局精灵组里,后续调用all_sprites.update()和all_sprites.draw()就可以正常更新、渲染所有云朵了。
修改后的事件处理代码段如下:
elif event.type == ADDCLOUD: new_cloud = Cloud() all_sprites.add(new_cloud)
可选优化建议
如果后续需要单独管理所有云朵实例(比如做碰撞检测、单独调整速度),可以单独创建一个云朵精灵组:
# 全局初始化部分添加 cloud_group = pygame.sprite.Group() # 初始化第一个云朵时同时加到两个组 cloud = Cloud() all_sprites.add(player, cloud) cloud_group.add(cloud) # 事件处理部分新云朵也同时加到两个组 elif event.type == ADDCLOUD: new_cloud = Cloud() all_sprites.add(new_cloud) cloud_group.add(new_cloud)
另外你当前的云朵复位逻辑是滚出屏幕后直接放到最右边界,你可以在复位时重新随机Y轴位置,效果更自然:
def update(self): self.rect.move_ip(-2, 0) if self.rect.right <= 0: self.rect.left = screen.get_width() # 新增:复位时重新随机高度 self.rect.centery = random.randint(HEIGHT - 550, HEIGHT)
内容的提问来源于stack exchange,提问作者Вильдан Латыпов
相关产品推荐
相关产品推荐

