首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java/libGDX - Actions.fadeIn()和Actions.fadeOut()问题

Java/libGDX - Actions.fadeIn()和Actions.fadeOut()问题
EN

Stack Overflow用户
提问于 2016-08-30 21:43:56
回答 3查看 1.5K关注 0票数 2

这是我第一次发帖,我是自学的,所以请温柔一点!

我一直在使用游戏和屏幕类在libGDX中构建一个轰炸机复制游戏:

代码语言:javascript
复制
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);
}

然而,当游戏启动时,没有褪色效果。

代码语言:javascript
复制
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,从黑色:

(来自主班)

代码语言:javascript
复制
@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()方法:

代码语言:javascript
复制
public class TrophyScreen implements Screen {
...
@Override
public void show()  {
    stage.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(1)));
}

我已经做了大量的搜索和尝试各种事情,但没有joy。我确信,我遗漏了什么东西在某个地方的一个抽签()或呈现()方法,是防止淡出行动的发生。

UPDATE1

代码语言:javascript
复制
@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();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-31 18:18:43

对于褪色的演员,他们必须正确地应用他们自己的颜色的阿尔法在抽签方法。要使整个对象层次结构一次淡出,它们都必须应用抽签方法签名中的parentAlpha参数。

因此,您在任何自定义Actor子类中的绘制方法应该如下所示:

代码语言:javascript
复制
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时,任何重叠的其他参与者都会互相显示。另一种选择是在整个场景上画一张背景(或黑色)的副本,然后淡出,这样才能提供干净的外观。

票数 2
EN

Stack Overflow用户

发布于 2016-08-31 11:53:33

我假设level是类的对象,它扩展了Stage,并且在舞台内部创建了一个控件,这是很奇怪的。您没有将颜色应用到您的font_text中,我认为它是一个BitmapFont

解决方案,怪异的方式

如果你想这样做,你就需要这样的东西:

代码语言:javascript
复制
@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,它是一个演员,谁显示一个文本。演员为你做的工作:

代码语言:javascript
复制
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);

然后,您可以应用操作,它们将很好地工作(每个参与者都可以应用自己的操作)。

代码语言:javascript
复制
stage.addAction(Actions.sequence(Actions.alpha(0), Actions.fadeIn(5)));
label.addAction(Actions.moveBy(0, 300, 15));

有许多不同的演员,如TextButton,图像,ScrollPane。它们是可定制的,易于管理,并且可以集成到组和表中。

输出:

票数 1
EN

Stack Overflow用户

发布于 2019-07-11 17:08:23

一个更好的方法是从每件事情上画一个黑色的图像开始,这样你就不用去处理每个场景对象的alpha了。用分层的方式来做。This post可能会有帮助。

然后,您可以控制它的alpha通道,将其呈现为0,然后再取消游戏操作,以使其恢复绘制周期。在舞台结束时重新激活它,以达到褪色效果。

谢谢你太疯狂了,这样好多了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39237559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档