这是我第一次发帖,我是自学的,所以请温柔一点!
我一直在使用游戏和屏幕类在libGDX中构建一个轰炸机复制游戏:
public class Main extends Game {
...
@Override
public void create() {
levelScreen = new LevelScreen(playerCount, new int[playerCount]);
levelScreen.level.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(2f)));
this.setScreen(levelScreen);
}然而,当游戏启动时,没有褪色效果。
public class LevelScreen implements Screen {
...
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 0.1f, 0.5f, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
level.act();
level.draw();
batch.end();
}我希望这个levelScreen从黑色淡入,但它就是没有!
当回合结束时,我想把这个fadeOut的levelScreen改为黑色,然后从fadeIn到trophyScreen,从黑色:
(来自主班)
@Override
public void render() {
super.render();
if (endRoundTimer <= 0) {
trophyScreen = new TrophyScreen(playerCount, levelScreen.getScore());
levelScreen.level.addAction(Actions.sequence(Actions.fadeOut(1), Actions.run(new Runnable() {
@Override
public void run() {
setScreen(trophyScreen);
}
})));
}
}我尝试在TrophyScreen中使用show()方法:
public class TrophyScreen implements Screen {
...
@Override
public void show() {
stage.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(1)));
}我已经做了大量的搜索和尝试各种事情,但没有joy。我确信,我遗漏了什么东西在某个地方的一个抽签()或呈现()方法,是防止淡出行动的发生。
UPDATE1
@Override public void draw() {
super.draw();
if (roundOver) {
this.getBatch().begin(); String s = String.format("%s", message);
font_text.draw(this.getBatch(), s, (90 + (2 * 30)), (this.getHeight() / 2));
this.getBatch().end();
}发布于 2016-08-31 18:18:43
对于褪色的演员,他们必须正确地应用他们自己的颜色的阿尔法在抽签方法。要使整个对象层次结构一次淡出,它们都必须应用抽签方法签名中的parentAlpha参数。
因此,您在任何自定义Actor子类中的绘制方法应该如下所示:
public void draw (Batch batch, float parentAlpha) {
Color color = getColor();
batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
//..do drawing
}如果您要在Actor中使用雪碧而不是TextureRegion (由于冗余,我不建议使用它),则必须将颜色应用于雪碧而不是批处理。
请注意,这种方法淡出整个游戏并不是一个“干净”的淡出。在淡出过程中,当父alpha小于1时,任何重叠的其他参与者都会互相显示。另一种选择是在整个场景上画一张背景(或黑色)的副本,然后淡出,这样才能提供干净的外观。
发布于 2016-08-31 11:53:33
我假设level是类的对象,它扩展了Stage,并且在舞台内部创建了一个控件,这是很奇怪的。您没有将颜色应用到您的font_text中,我认为它是一个BitmapFont
解决方案,怪异的方式
如果你想这样做,你就需要这样的东西:
@Override public void draw() {
super.draw();
if (roundOver) {
getBatch().begin();
String s = String.format("%s", message);
font_text.setColor(getRoot().getColor())
font_text.draw(this.getBatch(), s, (90 + (2 * 30)), (this.getHeight() / 2));
getBatch().end();
}
}getRoot()从Stage获得Group,我们这样做,因为应用到Stage的每个动作实际上都应用于这个Group root元素。我们得到颜色(其中有alpha通道),并将颜色复制到bitmapFont。
这个解决方案很奇怪,因为您实际上是在Stage中创建一个Stage。这是没有意义的,演员在舞台上表演,而不是在里面。
解决方案,的好方法
你想画文字,对吧?所以,只需使用Label,它是一个演员,谁显示一个文本。演员为你做的工作:
stage = new Stage();
Label.LabelStyle labelStyle = new Label.LabelStyle(bitmapFont, Color.WHITE);
Label label = new Label("Hi, I am a label!", labelStyle);
stage.addActor(label);然后,您可以应用操作,它们将很好地工作(每个参与者都可以应用自己的操作)。
stage.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(5)));
label.addAction(Actions.moveBy(0, 300, 15));有许多不同的演员,如TextButton,图像,ScrollPane。它们是可定制的,易于管理,并且可以集成到组和表中。
输出:

发布于 2019-07-11 17:08:23
一个更好的方法是从每件事情上画一个黑色的图像开始,这样你就不用去处理每个场景对象的alpha了。用分层的方式来做。This post可能会有帮助。
然后,您可以控制它的alpha通道,将其呈现为0,然后再取消游戏操作,以使其恢复绘制周期。在舞台结束时重新激活它,以达到褪色效果。
谢谢你太疯狂了,这样好多了。
https://stackoverflow.com/questions/39237559
复制相似问题