2017-07-18 80 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,它的工作原理。我不知道这些冗余代码可能是负责任的。 –