Pygame按下上键触发跳跃时报float对象不可下标错误如何解决?
错误原因
报错TypeError: 'float' object is not subscriptable是因为你定义的MeltingSnowman.update方法期望接收的参数是键盘输入状态数组,但你在main函数里调用all_sprites.update(mt)时,传入的是时间差mt(float类型),导致update方法内尝试用[]下标读取float类型的值触发了报错。
修复步骤
- 第一步:在main函数的while循环内,调用精灵组update之前,先获取键盘输入状态
# 放在mt = clock.tick(100) / 1000 之后即可 userInput = pygame.key.get_pressed()
- 第二步:修改
all_sprites.update的传参,同时传入键盘输入和时间差两个参数
all_sprites.update(userInput, mt)
- 第三步:修改
MeltingSnowman.update方法的参数列表,兼容两个传入参数,同时在update内调用run方法处理动画逻辑
def update(self, userInput, mt): if self.SM_jump: self.jump() if self.walk_index >= 10: self.walk_index = 0 if userInput[pygame.K_UP] and not self.SM_jump: self.SM_jump = True elif userInput[pygame.K_DOWN] and not self.SM_jump: self.SM_jump = False elif not (self.SM_jump or userInput[pygame.K_DOWN]): self.SM_jump = False # 新增调用run方法处理动画切换 self.run(mt)
- 第四步:删除jump方法中无意义的类属性修改代码,你已经通过
self.rect.y控制角色位置,直接删除以下两行即可,避免位置逻辑冲突
MeltingSnowman.SnowMan_Y = 100 MeltingSnowman.SnowMan_Y = 400
- 第五步:调整画面绘制顺序,先画背景再画精灵,避免背景盖住角色,将main函数内的背景绘制代码挪到
all_sprites.draw之前:
# 先绘制背景 Background(BG01, BG01_x, 0) Background(BG02, BG02_x, 0) # 再绘制精灵 all_sprites.draw(SCREEN) pygame.display.update()
内容的提问来源于stack exchange,提问作者LR429
相关产品推荐
相关产品推荐

