LibGDX阶段和参与者、事件和参与者属性

LibGDX阶段和参与者、事件和参与者属性,libgdx,screen,actor,stage,Libgdx,Screen,Actor,Stage,我刚刚开始用LibGdx框架开发android游戏。 到目前为止,我读了很多在线教程,读得越多,我就越感到困惑:应用程序列表、应用程序适配器、舞台、游戏、屏幕、演员、精灵、图像。。。不提输入和手势(所有king的听众) 我终于明白了我心目中的游戏(一种益智游戏)应该使用什么样的“模型”:游戏、屏幕、舞台和演员 这是我的第一个代码 这是主要应用程序(游戏): 这是主屏幕类: package com.my.game1; import com.badlogic.gdx.Gdx; import com

我刚刚开始用LibGdx框架开发android游戏。 到目前为止,我读了很多在线教程,读得越多,我就越感到困惑:应用程序列表、应用程序适配器、舞台、游戏、屏幕、演员、精灵、图像。。。不提输入和手势(所有king的听众)

我终于明白了我心目中的游戏(一种益智游戏)应该使用什么样的“模型”:游戏、屏幕、舞台和演员

这是我的第一个代码

这是主要应用程序(游戏):

这是主屏幕类:

package com.my.game1;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.Stage;

public class StarterScreen implements Screen {

    private Stage stage;
    private float screenW, screenH;
    private Tess tessera;

    @Override
    public void show() {
        tessera = new Tess("image.png");
        stage = new Stage();
        screenW = stage.getViewport().getWorldWidth();
        screenH = stage.getViewport().getWorldHeight();
        Gdx.input.setInputProcessor(stage);
        stage.addActor(tessera);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.act();
        stage.draw();
    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void hide() {
        dispose();
    }

    @Override
    public void dispose() {
        stage.dispose();
    }  

}
下面是扩展Actor的类:

package com.my.game1;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;

public class Tess extends Actor {

    private Texture texture;
    private boolean selected = false;

    public Tess (String img) {
        this.texture = new Texture(Gdx.files.internal(img));
        this.setBounds(0f, 0f, this.texture.getWidth(), this.texture.getHeight());
        this.setOrigin(this.texture.getWidth() / 2, this.texture.getHeight() / 2);
        this.setScale(0.25f);
        this.addListener(new ActorGestureListener() {
            public void tap(InputEvent event, float x, float y, int pointer, int button) {
                ((Tess)event.getTarget()).toggleSelect();
                ((Tess)event.getTarget()).setColor(0.5f, 0f, 0.5f, 1f);
            }
        });
    }

    @Override
    public void draw(Batch batch, float alpha){
        batch.draw(texture, 0, 0);
    }

    public void finalize() {
        this.texture.dispose();
    }

    public void toggleSelect(){
        this.selected = !this.selected;
        if (this.selected == true)
            this.setColor(0.5f, 0f, 0.5f, 1f);
        else
            this.setColor(0f, 0f, 0f, 0f);          
    }
}
屏幕上正确显示了演员,但我无法设置演员的位置或比例,也无法检测到“点击”事件;而且颜色不变


我做错了什么?

有几件事是错的。首先,顺便说一下,您不想从屏幕的
hide()
方法调用
dispose()
hide()
只需在屏幕关闭或应用程序切换到后台时调用,在此期间处理
屏幕将导致严重的恢复问题

这样一来,你的演员应该是这样的:

package com.my.game1;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Touchable;

public class Tess extends Actor {

    private Sprite sprite;
    private boolean selected = false;

    public Tess (String img) {
        this.sprite = new Sprite(new Texture(Gdx.files.internal(img)));
        this.setTouchable(Touchable.enabled);
        this.setBounds(this.sprite.getX(), this.sprite.getY(), this.sprite.getWidth(), this.sprite.getHeight());
        this.setOrigin(this.sprite.getWidth() / 2, this.sprite.getHeight() / 2);
        this.setScale(0.25f);
        this.addListener(new ActorGestureListener() {
            @Override
            public void tap (InputEvent event, float x, float y, int pointer, int button) {
                ((Tess)event.getTarget()).toggleSelect();
            }
        });
    }

