如何在SDL C ++中将图像移动到点

时间:2013-10-15 14:20:22

标签: c++ sdl

我尝试将粒子图像移动到玩家点击屏幕的位置。 我使用物理学中的这个公式计算速度矢量。

    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后的数字

  _______
 /
/

他上升然后直,我希望他直接到达这一点

  /
 /
/

我该如何解决它?

1 个答案:

答案 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 / yVelsin始终为y - 轴,{ {1}} cos - 轴。)

我认为你在“移动对象”代码中有另一个错误。你在那里错过了x

这可能是您想要的代码:

yVel

我真的不明白你为什么要在那里检查“向左移动”。它不应该存在。

(顺便说一句,计算//move the object iceBallParticle[i]->SetCurrentLocation( iceBallParticle[i]->GetCurrentLocation().x - xVel, iceBallParticle[i]->GetCurrentLocation().y - yVel); 更常见。然后你有正确的速度,你通常会加速度,而不是减去它。)