2016-08-30 2 views
2

내 처음으로 올린 글이며 스스로 가르쳐 주므로 친절하게하십시오!Java/libGDX - Actions.fadeIn() 및 Actions.fadeOut()과 관련한 문제

나는 게임 화면 클래스를 사용 libGDX에 Bomberman에 복제 게임을 구축했습니다 :

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

나는이 레벨 화면을 검은 색으로 퇴색 시키길 원하지만, 그렇지 않다.

(홈페이지에서 클래스)

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

그리고 나는 사용하여 시도했다 :

내가 흑인이 levelScreen의 페이드 아웃하려는 통해 라운드가

후 블랙에서 trophyScreen에 fadeIn TrophyScreen의 show() 메소드 :

나는 많은 검색을 수행했지만 여러 가지 일을했지만 기쁨은 없었습니다. 페이드 동작이 일어나지 않도록하는 draw() 또는 render() 메서드에서 어딘가에 뭔가가 누락되었다고 확신합니다.

갱신 1

@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

+0

@ZeRubeus 액션 시퀀스를 생성하고, 액션 시퀀스를 생성하고, 알파를 0으로 설정 한 다음, fadeIn (부동 소수점 길이) – CChapman01

답변

2

배우에서 작동하는 페이딩, 그들은 제대로 그리기 방법에 고유 한 색상의 알파를 적용해야합니다. 또한 오브젝트의 전체 계층 구조가 한 번에 사라지게하려면 모두 그려진 메소드 서명에서 parentAlpha 매개 변수를 적용해야합니다.

그래서 사용자 지정 배우 서브 클래스에서 무승부 방법은 다음과 같아야합니다

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

당신이 (I 인해 중복 추천하지 않는) 대신 TextureRegion 당신의 배우에 스프라이트를 사용하는 경우를 배치 대신 Sprite에 색상을 적용해야합니다.

게임 전체가 희미 해지는이 방법은 "깨끗한"페이드가 아닙니다. 페이드가 진행되는 동안 상위 알파가 1보다 작 으면 다른 배우와 겹치는 모든 액터가 서로 표시됩니다. 깔끔한 페이드를 제공하는 대안은 전체 장면에 배경 (또는 검은 색) 복사본을 그려서 사라지게하는 것입니다.

1

나는 levelStage를 확장 클래스의 객체이고 당신이 이상한 무대, 내부 컨트롤을 생성한다고 가정합니다.

@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(); 
    } 
} 
: 당신은 내가 그것이 BitmapFont

솔루션, 당신이 뭔가를해야합니다

는이 방법으로 그것을하고 싶은 경우 이상한 방법입니다 생각하는 당신의 font_text에 색상을 appling되지 않습니다

getRoot()은 Stage에서 적용한 모든 동작이 실제로 Group root 요소에 적용되므로 Stage에서 Group을 가져옵니다. 색상 (알파 채널 있음)을 얻고 color를 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

답변 해 주셔서 감사합니다. 올바른 수준은 클래스 객체입니다. '무대'. 그리고 예,'BitmapFont'를 사용하고 있습니다. 내가하고 싶은 일은 게임을 시작할 때 전체 단계 (레벨)를 퇴색시키는 것입니다. 그래서 모든 액터들이 사라질 것입니다. 나는 메시지가 "super.draw()"를 라운드가 끝났을 때만 호출하는 지점에서 추측하고 있습니다. 다행히도 그것은 의미가 있습니다. – CChapman01

+0

내 대답이 도움이되지 않았습니까? GIF에서 할 수있는 것은 게임 시작시의 페이드 인 (즉, 녹음이 너무 왜곡되어 있기 때문입니다.) 스테이지에 액션 추가는 스테이지에 추가 된 모든 액터에 영향을 미칩니다. 메시지 내용은 비 알파 (또는 그 문제를 해결 했습니까?) 비트 맵 글꼴 그리기 일뿐입니다. 라운드가 끝난 후 'roundOver'를 true로 설정합니까? 도움이 될만한 프로젝트를 공유 할 수 있다면. – pr0gramist

+0

스테이지에 추가 된 액션이 스테이지의 모든 액터에 영향을주는 것은 사실이 아닙니다. 액션은 스테이지의 계층 루트에있는 그룹 액터에 추가됩니다. – Tenfour04

관련 문제