2014-11-23 6 views
0

저는 타일 기반의 게임에서 스크롤 할 수 있어야하지만 세계의 경계 안에서만 작업해야합니다. 그래서 여러 예제/자습서가 제안하는 것처럼 pan() 메서드를 설정했지만 항상 제대로 작동하지는 않습니다. 때로는 마지막 제스처의 시작 지점으로 다시 점프하거나 매우 느리게 움직이는 경우도 있습니다. 또한 테두리가 작동하지 않습니다. 어쩌면 누군가 내가 만든 실수를 지적 할 수 있습니다.LibGDX 패닝이 때로 점프합니다

public void pan(float x, float y, float deltaX, float deltaY) { 
    moveCamera(x, y); 
} 

private void moveCamera(float x, float y) { 
    Vector3 new_position = getNewCameraPosition((int) x, (int)y); 

    if(!cameraOutOfLimit(new_position)) 
     this.getViewport().getCamera().translate(new_position.sub(this.getViewport().getCamera().position)); 

    lastTouchDown.set(x, y, 0); 
} 

private Vector3 getNewCameraPosition(int x, int y) { 
    Vector3 newPosition = lastTouchDown;   
    newPosition.sub(x, y, 0); 
    newPosition.y = -newPosition.y;  
    newPosition.add(this.getViewport().getCamera().position); 

    return newPosition; 
} 

private boolean cameraOutOfLimit(Vector3 position) { 
    int x_left_limit = (int) (Global.SCREEN_WIDTH/2); 
    int x_right_limit = (int) (Global.COLS_OF_TILES * Global.TILE_WIDTH - (Global.SCREEN_WIDTH/2)); 
    int y_bottom_limit = (int) (Global.SCREEN_HEIGHT/2); 
    int y_top_limit = (int) (Global.ROWS_OF_TILES * Global.TILE_HEIGHT - Global.SCREEN_HEIGHT/2); 

    if(position.x < x_left_limit || position.x > x_right_limit) 
     return true; 
    else if(position.y < y_bottom_limit || position.y > y_top_limit) 
     return true; 
    else 
     return false; 
} 
+1

은, 위의 코드에서 뭐가 잘못 됐는지 말해 어렵다. 그러나이 행'Vector3 newPosition = lastTouchDown;'은'lastTouchDown' 객체와 동일한'newPosition'의 참조 된 객체를 수정하기 때문에 문제가 발생할 것입니다. 그래서' lastTouchDown'을 실행하면 올바르지 않을 것입니다. 대신 Vector3 newPosition = new Vector3 (lastTouchDown);을 사용해야합니다. – Tenfour04

답변

1

위의 코드는 나에게 뒤얽힌 보인다, 나는 정말 당신은 벡터 터치 위치와는 아무 상관이없는 방법으로 lastTouchPosition라고 수정 이해가 안가 않습니다.

나는 이렇게 할 것이다. 이 방법은 카메라를 움직일 때마다 목표 X 및 Y 위치를 고정시킵니다.

void panCamera(float deltaX, float deltaY) { 
    Camera camera = this.getViewport().getCamera(); 
    Vector3 camPosition = camera.position; 
    camPosition.x = clampCamTargetX(camPosition.x + deltaX); 
    camPosition.y = clampCamTargetY(camPosition.y + deltaY); 
    camera.update(); 
} 

을 아니면 부드럽게 만져 마지막 위치로 카메라를 이동하기위한 완벽한 솔루션을 원하는 경우,이 시도 : 당신이 그것을 이동하려는 경우

float clampCamTargetX(float x) { 
    x = Math.max(x, (int) (Global.SCREEN_WIDTH/2)); 
    x = Math.min(x, (int) (Global.COLS_OF_TILES * Global.TILE_WIDTH - (Global.SCREEN_WIDTH/2))); 
    return x; 
} 

float clampCamTargetY (float y){ 
    y = Math.max(y,(int)(Global.SCREEN_HEIGHT/2)); 
    y = Math.min(y,(int)(Global.ROWS_OF_TILES*Global.TILE_HEIGHT-Global.SCREEN_HEIGHT/2)); 
    return y; 
} 

그런 다음 같은 것을 할 것입니다 : 난 당신이`panCamera()`방식으로 통과하고 두가 왜 무시하는 매개 변수 모르겠어요 때문에

float startXCam, startYCam, targetXCam, targetYCam; 
float elapsedTimeCam; 
boolean panningCam = false; 
static final float CAM_PAN_DURATION = 0.4f; 

public void render(){ 
    //... 
    panCameraToTouchPoint(Gdx.graphics.getDeltaTime()); 
    //... 
} 

void panCameraToTouchPoint (float deltaTime){ 
    Camera camera = getViewport().getCamera(); 
    Vector3 camPosition = camera.position; 
    if (Gdx.input.justTouched()) { 
     startXCam = camPosition.x; 
     startYCam = camPosition.y; 
     targetXCam = clampCamTargetX(Gdx.input.getX()); 
     targetYCam = clampCamTargetY(Gdx.input.getY()); 
     elapsedTimeCam = 0; 
     panningCam = true; 
    } 

    if (panningCam){ 
     elapsedTimeCam += deltaTime; 
     float alpha = elapsedTimeCam/CAM_PAN_DURATION; 
     if (alpha >= 1){ 
      alpha = 1; 
      panningCam = false; 
     } 
     camPosition.x = Interpolation.pow2Out.apply(startXCam, targetXCam, alpha); 
     camPosition.y = Interpolation.pow2Out.apply(startYCam, targetYCam, alpha); 
     camera.update(); 
    } 
} 
+0

나를 도와 주셔서 감사합니다. 대답의 첫 부분이 완벽하게 작동했습니다. –

관련 문제