2016-12-06 6 views
0

사과를 화살표로 촬영하는 게임을 만들고 있습니다. Apple의 위치는 사용자 입력의 XY 위치이며 화살표 액터는 코드 actor.moveto를 사용하여 해당 위치로 이동해야합니다. 문제는 화살표가 사용자 입력 방향으로 한 번만 이동한다는 것입니다. moveArray 액션은 stageArrow를 호출 할 때 초당 여러 번 업데이트된다는 것을 알고 있습니다. 업데이트 메소드에서 작동하므로 화살표가 한 번만 움직이는 이유가 궁금합니다.스테이지의 액터가 MoveTo XY 위치를 업데이트하지 않습니다.

appleclass.java 어떤 도움이 높게 평가 될 것이다

public class ArrowClass extends Actor { 
    MainApp app; 
    AppleClass appleClass; 
    public Texture arrowTexture; 

    public ArrowClass(final MainApp app){ 
     this.app = app; 
     arrowTexture = new Texture("medievalarrow.png"); 
     this.setSize(arrowWidth, arrowHeight); 
     this.setTouchable(Touchable.enabled); 
     this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight); 
     this.setOrigin(0,0); 

} 
@Override 
    public void draw(Batch batch, float parentAlpha) { 
     super.draw(batch, parentAlpha); 


     final float delta = Gdx.graphics.getDeltaTime(); 
     this.act(delta); 

     app.batch.begin(); 
     app.batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight()); 
     app.batch.end(); 

    } 
} 

public class AppleClass implements Screen { 

Arrow arrow; 
private final MainApp app; 
public Image ShotImage; 

public AppleClass(final MainApp app){ 
     this.app = app; 
     this.stageApple = new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera)); 
     this.stageArrow =new Stage(new StretchViewport(app.screenWidth,app.screenHeight , app.camera)); 

     arrow = new ArrowClass(app); 

    } 

@Override 
    public void show() { 

     InputMultiplexer inputMultiplexer = new InputMultiplexer(); 
     inputMultiplexer.addProcessor(stageApple); 
     inputMultiplexer.addProcessor(stageArrow); 
     Gdx.input.setInputProcessor(inputMultiplexer); 

     arrow(); 

    } 

    public void arrow(){ 
     arrow.isTouchable(); 
     stageArrow.addActor(arrow); 
     arrow.addAction((moveTo(Gdx.input.getX(),Gdx.input.getY(),0.3f))); //===> only executes once. 
     arrow.addListener(new InputListener(){ 
      public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor){ 


      if (Gdx.input.isTouched()){ 
         ShotImage.setVisible(true); 

          } 
         } 
        });} 

} 

@Override 
    public void render(float delta) {       

     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     update(delta); 
} 

public void update(float deltaTime){ 


     stageApple.draw(); 
     stageArrow.draw(); 

     stageApple.act(deltaTime); 
     stageArrow.act(deltaTime); 


    } 

ArrowClass.java : 여기에 내 코드입니다. 감사.

답변

1

ArrowClass '그리기 방법에서 this.act(delta)을 호출하기 때문에 문제라고 생각합니다. Stage#act()으로 전화하면 모든 배우의 act 메소드가 호출됩니다. 드로잉을 할 때 한 번만 호출하고 스테이지를 업데이트 할 때 다시 호출하기 때문에 정상 속도의 두 배로 움직이며 목적지에 일찍 도달 할 수 있습니다. 내가 할 수있는 경우 코드에 대한

몇 가지 다른 의견 : 당신이 Scene2D.UI을 사용하지 않는

첫째, 당신은 아마 두 개의 스테이지를 싶지 않아, 당신은 일반적으로 화살표와 애플의 단일 단계 것 배우로 추가되었습니다.

둘째, Actor#draw()을 덮어 쓰면 앱에서 제공하는 대신 렌더링을 수행하는 데 필요한 일괄 처리를 사용해야합니다. 또한 그리기 방법 내에서 begin()end()으로 전화하기를 원하지 않습니다.이 방법은 '비싸기'때문에 프레임 당 한 번만 호출하려고합니다. 그러나 draw()에 전달 된 일괄 처리 만 사용하는 경우 Stage 클래스는 시작 및 끝 처리를 처리하므로 명시 적으로 호출 할 필요가 없습니다.

세 번째로 실제로는 super.draw(batch, parentAlpha)을 호출 할 필요가 없습니다. 이는 Actor 클래스에서 비어있는 메소드이기 때문입니다.

public class ArrowClass extends Actor { 
    AppleClass appleClass; // You never set this; you may not need it 
    Texture arrowTexture; 

    public ArrowClass(MainApp app, arrowWidth, arrowHeight) { 
     arrowTexture = new Texture("medievalarrow.png"); 
     this.setSize(arrowWidth, arrowHeight); 
     this.setTouchable(Touchable.enabled); 
     this.setBounds(app.screenWidth*0.45f,0,arrowWidth,arrowHeight); 
     this.setOrigin(0,0); 

} 
@Override 
    public void draw(Batch batch, float parentAlpha) { 
     batch.draw(arrowTexture, getX(),getY(),getWidth(),getHeight()); 
    } 
} 
+0

당신이 여기 내 질문에서 봐 주시기 바랍니다 수 : http://gamedev.stackexchange.com/questions/135748/how-to-

따라서, 클래스는 다음과 같이 단순화 될 수있다 아라 일주하는 사람을 배우로 만들고 배우와 무대에 서기 – JAlmazan