2016-10-18 2 views
0

敵に触れたときにゲームのスコアに+1したい、私はaddListenertouchDownの2つの方法を試しましたが、私のために働かなかったか、私はそれらを正しく使用しませんでした。Libgdx:敵に触れたかどうかを検出する方法は?

敵オブジェクトがuserDataクラスとActorクラスにリンクされている場合、敵の列挙型クラス内で敵のさまざまなサイズを再編成し、敵が画面の上部からボットに移動するようにします。敵が触れた場合

public class GameStage extends Stage { 
    // This will be our viewport measurements while working with the debug renderer 
    private static final int VIEWPORT_WIDTH = 13; 
    private static final int VIEWPORT_HEIGHT = 20; 

    private World world; 
    private Ground ground; 
    private Enemy enemy; 
    private final float TIME_STEP = 1/300f; 
    private float accumulator = 0f; 
    private Rectangle bounds; 
    private Vector3 touchPoint = new Vector3();; 
    private int score; 
    private String yourScoreName; 
    BitmapFont yourBitmapFontName; 
    private SpriteBatch batch; 
    private OrthographicCamera camera; 
    private Box2DDebugRenderer renderer; 

    public GameStage() { 
     world = WorldUtils.createWorld(); 
     renderer = new Box2DDebugRenderer(); 
     Gdx.input.setInputProcessor(this); 
     batch = new SpriteBatch(); 
     score = 0; 
     yourScoreName = "score: 0"; 
     yourBitmapFontName = new BitmapFont(); 
     setUpWorld(); 
     setUpCamera(); 
    } 

    public void setUpWorld(){ 
     world = WorldUtils.createWorld(); 
     setUpGround(); 
     createEnemy(); 
    } 

    private void setUpGround(){ 
     ground = new Ground (WorldUtils.createGround(world)); 
     addActor(ground); 
    } 

    private void createEnemy() { 
     enemy = new Enemy(WorldUtils.createEnemy(world)); 

    // (1) *****using addListener method 
     enemy.addListener(new InputListener() 
     { 
      @Override 
      public boolean touchDown(InputEvent event, float x, float y, 
            int pointer, int button) 
      { 
       score++; 
       yourScoreName = "score: " + score; 
       return true; 
      } 
     }); 
     /*enemy.addListener(new ClickListener() { 
      public void clicked() { 
       world.destroyBody(enemy.getBody()); 
      }});*/ 
     //bounds = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight()); 
     addActor(enemy); 

    } 

    private void setUpCamera() { 
     camera = new OrthographicCamera(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 
     camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0f); 
     camera.update(); 
    } 

    @Override 
    public void act(float delta) { 
     super.act(delta); 
     checkEnemy(); 

     // Fixed timestep 
     accumulator += delta; 

     while (accumulator >= delta) { 
      world.step(TIME_STEP, 6, 2); 
      accumulator -= TIME_STEP; 
     } 

     //TODO: Implement interpolation 

    } 

    private void checkEnemy(){ 
     final Body body = enemy.getBody(); 
     UserData userData = enemy.getUserData(); 

     bounds = new Rectangle(enemy.getBody().getPosition().x, enemy.getBody().getPosition().y, enemy.getUserData().getWidth(), enemy.getUserData().getHeight()); 
     // bounds = new Rectangle(body.getPosition().x, body.getPosition().y,userData.getWidth() ,userData.getHeight()); 

     if (!BodyUtils.enemyInBounds(body,userData)){ 
      world.destroyBody(body); 
      createEnemy();} 
    } 

    public World getWorld(){ 
     return world; 
    } 

// (2) ****using TouchDown method 
     @Override 
     public boolean touchDown(int x, int y, int pointer, int button) { 

      // Need to get the actual coordinates 
      translateScreenToWorldCoordinates(x, y); 
      // score++; 
      // yourScoreName = "score: " + score; 
      if(enemyTouched(touchPoint.x,touchPoint.y)){ 
       // world.destroyBody(enemy.getBody()); 
       score++; 
       yourScoreName = "score: " + score; 
      } 
      return super.touchDown(x, y, pointer, button); 
     } 
    private boolean enemyTouched(float x, float y) { 
     return bounds.contains(x, y); 
    } 

    private void translateScreenToWorldCoordinates(int x, int y) { 
     getCamera().unproject(touchPoint.set(x, y, 0)); 
    } 




    @Override 
    public void draw() { 
     super.draw(); 
     batch.begin(); 
     yourBitmapFontName.setColor(1.0f, 1.0f, 1.0f, 1.0f); 
     yourBitmapFontName.draw(batch, yourScoreName, 25, 100); 
     batch.end(); 
     enemy.setBounds(enemy.getBody().getPosition().x,enemy.getBody().getPosition().y,enemy.getUserData().getWidth(),enemy.getUserData().getHeight()); 
     renderer.render(world, camera.combined); 
    } 
} 

画面を私のゲームから:?

+0

ステージ(スーパークラス)のビューポートは、外部で操作していない限り、設定していません。実際のステージは、サブクラスで設定したこのセカンダリカメラについては何も知らず、シェイプレンダラーだけを使用しています。 – Tenfour04

+0

あなたの返事をありがとう、私はそのPLZを行う方法を示すことができます、私はウィリアムモラチュートリアルからの俳優のためのタッチイベントをdtectしようとしている、私はlibgdxのnwebieだ、そしてこの問題は今日まで私を停止 –

+0

投稿Libgdxのフォーラムで。このサイトを歩くには多すぎます。 – Tenfour04

答えて

0

それは(addListener()方法で)あなたがそれをやったように動作しなければならない。しかし、あなたは正しいを設定する必要があります。の境界アクター(幅、高さ、位置):actor.setBounds(x, y, width, height)。私は体を使ってこれらの値を得るでしょう。 InputListenerの代わりにClickListenerを使用することもできます。

+0

敵のgetBody(enemy.getBody()、getPosition()、x、enemy.getBody()。getPosition()。y、enemy.getUserData().getWidth()、enemy。 getUserData()。getHeight()); 私はそれを試しても動作しません。境界線X、Y、WIDTH、HEIGHTの前にEnemyTyp列挙型でGameStageクラスではないものを初期化しました。 –

+0

'WorldUtils.createEnemy(world)'メソッドで作成したボディを使用します。境界が0でないことを確認してください(例えば、ロギングの 'Gdx.app.log()')。 – Marius

+0

私の質問を見てみることができます私は私のゲームから画像を設定する、私はタッチイベントを適用する固定座標で敵を作ろうとしますが、タッチイベントは検出されません –

関連する問題