2011-11-12 4 views
5

사람이 마지막으로 터치 한 곳에서 개체를 표시하려고합니다. 그러나 내가하려고 할 때 그것은 틀린 장소에 나타난다. 다음과 같이 나는이 때문에 입력이 반환 좌표가 표시 좌표에 다른 사실 가정, 내 코드는 다음과 같습니다화면 좌표에 픽셀 좌표 적용

public class Core implements ApplicationListener, InputProcessor 
      { //Has to be here otherwise the code formatting becomes buggy 


private Mesh squareMesh; 
private PerspectiveCamera camera; 
private Texture texture; 
private SpriteBatch spriteBatch; 
Sprite sprite; 
float moveX = 0; 


private final Matrix4 viewMatrix = new Matrix4(); 
private final Matrix4 transformMatrix = new Matrix4(); 

@Override 
public void create() 
{ 
    Gdx.input.setInputProcessor(this); 


    texture = new Texture(Gdx.files.internal("door.png")); 

    spriteBatch = new SpriteBatch(); 
    sprite = new Sprite(texture); 
    sprite.setPosition(0, 0); 
    viewMatrix.setToOrtho2D(0, 0, 480, 320); 

    float x = 0; 
    float y = 0; 

} 

@Override 
public void dispose() 
{ 
} 

@Override 
public void pause() 
{ 
} 

@Override 
public void render() 
{ 
    viewMatrix.setToOrtho2D(0, 0, 480, 320); 
    spriteBatch.setProjectionMatrix(viewMatrix); 
    spriteBatch.setTransformMatrix(transformMatrix); 
    spriteBatch.begin(); 
    spriteBatch.disableBlending(); 
    spriteBatch.setColor(Color.WHITE); 

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 


    //spriteBatch.draw(texture, 0, 0, 1, 1, 0, 0, texture.getWidth(), 
    //  texture.getHeight(), false, false); 
    sprite.draw(spriteBatch); 
    spriteBatch.end(); 
    update(); 
} 

@Override 
public void resize(int width, int height) 
{ 
    float aspectRatio = (float) width/(float) height; 
    camera = new PerspectiveCamera(67, 2f * aspectRatio, 2f); 

} 

@Override 
public void resume() 
{ 
} 

public void update() 
{ 

    float delta = Gdx.graphics.getDeltaTime(); 

    if(Gdx.input.isTouched()) 
    { 
     Vector3 worldCoordinates = new Vector3(sprite.getX(), sprite.getY(), 0); 
     camera.unproject(worldCoordinates); 
     sprite.setPosition(Gdx.input.getX(), Gdx.input.getY()); 

     float moveX = 0; 
     float moveY = 0; 

} 
    } 

나는 simplicty의 위해이 코드를 잘립니다. http://www.youtube.com/watch?v=m89LpwMkneI

답변

27

Camera.unproject 세계 좌표에 화면 좌표로 변환합니다.

Vector3 pos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); 
camera.unproject(pos); 
sprite.setPosition(pos.x, pos.y); 
+1

정답이어야합니다. – HAL9000

+0

허용 된 솔루션을 시도했지만 화면 해상도가 변경되면 정말 번거로워집니다. 필요한 모든 계산을 다시 작성하지 않으려면이 방법을 사용하십시오. – MxyL

+0

허용 된 답변을 변경했습니다. 첫 번째 답변을 수락하면 게시되었습니다. – Derek

1

첫째, Gdx.input.getX()와 Gdx.input.getY() 반환 "화면 좌표" 는 또한 버그를 보여주는 비디오를했다. 이것을 "카메라 좌표"로 변환하고 싶습니다. 화면 좌표는 일반적으로 창의 왼쪽 상단 구석에 (0,0)을가집니다. 나는 당신의 카메라 좌표가 왼쪽 하단 구석에 (0,0)이 있다고 생각한다. (libgdx 나 opengl이 그렇게한다). 귀하의 비디오는 이것이 사실임을 암시하는 것으로 보입니다. 따라서 Y 값에 -1을 곱해야합니다. 둘째, 화면의 크기가 카메라의 크기와 다른 것으로 의심됩니다. 나는 (월드/스크린)을 곱하여 스케일을 고정시킬 수 있다고 생각합니다.

너비가 800, 높이가 600이고 너비가 너비 = 480 높이 = 320 인 화면이 있다고 가정 해 보겠습니다. 그런 다음 스프라이트에 대한 새 X, Y는해야한다 :

X = Gdx.input.getX()*(480/800) 
Y = Gdx.input.getY()*(320/600)*-1 
+0

왜 별 앞에 백 슬래시를 추가 했습니까? – HAL9000

0

터치 좌표를 확인해야합니다. 여기

Gdx.app.log("", "hello x"+touchx); 
Gdx.app.log("", "hello x"+touchy); 

touchx 및 민감한는 입력 X와, 입력 Y 변수 다음 터치 유 X = Y (100) = 100

를 만지면 같은 작동해야하며 touchx 120 과오고 계산을 할 수 있습니다 y는 당신의 업데이트 방법에 김

(120)를 오는 접촉이

sprite.setPosition(Gdx.input.getX()-20, Gdx.input.getY()-20); 

내가 일 생각하십니까

rect.x = ((((1,024/Gdx.graphics.getWidth())) * GDX : I 화면 사이즈/게임 비율을 파악하고, 현재 화면 크기로 승산

0

도울 것이다 .graphics.getWidth는()) 1024 픽셀

의 화면 폭

쉬운 방법 그러나이 나를 위해 작동이 있어야합니다.