2016-06-06 5 views
0

I 끌기 리스너 설정 한 액터있다 : I 화소 비율 m을 사용하는 경우하기LibGDX 드래그 수신기

W = Gdx.graphics.getWidth(); 
H = Gdx.graphics.getHeight(); 
camera = new OrthographicCamera(W/RATE, H/RATE); 
stage = new Stage(new ScreenViewport(camera)); 
stage.addActor(ballActor); 
Gdx.input.setInputProcessor(stage); 

: 액터는 단계에 첨가

ballActor.addListener(new DragListener() { 
    public void drag(InputEvent event, float x, float y, int pointer) { 
     ballActor.moveBy(x - ballActor.getWidth()/2, y - ballActor.getHeight()/2); 
    } 
}); 

을 1 : 1 끌기는 잘 작동하지만 1 : 160처럼 다른 비율을 사용하면 끌기 이벤트가 실행되지 않습니다. 내가 카메라를 업데이트 크기 조정 방법

는 :

camera.viewportHeight = H/RATE; 
camera.viewportWidth = W/RATE; 
camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0); 
camera.update(); 

은 내가 무대를 사용하는 경우 I 화면이 카메라 좌표 좌표에서 번역 해달라고 읽어 보시기 바랍니다. 액터는 위치, 너비, 높이 및 경계를 설정했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

UPDATE :

public class Pendulum extends ApplicationAdapter { 

    private Stage stage; 

    public static final float RATE = 160f; //with 1f..20f drag works 

    float W; 
    float H; 

    @Override 
    public void create() { 

     W = Gdx.graphics.getWidth()/RATE; 
     H = Gdx.graphics.getHeight()/RATE; 

     Texture ballTexture = new Texture(Gdx.files.internal("ball.png"), true); 
     ballTexture.setFilter(Texture.TextureFilter.MipMapLinearNearest, Texture.TextureFilter.Linear); 
     TextureRegion ballRegion = new TextureRegion(ballTexture); 

     final Image image = new Image(ballRegion); 
     image.setSize(image.getWidth()/RATE, image.getHeight()/RATE); 
     image.setPosition(0f, 0f); 
     image.addListener(new DragListener() { 
      public void drag(InputEvent event, float x, float y, int pointer) { 
       Gdx.app.log("LOG", "DRAG IMAGE"); 
       image.moveBy(x - image.getWidth()/2, y - image.getHeight()/2); 
      } 
     }); 
     image.debug(); 
     image.setBounds(image.getX(), image.getY(), image.getWidth(), image.getHeight()); 

     stage = new Stage(new FitViewport(W, H)); 
     stage.addActor(image); 

     Gdx.input.setInputProcessor(stage); 
    } 


    @Override 
    public void resize(int width, int height) { 
     stage.getViewport().update(width, height, true); 
    } 

    @Override 
    public void render() { 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     float delta = Math.min(Gdx.graphics.getDeltaTime(), 1/30f); 
     stage.act(delta); 
     stage.draw(); 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
    } 
} 

나는 이미지의 배우가 Box2D의 몸이 붙어 있기 때문에 100F보다 속도가 더 있어야합니다 : 여기

는 코드입니다. 이유는 here을 참조하십시오.

답변

0

scene2d를 사용하는 경우 뷰포트를 사용해야하며 뷰포트는 카메라의 크기를 관리합니다. 카메라에 명시적인 크기를 설정하면 스테이지가 혼동을줍니다. 이는 뷰포트가 카메라를 관리하고 있다고 가정하기 때문입니다 (현재 카메라의 세계 좌표와 뷰포트의 화면 크기가 일치하지 않습니다).

RATE을 어떻게 계산했는지 모르겠지만 ExtendViewport 또는 FitViewport를 사용하고 있어야합니다. resize() 방법에서 카메라를 수정하는 대신 뷰포트에서 update()으로 전화해야합니다.

+0

