2016-12-06 8 views
0

私はリンゴが矢印で撮影されているゲームを作成しています。リンゴの位置は、ユーザー入力のXY位置であり、矢印アクタはコードactor.movetoを使用してその位置に移動する必要があります。問題は、矢印がユーザー入力の方向に1回だけ移動することです。 updateメソッドでstageArrow.actを呼び出したときに、アクターのmoveToアクションが毎秒何度も更新されるので、なぜ矢印が1回だけ動くのだろうと思います。ステージのアクタが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メソッドが呼び出されます。ステージを更新するときに描画すると一度呼び出すので、通常の速度の2倍の速度で移動しているため、ステージが早期に到達する可能性があります。あなたのコードについて

他のいくつかのコメントが、私は可能性がある場合、:あなたはScene2D.UIを使用している場合を除き

まず、あなたはおそらく二つの別々のstages-を望んでいない、あなたは通常、矢印とAppleと単一のステージを持っているでしょう俳優としてそれに加えられた。

第2に、Actor#draw()をオーバーライドするときは、アプリからのものを使用する代わりにレンダリングを行うために渡したバッチを使用する必要があります。また、あなたの描画方法の中でbegin()end()を呼びたくはありません。これらは「高価」で、フレームごとに1回だけ呼び出すことができます。ただし、draw()に渡されたバッチを使用するだけであれば、Stageクラスはあなたの開始と終了を処理し、明示的に呼び出す必要はありません。

第3に、実際に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

関連する問題