我尝试将粒子图像移动到玩家点击屏幕的位置。 我使用物理学中的这个公式计算速度矢量。
float x = iceBallParticle[i]->GetCurrentLocation().x - iceBallParticle[i]>GetGoToX() ;
float y = iceBallParticle[i]->GetCurrentLocation().y - iceBallParticle[i]->GetGoToY() ;
float c = (x/y);
float alpha = atan(c);
//calculate the velocity x,y
float yVel = (speedOfMoveSkill * cos(alpha)) ;
float xVel = (speedOfMoveSkill * sin(alpha)) ;
//Move Left
if(iceBallParticle[i]->GetCurrentLocation().x > iceBallParticle[i]->GetGoToX())
//move the object
iceBallParticle[i]->SetCurrentLocation(iceBallParticle[i]->GetCurrentLocation().x - xVel , iceBallParticle[i]->GetCurrentLocation().y);
. . . more moves direction down here.
GoTo是玩家点击的位置,当前位置是粒子射击的位置。 我认为问题是因为他通过int打印图像,当我发送它打印时他错过了点x.xxxx后的数字
_______
/
/
他上升然后直,我希望他直接到达这一点
/
/
/
我该如何解决它?
答案 0 :(得分:0)
我不确定我是否正确理解了这个问题。
一个错误可能就是你如何计算alpha
。你这样做会错过x
/ y
的标志。有atan2
来克服这个问题。它只是:
float alpha = atan2(y, x);
但您根本不需要计算alpha
。一个更简单的解决方案是:
float dist = sqrt(x*x + y*y);
if(dist == 0) return; // exit here to avoid div-by-zero errors.
// also, we are already at our point
float yVel = (speedOfMoveSkill * x / dist) ;
float xVel = (speedOfMoveSkill * y / dist) ;
(请注意,您已为sin
/ cos
切换xVel
/ yVel
。sin
始终为y
- 轴,{ {1}} cos
- 轴。)
我认为你在“移动对象”代码中有另一个错误。你在那里错过了x
。
这可能是您想要的代码:
yVel
我真的不明白你为什么要在那里检查“向左移动”。它不应该存在。
(顺便说一句,计算//move the object
iceBallParticle[i]->SetCurrentLocation(
iceBallParticle[i]->GetCurrentLocation().x - xVel,
iceBallParticle[i]->GetCurrentLocation().y - yVel);
更常见。然后你有正确的速度,你通常会加速度,而不是减去它。)