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