基于旋转的精灵运动

时间:2013-05-01 18:45:09

标签: android opengl-es rotation

我在Android OpenGL中有一个精灵。这个精灵(一个小的beetlebug)总是向前移动,我使用:

sprite.setPosition(posX, posY);

现在我有一个旋转方法,当用户向左或向右移动错误时:

private void applyRotation() {
    for(int i=0;i<beetleBug.size;i++) {
         Sprite s = beetleBug.get(i);
         s.setOrigin(s.getWidth() / 2, s.getHeight() / 2);
         s.setRotation(angle);
     }
}

现在当虫子向前移动时,他总是这样做,必须计算新的x和y坐标,这取决于旋转角度,这样虫子总是向前移动。有人有算法通过旋转角度来计算方向吗?

以下是整个Bug类:

public class Bug {

    private SpriteBatch             spriteBatch = null;
    private TextureAtlas            spriteSheet;
    private Array<Sprite>           beetleBug;
    private int                     currentFrame = 0;
    private final float             frameLength = 0.10f;    //in seconds, how long a frame last
    private float                   animationElapsed = 0.0f;
    private float                   angle = 0.0f;
    private float                   posX = 0.0f;
    private float                   posY = 0.0f;
    private float                   sizeX = 100.0f;
    private float                   sizeY = 100.0f;
    private float                   offSet = 50.0f;

    public Bug() {
        spriteBatch = new SpriteBatch();
        spriteSheet = new TextureAtlas("assets/data/bug.txt");
        beetleBug = spriteSheet.createSprites("bug");

        // dont forget to set the size of your sprites!
        for(int i=0; i<beetleBug.size; i++){
            beetleBug.get(i).setSize(sizeX, sizeY);

        }

        applyPosition();
    }



    public void handleInput() {

        boolean leftKey = Gdx.input.isKeyPressed(Input.Keys.LEFT);
        boolean rightKey = Gdx.input.isKeyPressed(Input.Keys.RIGHT);

        if(rightKey) {
            if(angle <= 0) {
                angle = 360;
            }
            angle -= 2f;
            applyRotation();
        }

        if(leftKey) {
            if(angle >= 360) {
                angle = 0;
            }
            angle += 2f;
            applyRotation();
        }


        applyPosition();
    }


    private void applyPosition() {
        float x = (float) Math.cos(angle);
        float y = (float) Math.sin(angle);

        posX = posX + x;
        posY = posY + y;

        for(int i=0; i<beetleBug.size; i++){
            beetleBug.get(i).setPosition(posX - offSet, posY -offSet); // optional: center the sprite to screen
        }   
    }


    private void applyRotation() {
        for(int i=0;i<beetleBug.size;i++) {
             Sprite s = beetleBug.get(i);
             s.setOrigin(s.getWidth() / 2, s.getHeight() / 2);
             s.setRotation(angle);
         }
    }

    public void render(OrthographicCamera cam) {

        float dt = Gdx.graphics.getDeltaTime();
        animationElapsed += dt;
        while(animationElapsed > frameLength){
            animationElapsed -= frameLength;
            currentFrame = (currentFrame == beetleBug.size - 1) ? 0 : ++currentFrame;
        }

        spriteBatch.setProjectionMatrix(cam.combined);

        spriteBatch.begin();
        beetleBug.get(currentFrame).draw(spriteBatch);

        spriteBatch.end();
    }
}

3 个答案:

答案 0 :(得分:1)

创建一个标准化矢量来表示甲虫的方向,然后乘以速度。将该矢量添加到甲虫的当前位置,你就得到了他的新位置。

  1. 使用您的角度创建规范化矢量(即长度为1)。 vx = cos(angle), vy = sin(angle)
  2. 乘以甲虫的速度。 vx = vx*speed, vy = vy*speed
  3. 将其添加到当前位置。 x = x + vx, y = y + vy
  4. 重复
  5. 一些问题:注意你的精灵的图形旋转和你自己的旋转内部表示方式是一样的。一些框架会翻转它们旋转图形的方式。上述[cos(角度),sin(角度)]是指向正x轴的零角度。 cos / sin / tan的许多实现使用弧度而不是度数进行计算,因此请进行适当的转换。

    [cos angle, sin angle]向右为零(正x),逆时针为零。 [-sin angle, cos angle]为零向上(正y),逆时针。

答案 1 :(得分:1)

现在完美地运作:

  1. 将度数转换为弧度
  2. 将x-coordintae设置为 -

    private void applyPosition(){

    float radians =  (float) Math.toRadians(angle);
    float x = -(float) Math.sin(radians);
    float y = (float) Math.cos(radians);
    
    posX = posX + x;
    posY = posY + y;
    
    for(int i=0; i<beetleBug.size; i++){
        beetleBug.get(i).setPosition(posX - offSet, posY -offSet); 
    }   
    

    }

答案 2 :(得分:0)

这可能有效:

int currentX = 100; //beetleCurrentX
int currentY = 100; //beetleCurrentY
int angle = 200;    //beetleAngle
int len = 2;        //Step that the beetle makes (jumps 2 in this case)

int x2Pos = sin(angle)*len + currentX;
int y2Pos = cos(angle)*len + currentY;

sprite.setPosition(x2Pos,y2Pos);

如果每帧都执行此操作,您将使甲虫沿角度方向移动。