【问题标题】:Java libgdx camera.unproject() not syncing with batch.draw()Java libgdx camera.unproject() 不与 batch.draw() 同步
【发布时间】:2016-07-30 21:17:26
【问题描述】:

我正在使用 libgdx 编写一个 2d 平台游戏,我正在尝试制作一个菜单屏幕,玩家可以在其中单击按钮并加载该级别。我使用 gdx.input 作为点击坐标,使用 TextureRegion.getRegionX() 作为按钮坐标。他们不同步,我读到 camera.unproject 应该解决这个问题。我适当地使用了它,但坐标仍然不匹配。 camera.unproject 似乎将 x 和 y 的 0,0 设置为屏幕的中心,而 batch.draw (这是将 TextureRegion 绘制到屏幕的方法)似乎使用左下角作为 x 和 y 的 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();

}

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    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,因为您将逻辑与资产大小相结合。

    【讨论】:

    • 这也不起作用。好像和以前做的一样,其实我看不出我有什么和你有什么区别。
    • 你真的读过答案吗?你到底看不到什么?
    • 我在我的项目中使用了你的代码,我得到了相同的结果。在您的回答中,您使用 camera.unproject 转换 Gdx.Input 坐标,这与我所做的相同,唯一的区别是我使用 Rectangle 和 .contains 作为按钮坐标,但您使用布尔值。
    • 不,你没有使用按钮坐标,你使用了区域坐标,这是两个非常不同的东西。也许再读一遍答案,不要只看我作为example包含的代码。
    • 我设法弄明白了,我明白你现在可能的意思了。感谢您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多