Java libgdx camera.unproject()与batch.draw()不同步

时间:2016-07-30 21:17:26

标签: java libgdx

我正在用libgdx编写一个2d平台游戏,我试图制作一个菜单屏幕,播放器可以点击按钮,它将加载该级别。我使用gdx.input作为单击坐标,使用TextureRegion.getRegionX()作为按钮坐标。他们没有同步,我读了那个camera.unproject应该解决这个问题。我适当地使用它但是指针仍然不匹配。 camera.unproject似乎设置0,0表示x和y作为屏幕的中心,而batch.draw(这是将TextureRegion绘制到屏幕的方法)似乎使用左下角作为x和y&# 39; s 0,0。

这是代码,我遗漏了我认为不相关的内容:

public class LevelScreen implements Screen {

private TextureRegion level_bg;
private SpriteBatch batch;
private Camera camera;  
private TextureAtlas textureAtlas;
private TextureRegion lockselectbg[]=new TextureRegion[10];

public LevelScreen(){               
}   

@Override
public void show() {

    batch=new SpriteBatch(); 
    camera = new OrthographicCamera(500,700);   

    LevelStatus.put();
    LevelStatus.get();      
    textureAtlas=new TextureAtlas(Gdx.files.internal("levelatlas.pack"));
    Array<AtlasRegion> atlasArrays = new Array<AtlasRegion>(textureAtlas.getRegions());     
    level_bg = atlasArrays.get(0);

    lockselectbg[0] = atlasArrays.get(21);
    }

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(159/255.0f,220/255.0f,235/255.0f,0xff/255.0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(camera.combined);

    batch.begin();      
    batch.draw(level_bg, -500/2,-348/2);
    batch.draw(lockselectbg[0], -180,0);
    batch.end();

    if(Gdx.input.isTouched()){
       Vector3 tmp = new Vector3(Gdx.input.getX(),Gdx.input.getY(), 0);
       camera.unproject(tmp);
       Rectangle textureBounds = new Rectangle(lockselectbg[0].getRegionX(), lockselectbg[0].getRegionY(), lockselectbg[0].getRegionWidth(), lockselectbg[0].getRegionHeight());
       if(textureBounds.contains(tmp.x, tmp.y)) {
            System.out.println("It worked");
       }
     }
}

@Override
public void dispose() {
    textureAtlas.dispose();
    batch.dispose();

}

1 个答案:

答案 0 :(得分:0)

Camera#unproject会将触摸坐标转换为世界坐标。它们与纹理上区域的位置无关,这就是TextureRegion。您实际上将世界(读取:游戏逻辑)坐标与资产坐标进行比较。这两者完全不相关。

如果要检查屏幕上的图像是否被触摸,请将触摸坐标与您在batch.draw调用中使用的图像的位置和大小进行比较。例如:

float x = -180f;
float y = 0f;
float width = 200f;
float height = 150f;
...
batch.draw(region, x, y, width, height);
...
camera.unproject(tmp.set(Gdx.input.getX(),Gdx.input.getY(), 0));
boolean touched = tmp.x >= x && tmp.y >= y && tmp.x < (x + width) && tmp.y < (y + height);
if (touched)
    System.out.println("It worked");

顺便说一下,您可能也想阅读这篇文章:http://blog.xoppa.com/pixels,因为您将逻辑与资产规模相结合。