使用三角函数计算子弹dx、dy值方向错误问题求助(CMU CS项目)
问题分析与修复方案
核心问题拆解
你的子弹方向错误主要源于坐标系差异、移动逻辑符号错误,以及对angleTo函数返回值的不确定性,以下是具体修复步骤:
1. 修正坐标系适配问题
你的游戏坐标系是右上原点(0,0),左下为(400,400),即Y轴向下为正方向;但标准三角函数(cos/sin)基于数学坐标系(Y轴向上为正),两者Y轴方向完全相反,直接套用会导致方向反转。
同时你当前的移动代码:
i.centerY -= rounded(i.dy)
会让dy为正值时,子弹Y坐标减小(向上移动),与你的坐标系Y轴向下为正的逻辑冲突。
2. 替换angleTo函数(避免未知逻辑干扰)
不确定angleTo函数的角度计算规则(比如是顺时针还是逆时针、基准方向是什么),直接用Python标准库的math.atan2手动计算角度更可靠:
import math # 计算鼠标相对于玩家的偏移量(适配你的坐标系) dx_mouse = mouseX - player.centerX dy_mouse = mouseY - player.centerY # 直接计算弧度制角度(atan2参数顺序为dy在前,dx在后) player.gunAngle = math.degrees(math.atan2(dy_mouse, dx_mouse)) player.rotateAngle = player.gunAngle # 创建子弹并计算速度分量 bullet = Circle(gun.centerX, gun.centerY, 4, rotateAngle=player.gunAngle) # 直接用弧度计算,省去degrees转radians的步骤 bullet.angle = math.atan2(dy_mouse, dx_mouse) bullet.dx = 3 * math.cos(bullet.angle) bullet.dy = 3 * math.sin(bullet.angle)
3. 修复移动逻辑
调整Y轴移动的符号,同时避免过早取整导致的精度丢失(如果你的Circle类支持浮点数坐标):
for i in bullets.children: # 保留浮点数精度更新坐标 i.centerX += i.dx i.centerY += i.dy # 若必须用整数坐标,在最后统一取整 i.centerX = round(i.centerX) i.centerY = round(i.centerY)
4. 关键验证点
- 如果你的坐标系X轴是向左为正(右上(0,0)到左下(400,400),X值左增),则需要将
dx_mouse改为player.centerX - mouseX,同时bullet.dx取反:bullet.dx = -3 * math.cos(bullet.angle) - 测试时可以固定鼠标位置,打印
bullet.dx和bullet.dy的值,确认是否与预期方向匹配(比如鼠标在玩家右下方,dx应为正、dy应为正)
内容的提问来源于stack exchange,提问作者MightBeMichelle
相关产品推荐
相关产品推荐

