在我的游戏中有一个坦克。我得到了一个扩展Sprite
的Barrel类,这个类正在处理桶相关的东西,其中一个就是拍摄时的爆炸动画。这就是我尝试这样做的方式:
batch.draw(currShotAnimation,
b2body.getPosition().x - currShotAnimation.getRegionWidth() / 2,
b2body.getPosition().y + 10,
0,
0,
currShotAnimation.getRegionWidth(),
currShotAnimation.getRegionHeight(),
1,
1,
getRotation());
当坦克向前看时,它正在工作:编辑:
在尝试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());
它看起来像这样:答案 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
这应该以原点为中心。