我正在用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();
}
答案 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,因为您将逻辑与资产规模相结合。