지금 I은'스테이지 = 새로운 단계 (새 FitViewport (W/RATE, H/RATE))를 가지고, '와 resize''의'stage.getViewport() 업데이트 ((INT) (폭./RATE), (int) (높이/RATE), 참);'. 'RATE = 160f;'는 상수이며 box2d phisyc가 제대로 작동하도록 전 세계를 확장하는 데 사용합니다. 세계를 다운 스케일하지 않으면 (RATE = 1f') 오브젝트가 매우 천천히 움직입니다. 만약 내가 다운 드래그가 발사되지 않으면. – Jorj

+0

W 및 H 상수 또는 현재 화면의 크기가 있습니까? 뷰포트 생성자에 상수 만 전달해야합니다. 그렇지 않으면 현재 개발중인 디스플레이의 크기에서만 작동하도록 게임을 디자인하고 있습니다. 예를 들어, 화면에 8m 크기의 Box2d를 수직으로 표시하기를 원할 경우,'new ExtendViewport (8, 8)'을 사용할 수 있습니다. 그런 다음'resize'에서'viewport.update (width, height)'를 실제 화면 크기로 호출하십시오. 이제 귀하의 게임은 모든 장치에서 8 박스 2 미터 높이가됩니다. – Tenfour04

+0

화면 크기 :'W = Gdx.graphics.getWidth()'. [Here] (https://gist.github.com/costinpapuc/5f13cd22c8274151b7cf8bd74af4e631)는 전체 코드입니다. 당신이 볼 수 있다면 나는 당신이 품질의 답변을 원한다면 – Jorj

0

업데이트를 보았을 때 동시에 뷰포트의 크기를 늘리거나 줄이면서 액터의 크기를 늘리거나 줄이는 것을 보았습니다.

다음을 수행하십시오. 뷰포트에 고정 너비/높이를 지정하십시오.
뷰포트를 사용하려면 다음을 이해해야합니다.
20 * 20의 뷰포트가있는 경우 전체 화면 크기가 "20x20"이됩니다.

그냥 "상상"- 당신은 당신이 작은 뷰포트를 사용하는 것이 필요한 것보다 (Box2D의 경우) 아주 작은 객체를 얻고 싶다면

매직.

그럼 이제 어떻게해야합니까? 화면에 20 단위 게임이 표시되기를 바랍니다.

그래서 우리는

우리가 지금, 우리는 우리의 800분의 1,280 20 분의 20에 "지도"무슨 새로운 뷰포트 (20, 20)를 .. 말한다.

이제 이미지를 표시 할 수 있습니다. 우리는 무엇을합니까? 우리는 160에서 미터 to 픽셀 비율을 가지고 있습니다. 우리는 600x600 이미지를 가지고 있습니다 (너비, 높이) 이제 우리는 이것을 (600/160) = 3,75로 계산합니다.
그리고 지금 이미지가 화면의 3/20을 채울 것입니다.

우리의 스크린은 20x20이고 우리의 이미지는 3,75입니다.

짧은 답변 : 뷰포트에 고정 된 크기 (몇 개의 Box2d 단위 (미터))를보고 계산 된 크기가 아닌지)를 지정하고 뷰포트에 새 캠을 추가하거나 기존을 추가하십시오.

OrthographicCamera cam = new OrthographicCamera(); 
cam.setToOrtho(false, 20,20); 
Stage.setViewport(new FitViewport(20,20,cam)); 
+0

어쩌면 내가 바보이지만 내가하는 일이 아닌가? 고정 된 크기의'stage = new Stage (new FitViewport (20f, 20f)) '를 넣어도 여전히 작동하지 않습니다. – Jorj

+0

이제 뷰포트의 크기가 box2d의 관점에서 괜찮습니다. 당신의 이미지가 당신의 문제입니다. 시작일 때 얼마나 큰가요? 요금을 정한 후에 얼마나 큽니까? 두 번째 문제는 귀하의 뷰포트입니다 같음 너비 높이 (새 정사각형 카메라 (false, 20,20) – Keey

+0

전에 400x320과 2.5x2 후 – Jorj