簡體   English   中英

Libgdx輸入在Android上不起作用

[英]Libgdx Input don't working on Android

我是Libgdx的新手,正在嘗試制作可以使用Camera探索的地圖。 我在自己的Map類中實現了GestureListener

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類的資源。 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 ,以在觸摸該LocationPoint時做出事情。 在android上玩游戲時,LocationPoints事件和Map pan事件均會發生。 但是,當我移動相機后,當我觸摸LocationPoint時,不會觸發該Point事件。

但是,當我將相機恢復到初始位置時,LocationPoints事件運行良好! 你能幫助我嗎? (對不起,我的英語不好...)

  • Actor已經是子級,因此請從draw()方法中刪除多余的調用。

     for(int i = 0; i < numOfPoints; i++) { points[i].draw(batch, 1); addActor(points[i]); // <-- Not Should be in draw() call } 
  • 具有默認構造函數創建的自己的SpriteBatch Stage,可以使用該SpriteBatch或在Stage構造函數中傳遞自己的批處理。

    使用getBatch()的方法Stage ,如果你想自己畫點什么。

  • Map類中創建攝影機也是多余的,使用返回舞台攝影機的getViewport().getCamera()可以將其類型轉換為OrthographicCamera

  • 調用super.dispose(); 在您的dispose()方法中


自己繪制所有演員? 如果您沒有做超出范圍的事情,則無需重寫Stage draw()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM