Arcade框架游戏内屏幕分数不更新问题排查
Arcade赛车游戏「Гонки」分数不更新问题修复
你开发的赛车游戏中,设定障碍物Wall移动至y坐标0以下时分数应递增,但实际分数始终显示0,核心问题出在代码的重复定义方法与分数更新逻辑未执行上。
问题根源
- 重复覆盖
update方法:在MyGame类中你定义了两个同名的update方法,Python会以后定义的方法覆盖前一个,导致第一个update里self.score = self.wall.update()这行关键的分数更新代码完全无法运行,self.score一直停留在初始化的0值。 - 分数维护逻辑不合理:将分数放在
Wall类实例中维护不符合游戏逻辑,全局分数应该由主游戏类MyGame统一管理。
修复方案
- 合并重复的
update方法,将分数更新与碰撞检测逻辑整合到同一个方法中。 - 调整
Wall类的update逻辑,让其返回布尔值标识是否需要加分,由主游戏类维护全局分数。
修复后的完整代码
import random import arcade SCREEN_WIDTH = 960 SCREEN_HEIGHT = 720 SCREEN_TITLE = "Гонки" CAR_ANGLE = 20 CAR_SPEED = 5 WALL_SPEED = 5 class Car(arcade.Sprite): def update(self): self.center_x += self.change_x class Wall(arcade.Sprite): def update(self): self.center_y -= self.change_y # 障碍物移出屏幕下方时重置位置,返回True表示需要加分 if self.top < 0: self.bottom = SCREEN_HEIGHT + random.randint(0, SCREEN_HEIGHT) self.center_x = random.randint(168, SCREEN_WIDTH - 168) return True return False class MyGame(arcade.Window): def __init__(self, width, height, title): super().__init__(width, height, title) self.bg = arcade.load_texture('bg.png') self.car = Car("yellow_car.png", 0.8) self.car.center_x = SCREEN_WIDTH / 2 self.car.center_y = 100 self.score = 0 # 主游戏类维护全局分数 self.wall = Wall('wall.png', 0.8) self.wall.center_y = SCREEN_HEIGHT self.wall.center_x = random.randint(168, SCREEN_WIDTH - 168) self.wall.change_y = WALL_SPEED self.game = True def update(self, delta_time: float): if self.game: self.car.update() # 根据Wall的update返回值判断是否加分 if self.wall.update(): self.score += 1 # 碰撞检测逻辑 if arcade.check_for_collision(self.car, self.wall): self.game = False def on_draw(self): self.clear() arcade.draw_texture_rectangle(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, SCREEN_WIDTH, SCREEN_HEIGHT, self.bg) self.car.draw() self.wall.draw() if self.game: arcade.draw_text(f"你的分数: {self.score}", 10, 10, arcade.color.AFRICAN_VIOLET, font_size=26) else: arcade.draw_text("碰撞!", SCREEN_WIDTH / 2 - 150, SCREEN_HEIGHT / 2, arcade.color.CYAN, font_size=60) if self.score == 10: arcade.draw_text("胜利!", SCREEN_WIDTH / 2 - 150, SCREEN_HEIGHT / 2, arcade.color.GOLD, font_size=60) def on_key_press(self, symbol: int, modifiers: int): if self.game: if symbol == arcade.key.LEFT: self.car.change_x = -CAR_SPEED self.car.angle = CAR_ANGLE if symbol == arcade.key.RIGHT: self.car.change_x = CAR_SPEED self.car.angle = -CAR_ANGLE def on_key_release(self, symbol: int, modifiers: int): if symbol == arcade.key.LEFT: self.car.change_x = 0 self.car.angle = 0 if symbol == arcade.key.RIGHT: self.car.change_x = 0 self.car.angle = 0 window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) arcade.run()
关键修改说明
- 删除了
MyGame类中重复的update方法,将分数更新与碰撞检测逻辑合并,确保分数更新代码能被执行。 - 重构
Wall类的update方法,不再维护自身的score属性,改为返回布尔值通知主游戏类是否需要加分,逻辑更清晰。 - 调整了分数显示文本为中文,适配游戏的俄语风格(如需英文可改回原文本)。
内容的提问来源于stack exchange,提问作者MaximeDaydream
相关产品推荐
相关产品推荐