    @Override
    public void draw(Batch batch, float alpha){
        sprite.draw(batch);
    }

    @Override
    public void positionChanged(){
        sprite.setPosition(getX(), getY());
    }

    public void toggleSelect(){
        this.selected = !this.selected;
        if (this.selected == true)
            sprite.setColor(0.5f, 0f, 0.5f, 1f);
        else
            sprite.setColor(0f, 0f, 0f, 0f);          
    }
}
改变的第一件事:您应该使用
精灵
,而不是
纹理
,来轻松处理颜色、绘图和变换<代码>纹理
是可能的,但不像<代码>精灵那样简单

接下来,您需要在actor内部调用
setTouchable(Touchable.enabled)
以实际启用命中检测。如果没有此选项,则不会将任何触摸事件传递给
参与者

之后,使用
setBounds()
,您需要使用
sprite.getX()
sprite.getY()
,以利用
sprite
的位置值。将它们设置为任意数字似乎会禁用该演员的任何触摸能力

另一件事,如果一切正常的话,就是每次触摸都要设置两次颜色,一次是基于
所选的
字段,然后直接设置为深紫色,所以我删除了第二组,只使用了切换方法

接下来,由于我们现在有了一个
Sprite
,我们可以使用附加到
Sprite
本身的
draw()
方法,并将
Batch
提供给它,而不是调用
Batch
的draw


最后,当您想要更改图像的位置时,请在演员本身上调用
setPosition
,并利用
positionChanged()
方法的覆盖来根据
演员的新位置设置
精灵的位置。

谢谢。你给了我一些好建议。我从hide()方法中删除了dispose()调用;一开始那是一个闪屏,所以我打算在它被隐藏后处理它。。。因为不太有用。关于ActorGestureListener,我向您保证它有一个tap()方法。我还不太了解事件和事件侦听器,所以我从教程中复制了代码。也许这只是因为我使用了纹理而不是精灵,我将边界设置为0,0和纹理的大小。我仍然需要改进一些方面,但现在它起作用了,我认为我走在了正确的道路上。谢谢。啊,现在我看到
tap()
。我一定看错了。我更新了我的答案以反映这一点(以及ActorGestureListener也有着触地和着地方法的事实)。如果这对你有效,我能得到一个接受的答案吗?我看不到
精灵在任何地方被丢弃。如何处置
精灵
?您不处置精灵。处理指定给精灵的纹理。只有在给精灵一个变量之前,你才能这样做。
package com.my.game1;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.Touchable;

public class Tess extends Actor {

    private Sprite sprite;
    private boolean selected = false;

    public Tess (String img) {
        this.sprite = new Sprite(new Texture(Gdx.files.internal(img)));
        this.setTouchable(Touchable.enabled);
        this.setBounds(this.sprite.getX(), this.sprite.getY(), this.sprite.getWidth(), this.sprite.getHeight());
        this.setOrigin(this.sprite.getWidth() / 2, this.sprite.getHeight() / 2);
        this.setScale(0.25f);
        this.addListener(new ActorGestureListener() {
            @Override
            public void tap (InputEvent event, float x, float y, int pointer, int button) {
                ((Tess)event.getTarget()).toggleSelect();
            }
        });
    }

    @Override
    public void draw(Batch batch, float alpha){
        sprite.draw(batch);
    }

    @Override
    public void positionChanged(){
        sprite.setPosition(getX(), getY());
    }

    public void toggleSelect(){
        this.selected = !this.selected;
        if (this.selected == true)
            sprite.setColor(0.5f, 0f, 0.5f, 1f);
        else
            sprite.setColor(0f, 0f, 0f, 0f);          
    }
}