2016-08-30 13 views
2

初めての投稿です。私は独学で教えていますので、やさしくしてください!Java/libGDX - Actions.fadeIn()とActions.fadeOut()との問題

私はゲームを使用して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(); 
} 

このレベルのスクリーンを黒からフェードインしたいが、それはちょうどしない!

私は、黒からtrophyScreenにフェードイン、黒にこのlevelScreenのフェードアウトしたいの上に丸いです:

(メインクラスから)

@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))); 
} 

私は、検索の負荷を行い、様々なものが、無喜びを試みました。私はdraw()やrender()メソッドのどこかで、フェードアクションの実行を妨げている何かが欠けていると確信しています。

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(); 
} 
+0

アニメーションのフェードには何を使用していますか? –

+0

'LevelScreen.level'クラスの' draw'メソッドを表示してください。 Tenfour04 @私は、libgdxアクションクラスを使用して、アクションシーケンスを作成、フェードイン(フロート期間)を0にアルファを設定しています – Tenfour04

+0

@ZeRubeus – CChapman01

答えて

2

俳優上で動作するようにフェージングのために、彼らは適切にdrawメソッドで独自の色のアルファを適用する必要があります。また、オブジェクトの階層全体が一度に消えるには、すべて描画メソッドのシグネチャからparentAlphaパラメータを適用する必要があります。

だからあなたのdrawメソッド任意のカスタム俳優サブクラスはこのようになるはずで:あなたは(私が原因冗長性にはお勧めしません)あなたの俳優の代わりに、TextureRegionでスプライトを使用している場合は

public void draw (Batch batch, float parentAlpha) { 
    Color color = getColor(); 
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
    //..do drawing 
} 

バッチの代わりにスプライトにカラーを適用する必要があります。ゲーム全体を退色するこの方法は、「クリーン」なフェードではないことを

注意。フェード中に親アルファが1未満の場合、他のアクタと重なっているアクタは互いに見せ合います。きれいなフェードを提供する代替案は、あなたの背景全体(または黒色)のコピーをシーン全体に描き、その代わりにフェードすることです。

1

私はlevelStageを拡張し、あなたは奇妙なステージ、内部コントロールを作成しているクラスのオブジェクトであることを前提としています。あなたは、あなたがそのような何かが必要になります。この方法でそれをしたい場合、私はそれがBitmapFont

ソリューション、奇妙な方法

であると仮定しているあなたのfont_textに色をアプリングされていません。

@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()は、ステージから適用されるすべてのアクションが実際にこのGroup root要素に適用されるため、ステージからGroupを取得します。色(アルファチャンネルを持つ)を取得し、その色をbitmapFontにコピーします。

実際にLabelStageに作成しているので、この解決策は奇妙です。無意味ですが、俳優はステージではなく内部で演じます。あなたが右のテキストを、描きたい

ソリューション、

良い方法はありますか?テキストを表示する俳優である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、Image、ScrollPaneなどのさまざまなアクターがあります。カスタマイズ可能で管理が容易で、グループやテーブルに統合できます。

出力:

Animated output

+0

は、あなたの答えをありがとう、あなたが拡張し、正しい 'level'があるクラスオブジェクトです参照してください。ステージ。そして、私は 'BitmapFont'を使っています。私がしたいことは、ゲームの開始時にステージ全体(レベル)をフェードアウトさせることです。だから、すべてのアクターがフェードインします。私は、メッセージの内容として 'super.draw()'を呼び出す時点で、ラウンドが終了したときにのみ起こります。うまくいけばそれは理にかなっている。 – CChapman01

+0

私の答えはあなたを助けませんでしたか?私はあなたが何をしようとしているのか知っています。なぜなら、GIFでできることはゲーム開始時のフェードインなのです(それは記録が乏しいからです)。メッセージの内容はビットマップフォントの描画ではなく、アルファ(または修正しました)です。ラウンドが終了した後に 'roundOver'をtrueに設定していますか?あなたが助けになるプロジェクトを共有することができれば。 – pr0gramist

+0

ステージに追加されたアクションが、ステージ内のすべてのアクターに影響するというわけではありません。アクションは、ステージの階層のルートにあるグループアクタに追加されます。 – Tenfour04