2012-06-27 268 views
2

我开发了一个2D游戏,并使用OrthographicCamera和Viewport将virtaul板重新调整为实际显示大小。我添加图像到舞台并使用ClickListener检测点击。它工作正常,但是当我改变分辨率时,它的工作是不合理的(不能检测到正确的演员,我认为新的和原始的x和y的问题)。有没有什么办法解决这一问题?Libgdx:调整屏幕大小和ClickListener(libgdx)

+0

请您提供一些代码。 –

回答

3

您需要将屏幕坐标转换为世界坐标。 你的相机可以做到这一点。你可以用两种方法,cam.project(...)cam.unproject(...)

或者如果你已经在使用Actors,不要自己初始化摄像机,而是使用Stage。创建一个舞台并添加演员。舞台将为你做协调翻译。

0

我只是觉得Stage很容易使用。 如果有一些错误的,我认为你应该检查你的代码:

public Actor hit(float x, float y) 
1

一旦我也遇到这个问题,但在最后,我得到了有效的解决方案,绘制使用SpriteBatch在libgdx任何东西,或舞台上。使用正交相机我们可以做到这一点。

首先选择一个最适合游戏的恒定分辨率。在这里,我采取了1280 * 720(风景)。

class ScreenTest implements Screen{ 
 
    
 
final float appWidth = 1280, screenWidth = Gdx.graphics.getWidth(); 
 
final float appHeight = 720, screenHeight = Gdx.graphics.getHeight(); 
 

 
OrthographicCamera camera; 
 

 
SpriteBatch batch; 
 
Stage stage; 
 

 
Texture img1; 
 
Image img2; 
 

 
public ScreenTest(){ 
 
    \t \t camera = new OrthographicCamera(); 
 
\t \t camera.setToOrtho(false, appWidth, appHeight); 
 
    \t \t 
 
     batch = new SpriteBatch(); 
 
    \t \t batch.setProjectionMatrix(camera.combined); 
 
    \t \t \t 
 
     img1 = new Texture("your_image1.png"); 
 
    \t \t img2 = new Image(new Texture("your_image2.png")); 
 
    \t \t img2.setPosition(0, 0); // drawing from (0,0) 
 
    \t 
 
     stage = new Stage(new StretchViewport(appWidth, appHeight, camera)); 
 
     stage.addActor(img2); 
 
    } 
 
    
 
    @Override 
 
\t public void render(float delta) { 
 
\t 
 
\t \t Gdx.gl.glClearColor(1, 0, 0, 1); 
 
\t \t Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
 

 
\t \t batch.begin(); 
 
\t \t batch.draw(img, 0, 0); 
 
\t \t batch.end(); 
 

 
\t \t stage.act(); 
 
\t \t stage.act(delta); 
 
\t \t stage.draw(); 
 
\t \t 
 
\t \t // Also You can get touch input according to your Screen. 
 
\t \t 
 
\t \t if (Gdx.input.isTouched()) { 
 
\t \t System.out.println(" X " + Gdx.input.getX() * (appWidth/screenWidth)); 
 
\t \t System.out.println(" Y " + Gdx.input.getY() * (appHeight/screenHeight)); 
 
\t } 
 
\t  
 
\t } 
 
    // 
 
    : 
 
    : 
 
    // 
 
}

运行这段代码在任何类型的分辨率将要在没有任何干扰这一决议进行调整。