如何在pygame游戏中查找并更新PlayerBullet类的X和Y坐标值
解决方法
1. 获取已生成子弹实例的坐标
你已经在PlayerBullet类的__init__方法里把坐标存为实例属性self.x和self.y了,直接遍历存储子弹的player_bullets列表就能读取所有存活子弹的实时坐标,比如可以在游戏主循环里加这段测试打印:
for bullet in player_bullets: print(f"子弹坐标:X={bullet.x}, Y={bullet.y}")
2. 计算子弹运动轨迹
你代码里已经定义了子弹的运动参数,直接用匀速直线运动公式就能计算任意时刻的子弹坐标,不需要依赖实时运行的属性值:
- 初始坐标:生成子弹时的
(x0, y0),也就是你实例化时传入的玩家坐标playerX、playerY - 速度分量:实例化时计算得到的
x_vel、y_vel,运动过程中固定不变 - t时刻的子弹坐标 = (x0 - x_vel * t, y0 - y_vel * t),这里的t是子弹生成后经过的帧数量,乘以每帧的时间间隔还能换算成实际时间对应的坐标
优化实现(可选)
可以给PlayerBullet类加个计算任意时刻坐标的方法,调用更方便:
class PlayerBullet: def __init__(self, x, y, mouse_x, mouse_y): self.x0 = x # 存储初始坐标 self.y0 = y self.x = x self.y = y self.mouse_x = mouse_x self.mouse_y = mouse_y self.speed = 15 self.angle = math.atan2(y-mouse_y, x-mouse_x) self.x_vel = math.cos(self.angle) * self.speed self.y_vel = math.sin(self.angle) * self.speed self.frame_count = 0 # 记录子弹生成后的帧数 def main(self, display): self.x -= int(self.x_vel) self.y -= int(self.y_vel) self.frame_count +=1 pygame.draw.circle(display, (0,0,0), (self.x+16, self.y+16), 5) def get_pos_at_frame(self, t): # 输入t为目标帧数,返回对应时刻的子弹坐标 target_x = self.x0 - self.x_vel * t target_y = self.y0 - self.y_vel * t return (int(target_x), int(target_y))
额外注意点
你当前代码里实例化子弹用的playerX、playerY是在事件处理之后才赋值的,第一次点击的时候会报变量未定义的错误,把playerX = x、playerY = y这两行移到事件处理逻辑之前即可修复。
内容的提问来源于stack exchange,提问作者StriXxty9
相关产品推荐
相关产品推荐

