2011-11-12 5 views
5

Próbuję utworzyć obiekt, w którym osoba ostatnio dotknęła. Jednak gdy próbuję to zrobić, pojawia się w niewłaściwym miejscu. Zakładam, że to ze względu na fakt, że współrzędne wejście zwraca różni się od współrzędnych wyświetlania, mój kod wygląda następująco:Stosowanie współrzędnych pikseli do współrzędnych ekranu

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; 

} 
    } 

I przycięte ten kod dla dobra simplicty. Ja również film wykazujący błąd: http://www.youtube.com/watch?v=m89LpwMkneI

Odpowiedz

27

Camera.unproject zamienia współrzędne ekranu koordynuje świecie.

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

To powinna być poprawna odpowiedź. – HAL9000

+0

Wypróbowałem przyjęte rozwiązanie, ale staje się ono bardzo kłopotliwe po zmianie rozdzielczości ekranu. To jest droga, jeśli nie chcesz przepisać wszystkich wymaganych obliczeń. – MxyL

+0

Zmieniłem zaakceptowaną odpowiedź. Zostało to opublikowane po zaakceptowaniu pierwszej odpowiedzi. – Derek

1

Po pierwsze, Gdx.input.getX() i Gdx.input.getY() return "współrzędne ekranu". Chcesz przekształcić je w "współrzędne kamery". Współrzędne ekranu zazwyczaj mają (0,0) w lewym górnym rogu okna. Myślę, że twoje współrzędne kamery mają (0,0) w lewym dolnym rogu (albo libgdx albo opengl to robią). Twój film wydaje się sugerować, że to prawda. Musisz więc pomnożyć wartość Y przez -1. Po drugie, podejrzewam, że skala ekranu różni się od skali kamery. Myślę, że możesz naprawić skalę przez pomnożenie przez (świat/ekran).

Załóżmy, że Twój ekran ma szerokość = 800, wysokość = 600, a twój świat ma szerokość = 480 wysokość = 320. Wtedy twój nowy X, Y dla ikonki powinny być:

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

Dlaczego dodałeś ukośniki przed gwiazdami? – HAL9000

0

powinieneś sprawdzić swoje kordynaty dotykowe.

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

tutaj touchx i drażliwy są twoje wejście x i wejście y zmienne następnie zrobić kalkulację gdzie dotyk powinien pracować jak gdyby u dotknął X = 100, Y = 100

i touchx nadchodzi 120 i dotknąć y nadchodzi 120

soo w sposobie aktualizacji to zrobić

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

myślę th to pomoże

0

zorientowali się rozmiar ekranu/stosunek grę i pomnożyć go do aktualnego rozmiaru ekranu:

rect.x = ((((1024/Gdx.graphics.getWidth())) * GDX .graphics.getWidth())

do szerokości 1024 pikseli

musi być łatwiejszy sposób jednak działa to dla mnie.