2017-01-08 1 views
0

저는 Libgdx에서 간단한 게임을 만들고 있습니다. 문제는 코드가 데스크톱에서는 잘 작동하지만 Android에서는 그렇지 않다는 것입니다 (Galaxy S6). 게임에서 손가락으로 장치 중앙 (너비/2, 높이/2)으로 회전합니다. 당신이 표시됩니다 원을 회전사용자 입력이 Android에서 바탕 화면처럼 작동하지 않습니다.

touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Touchpunkt Gradzahl zur Mitte 

이 계산 천사 : 당신은 터치 포인트 인식이 터치와 센터 사이의 각도를 계산하고 speicher1에 저장됩니다 (항상 0과 360) 화면에. 모두이 두 가지 (데스크톱, 안드로이드)에서 잘 작동합니다. 이제 예를 들어 180 °로 손가락을 대면 원이 즉시이 지점으로 회전합니다. 하지만 그건 내가 원하는 것만은 아니다. 손가락을 움직일 때만 회전해야합니다. 따라서 원을 만지기 시작하면 드래그를 시작할 때만 원이 회전하지 않아야합니다. 다행히 나는 이것을 당신에게 분명히 할 수 있습니다. D. 는 I 이에 대한 해결책을 만들었다 :

touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte 

    if (Gdx.input.justTouched()) { 
     speicher2 = 360-(speicher1 - kcc.getCcdegreee()); 
    } 
    speicher1 = speicher1 + speicher2; 
    while (speicher1 >= 360) { 
     speicher1 -= 360; 
    } 
    kcc.setCcdegreee(speicher1); 

[KCC는 원의 모든 정보 (텍스처, 크기, 위치, 각도 (Ccdegree))에 저장되고 제 클래스]

I는이 문제를 해결 justTouched Method를 사용하고이 점을 'Start Point'로 만들었습니다. 이제 문제가 생겼습니다. 데스크톱에서는 제대로 작동하지만 Android에서는 제대로 작동하지 않습니다.

항목 코드 :

public void render(SpriteBatch sb, SpriteBatch textsb) { 
    //Wenn getouched(gedreht wurde) 
    if (Gdx.input.isTouched()) { 
     handleInput(); 
    } 

    sb.begin(); 
    //COLORCIRCLE 
    sb.draw(kcc.getCc(),kcc.getCcposition().x,kcc.getCcposition().y,kcc.getCcwidth()/2,kcc.getCcwidth()/2,kcc.getCcwidth(),kcc.getCcheight(),1,1,-kcc.getCcdegreee(),true); 
    sb.end(); 
} 

[표시 만지면 I 알아낼 방법 렌더링 계산 천사 화면의 원을 그리]

핸들 입력기 :

protected void handleInput() { 
    touchpoint.set(Gdx.input.getX(),Gdx.input.getY()); 
    speicher1 = (float)((Math.atan2 (touchpoint.x - width/2, -(touchpoint.y - height/2))*180.0d/Math.PI))+180; //Toucpunkt Gradzahl zur Mitte 
    if (Gdx.input.justTouched()) { 
     speicher2 = 360-(speicher1 - kcc.getCcdegreee()); 
    } 
    speicher1 = speicher1 + speicher2; 
    while (speicher1 >= 360) { 
     speicher1 -= 360; 
    } 
    kcc.setCcdegreee(speicher1); 
} 

내가 말한대로 모든 것이 데스크톱에서는 완벽하게 작동하지만 안드로이드에서는 완벽하게 작동하지 않습니다. 나는 누군가가 이것에 대한 해결책을 찾거나 내 잘못을 찾길 바랍니다.

답변

0

터치 포인트를 직접 폴링하지 말고 justTouched() 및 모든 것을 처리해야하지만 대신 InputProcessor 또는 GestureListener을 사용하는 것이 좋습니다.

이것은 훨씬 유연하고 구현하기 쉬운 이벤트 기반 입력을 제공합니다.

는 옵션 1 :

이 인터페이스를 구현 InputProcessor, 당신은 실제로 단지

public boolean touchDown (int x, int y, int pointer, int button) { 
     return false; 
    } 

    public boolean touchUp (int x, int y, int pointer, int button) { 
     return false; 
    } 

    public boolean touchDragged (int x, int y, int pointer) { 
     return false; 
    } 

방법을 사용해야합니다. 터치 다운에서 터치 다운 이벤트의 위치를 ​​저장하면됩니다. onDragged()에서 회전 한 각도를 계산합니다. onDragged()는 일반적으로 (각 프레임) 정상적으로 드래그 할 때 꽤 자주 호출되기 때문에 창 중심에서 원을 회전시키는 데 사용할 수있는 아주 작은 델타 각으로 끝납니다.

옵션 2 : GestureListener

더욱이 하나가 이미 당신에게 당신이 프레임 당 델타 각도를 계산하는 데 필요한 모든 것을 제공, 마지막 위치로 델타가 포함되어 있기 때문에이하는 GestureListener에 도착 편리합니다.

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html#pan-float-float-float-float-

나는 그것은 명확하게 논리를 단순화하고 코드가 훨씬 더 읽기 쉽고 유지 보수 :

해야 ... 도움이되기를 바랍니다
관련 문제