2017-07-18 69 views
0

我是Libgdx的新用戶,我試圖製作可以使用Camera進行探索的地圖。我在自己的Map課上實施GestureListenerLibgdx輸入在Android上不起作用

public class Map extends Stage implements GestureListener { 

    public String mapName; 
    private Sprite background; 
    public LocationPoint points[]; 
    private OrthographicCamera camera; 
    private Batch batch; 
    public Music anbientSound; 
    public int numOfPoints; 
    public int locationsX[]; 
    public int locationsY[]; 


    public Map(Sprite background) { 
     this.background = background; 
    } 


    public Sprite getBackground() { 
     return background; 
    } 


    public void activate() { 

     InputMultiplexer inputChain = new InputMultiplexer(); 

     if(points==null) { 
      points = new LocationPoint[numOfPoints]; 
      for(int i = 0; i < numOfPoints; i++) { 
       points[i] = new LocationPoint(locationsX[i], locationsY[i]); 
       addActor(points[i]); 
      } 
     } 

     batch = GameUtils.batch; 
     camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0); 
     camera.update(); 

     Music music = GameUtils.addMusic(anbientSound); 
     music.setLooping(true); 
     music.play(); 

     inputChain.addProcessor(this); 
     inputChain.addProcessor(new GestureDetector(this)); 

     Gdx.input.setInputProcessor(inputChain); 
    } 


    public void draw() { 

     Gdx.gl20.glClearColor(0, 0, 0, 1); 
     Gdx.gl20.glClear(Gdx.gl20.GL_COLOR_BUFFER_BIT); 

     Batch batch = this.batch; 
     batch.setProjectionMatrix(camera.combined); 

     batch.begin(); 
     background.draw(batch); 
     batch.end(); 

     batch.begin(); 

     for(int i = 0; i < numOfPoints; i++) { 
      points[i].draw(batch, 1); 
      addActor(points[i]); 
     } 

     batch.end(); 
    } 


    public void dispose() { 
     GameUtils.stopMusic(); 
     background.getTexture().dispose(); 
     anbientSound.dispose(); 
    } 


    @Override 
    public boolean pan(float x, float y, float deltaX, float deltaY) { 
    camera.translate(-deltaX, deltaY); 

     float initialX = camera.viewportWidth/2; 
     float initialY = camera.viewportHeight/2; 

     GameUtils.limitBound(camera, initialX, initialY, background.getWidth(), background.getHeight()); 
    camera.update(); 

     return true; 
    } 


    @Override 
    public boolean touchDown(float x, float y, int pointer, int button) { 
     return false; 
    } 


    @Override 
    public boolean tap(float x, float y, int count, int button) { 
     return false; 
    } 


    @Override 
    public boolean longPress(float x, float y) { 
     return false; 
    } 


    @Override 
    public boolean fling(float velocityX, float velocityY, int button) { 
     return false; 
    } 


    @Override 
    public boolean panStop(float x, float y, int pointer, int button) { 
     return false; 
    } 


    @Override 
    public boolean zoom(float initialDistance, float distance) { 
     return false; 
    } 


    @Override 
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, 
Vector2 pointer1, Vector2 pointer2) { 
     return false; 
    } 


    @Override 
    public void pinchStop() {} 

} 

方法activate()用於激活Map類的資源。班級地圖也有一個叫做LocationPointsImageButtons

public class LocationPoint extends ImageButton { 

    private Monster monster; 
    private Trap trap; 
    public boolean occuped; 
    public boolean isTrap; 
    public int f = 20; 
    public int k = 20; 


    public LocationPoint(float x, float y) { 
     super(GameUtils.getLocationDrawable()); 
     this.setSize(46, 46); 
     setPosition(x, y); 
     addListener(new InputListener(){ 
      @Override 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
       setPosition(f, k); 
       f += 10; 
       k += 10; 
       return super.touchDown(event, x, y, pointer, button); 
      } 
     }); 
    } 


    public void occup(Monster monster) { 
     this.monster = monster; 
     occuped = true; 

     if(isTrap) 
      captured(); 

    } 

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


    public void empty() { 
     monster = null; 
     occuped = false; 
    } 

    public void captured() { 
     monster.capture(); 
    } 


    public Monster getMonster() { 
     return monster; 
    } 

} 

在LocationPoint類中,我添加了一個InputListener來創建一個當該位置點被觸摸時的事物。 當在android上玩這個遊戲時,LocationPoints事件和Map pan事件。但是在移動相機之後,當我觸摸LocationPoint時,它不會觸發該點事件。

但是,當我將相機返回到初始位置時,LocationPoints事件正常工作!你可以幫我嗎? (對不起,我的英文破碎......)

回答

1
  • 演員已經是小孩了,所以從draw()方法刪除多餘的電話。

    for(int i = 0; i < numOfPoints; i++) { 
        points[i].draw(batch, 1); 
        addActor(points[i]);    // <-- Not Should be in draw() call 
    } 
    
  • 舞臺有自己SpriteBatch通過默認構造函數創建,使用一個或Stage構造通過自己的批次。

    使用getBatch()方法Stage如果你想自己畫東西。

  • 創建於Map攝像頭等也是多餘的,使用getViewport().getCamera()返回舞臺的攝像頭,可以強制轉換爲OrthographicCamera

  • 通話super.dispose();dispose()方法


內部描繪所有的演員由你自己?如果你沒有做超出範圍的事情,則不需要重寫draw()方法Stage

+1

Thx,它的工作原理。我不知道這些冗餘代碼可能是負責任的。 –