Pygame角色按住加速、松开减速功能无法生效问题求助
问题根源
- 两套移动逻辑并行:你全局计算的加减速结果仅更新了全局
x、y变量,但实际渲染角色用的是Player类内部的self.x、self.y,这部分坐标走的是固定速度更新逻辑,完全没用到加减速计算结果,所以效果不生效。 - 按键抬起逻辑错误:任意按键抬起时都会同时清空x和y方向的加速度,多方向按键同时按下时,松开其中一个会打断另一个方向的加速流程。
- 退出逻辑错误:
collide == True是比较运算不是赋值,关闭窗口无法触发程序退出。
修复实现
我们把加减速逻辑全部整合到Player类内部,删除冗余全局变量,逻辑更清晰易维护,修改后完整代码如下:
"""Dot Game""" import pygame, sys # Constants WIDTH, HEIGHT = 1000, 1000 TITLE = "Dot." # pygame initialization pygame.init() win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(TITLE) FPS = 60 fpsclock = pygame.time.Clock() # colors bgc = (247, 226, 222) pc = (152, 193, 217) pc2 = (61, 90, 128) ec = (119, 2, 26) ec2 = (220, 66, 73) # Player Class class Player: def __init__(self, x, y): self.x = int(x) self.y = int(y) self.radius = 32 self.color = pc self.color2 = pc2 self.velX = 0 self.velY = 0 self.left_pressed = False self.right_pressed = False self.up_pressed = False self.down_pressed = False self.accel = 0.2 # 加速度 self.max_speed = 6 # 最大速度 self.friction = 0.2 # 减速度/摩擦力 self.hitbox = (self.x -20, self.y -20, 40, 40) def draw(self, win): pygame.draw.circle(win, self.color2, (self.x,self.y), 20) pygame.draw.circle(win, self.color, (self.x,self.y), 14) self.hitbox = (self.x -20, self.y -20, 40, 40) def update(self): # 根据按键状态计算当前加速度 accel_x = 0 accel_y = 0 if self.left_pressed: accel_x = -self.accel if self.right_pressed: accel_x = self.accel if self.up_pressed: accel_y = -self.accel if self.down_pressed: accel_y = self.accel # 速度更新 self.velX += accel_x self.velY += accel_y # 限制最大速度 if abs(self.velX) > self.max_speed: self.velX = self.max_speed * (1 if self.velX > 0 else -1) if abs(self.velY) > self.max_speed: self.velY = self.max_speed * (1 if self.velY > 0 else -1) # 无按键时减速逻辑 if accel_x == 0: if self.velX > 0: self.velX -= self.friction if self.velX < 0: self.velX = 0 elif self.velX < 0: self.velX += self.friction if self.velX > 0: self.velX = 0 if accel_y == 0: if self.velY > 0: self.velY -= self.friction if self.velY < 0: self.velY = 0 elif self.velY < 0: self.velY += self.friction if self.velY > 0: self.velY = 0 # 更新坐标+边界限制 self.x += self.velX self.y += self.velY self.x = max(20, min(WIDTH - 20, self.x)) self.y = max(20, min(HEIGHT - 20, self.y)) self.rect = pygame.Rect(int(self.x), int(self.y), 32, 32) def collide(self): print('hit') pass # Player Initialization player = Player(WIDTH/2, HEIGHT/2) # Main Loop collide = False while not collide: for event in pygame.event.get(): if event.type == pygame.QUIT: collide = True # 修复退出逻辑 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.left_pressed = True elif event.key == pygame.K_RIGHT: player.right_pressed = True elif event.key == pygame.K_UP: player.up_pressed = True elif event.key == pygame.K_DOWN: player.down_pressed = True elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: player.left_pressed = False elif event.key == pygame.K_RIGHT: player.right_pressed = False elif event.key == pygame.K_UP: player.up_pressed = False elif event.key == pygame.K_DOWN: player.down_pressed = False # 渲染更新 win.fill(bgc) player.draw(win) player.update() pygame.display.update() fpsclock.tick(FPS) pygame.quit() sys.exit()
如果需要调整加减速的手感,直接修改Player类里的accel、max_speed、friction三个参数即可:
- 增大
accel:加速更快 - 增大
max_speed:最高速度更高 - 增大
friction:松开按键后减速更快
内容的提问来源于stack exchange,提问作者BRAN
相关产品推荐
相关产品推荐

