如何将精灵朝其面对的方向移动?


11

我正在使用Java / Slick 2D。我正在尝试使用鼠标旋转精灵,并使用箭头键移动精灵。我可以让精灵旋转没有问题,但是我不能让它朝应该的方向移动。当我点击“前进”时,子画面不一定会移向鼠标。实际上,它只会真正移到屏幕的左侧。我确信必须有一些标准代码,因为许多游戏都使用这种风格的动作。谁能帮我解决这个三角帆的问题?谢谢

编辑:这是旋转代码(它做其他奇怪的事情: https //stackoverflow.com/questions/12610320/why-is-my-image-rotating-off-center

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

和运动代码。我只能向屏幕左侧移动...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

您添加的代码有什么意义?这是新问题吗?如果是新问题,请打开一个新问题。请仅使用有关将精灵沿其朝向移动的信息更新此问题。
MichaelHouse

不,是我使用的导致问题的代码。请参阅下面的评论。有人要。
rphello101 2012年

我看不到您在哪里计算sprite.movespeed?
AturSams 2012年

movespeed是一个常数,在这种情况下设置为.3
rphello101

Answers:


14

您将要根据当前的速度和航向获得一个矢量。然后使用该向量增加位置。

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

因此,现在您根据旋转知道速度了。您可以使用该信息更新职位。

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

对于包含所有这些的(草率的)类,您可以看到我在这里整理的Ludum Dare 21条目:bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…–
MichaelHouse

谢谢。进行一些修改后,这确实可行。但是,如果您碰巧读到了这个,我还有一个问题要问:让精灵向后移动只是您这里拥有的东西的-=。我如何使其向左或向右移动?
rphello101

@ rphello101好问题,您应该问一个新问题。更多的人将从中受益,您可能会得到比我更好的答案。
MichaelHouse

3

您得到鼠标位置

mouseX = ... 
mouseY = ...

你得到了精灵的位置

spriteX = ...
spriteY = ...

你找到角度

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

您的动作将是:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

提示:使用预先计算的值为cos和sin创建一个table(array)。所以你只需要做cosTable [[int] angle] *速度*时间和sinTable [[int] angle] *速度*时间就不那么精确了。但是,您可以更快地获得价值。
Sidar 2012年

这将使精灵向鼠标移动,但是与精灵面对的方向不同。如果精灵的旋转速度受到限制或其他原因,它可能仍会转向鼠标。基本上,您在回答错误的问题。
MichaelHouse

@ Byte56他说:“当我点击“ forward”时,精灵不一定会移向鼠标。”我想这就是他问的。你可能是对的。
AturSams 2012年

当然,这有点模棱两可。在这种情况下,我只是默认问题的标题。不要误会我的意思,您的回答很好。我想我们会发现OP何时/如果他们回来想要什么。
MichaelHouse

2
@Sidar那将是过早的优化。在没有识别出sin / cos操作为瓶颈的情况下建立sin / cos表是浪费时间。
bummzack 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.