Libgdx从枪中爆炸

时间:2017-02-25 08:17:40

标签: java algorithm animation libgdx

在我的游戏中有一个坦克。我得到了一个扩展Sprite的Barrel类,这个类正在处理桶相关的东西,其中一个就是拍摄时的爆炸动画。这就是我尝试这样做的方式:

batch.draw(currShotAnimation,
            b2body.getPosition().x - currShotAnimation.getRegionWidth() / 2,
            b2body.getPosition().y + 10,
            0,
            0,
            currShotAnimation.getRegionWidth(),
            currShotAnimation.getRegionHeight(),
            1,
            1,
            getRotation());
当坦克向前看时,它正在工作:
top down tank game
但当他看向不同的地方时,看起来很奇怪:
tank looking right

tank looking down
我该如何修复它以便它可以向所有方向发挥作用?

编辑:
在尝试Abhishek Aryan建议的内容后(我的像素为米):

        batch.draw(currShotAnimation,
            b2body.getPosition().x + offset * MathUtils.cosDeg(getRotation()),
            b2body.getPosition().y + offset * MathUtils.sinDeg(getRotation()),
            currShotAnimation.getRegionWidth()/2f,
            currShotAnimation.getRegionHeight()/2f,
            currShotAnimation.getRegionWidth(),
            currShotAnimation.getRegionHeight(),
            1,
            1,
            getRotation());
它看起来像这样:
tank problem1
tank problem2

3 个答案:

答案 0 :(得分:2)

问题在于,draw方法在左下角绘制对象并围绕此方向旋转。如果你想看看我的意思raplace这个位置:

b2body.getPosition().x,
b2body.getPosition().y,

现在你的爆炸应该始终在旋转并在左下角设置。现在,尝试设置您的originx和originy,它们目前都是0

currShotAnimation.getRegionWidth() / 2,
0,

通过这种方式,你的精灵将围绕它的底部中心旋转,这会让事情变得更容易。但是它的左下角仍然会定位。但是,您不能只添加一些值,这就是您在上面所做的。如果你的枪管指向下方,你不想在y值上加10,这会将精灵推向上方,因为它应该向下推一点,所以它在你的坦克下面。你将需要使用一些三角函数来定位你的精灵旋转。查看here是否存在类似的问题。我希望你现在明白你的问题。

答案 1 :(得分:2)

b2body是你的box2d身体吗?如果是,则将米转换为像素以在屏幕上绘图。

private float offset=10;
private float METER_PIXEL=32;

batch.draw(textureRegion,b2body.getPosition().x*METER_PIXEL+ offset *MathUtils.cosDeg(getRotation()),b2body.getPosition().y*METER_PIXEL+ offset*MathUtils.sinDeg(getRotation()),currShotAnimation.getRegionWidth()/2f,currShotAnimation.getRegionHeight()/2f,currShotAnimation.getRegionWidth(),currShotAnimation.getRegionHeight(),1,1,getRotation());

在这里,您可以使用精灵旋转来旋转火焰动画。所以你需要根据b2dbody旋转旋转你的Sprite,这样你就可以在这里使用,否则你需要在弧度上得到b2body旋转并转换成度并在这里使用。

这里我测试了TextureRegion

的偏移量
 public class TestGame extends Game implements InputProcessor{

    private SpriteBatch spriteBatch;
    private Sprite sprite;
    private TextureRegion textureRegion;
    private float offset = 20;
    private firstTex,secondTex; 

    @Override
    public void create() {

        spriteBatch=new SpriteBatch();

        textureRegion=new TextureRegion(firstTex=new Texture("im.png"));
        sprite=new Sprite(secondTex=new Texture("xyz.png"));
        sprite.setPosition(100,100);

        Gdx.input.setInputProcessor(this);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        spriteBatch.begin();
        sprite.draw(spriteBatch);
        spriteBatch.draw(textureRegion,sprite.getX()+ offset *MathUtils.cosDeg(sprite.getRotation()),sprite.getY()+(offset)*MathUtils.sinDeg(sprite.getRotation()),sprite.getWidth()/2f,sprite.getHeight()/2f,sprite.getWidth(),sprite.getHeight(),1,1,sprite.getRotation());
        spriteBatch.end();

        if(Gdx.input.isTouched()){
            float rotation=sprite.getRotation();
            rotation++;
            sprite.setRotation(rotation);
        }

    }

    @Override
    public boolean keyDown(int keycode) {
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {

        float rotation=sprite.getRotation();
        rotation++;
        sprite.setRotation(rotation);

        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        return false;
    }

    @Override
    public void dispose(){
       firstTex.dispose();
       secondTex.dispose();
       spriteBatch.dispose();
   }
}

答案 2 :(得分:2)

batch.draw()中的第二个和第三个参数是您的问题。如果你想要居中,你应该将它与你的currShotAnimation.getRegionWidth()分开一半。所以它应该是这样的:

batch.draw(currShotAnimation,
        b2body.getPosition().x + offset * MathUtils.cosDeg(getRotation()) - currShotAnimation.getRegionWidth() / 2,
        b2body.getPosition().y + offset * MathUtils.sinDeg(getRotation()) - currShotAnimation.getRegionHeight() / 2,
        currShotAnimation.getRegionWidth()/2f,
        currShotAnimation.getRegionHeight()/2f,
        currShotAnimation.getRegionWidth(),
        currShotAnimation.getRegionHeight(),
        1,
        1,
        getRotation());

旋转时,这将使图像中的点原点居中。

更新:我认为你计算角度的方式是错误的。应该是这样的

   b2body.getPosition().y +=  (Math.sin(rotation) * speed);
   b2body.getPosition().x +=  (Math.cos(rotation) * speed);

在你的`batch.draw(); x和y参数将其更改为:

 b2body.getPosition().x -  currShotAnimation.getRegionWidth() / 2
 b2body.getPosition().y -  currShotAnimation.getRegionHeight() / 2

这应该以原点为中心。