diff --git a/src/yugecin/opsudance/core/Container.java b/src/yugecin/opsudance/core/Container.java index 8057d3ab..847e087e 100644 --- a/src/yugecin/opsudance/core/Container.java +++ b/src/yugecin/opsudance/core/Container.java @@ -30,6 +30,7 @@ public class Container extends AppGameContainer { @Inject public Container(Demux demux) throws SlickException { super(demux); + setShowFPS(false); } @Override diff --git a/src/yugecin/opsudance/core/Demux.java b/src/yugecin/opsudance/core/Demux.java index e00db535..464daf34 100644 --- a/src/yugecin/opsudance/core/Demux.java +++ b/src/yugecin/opsudance/core/Demux.java @@ -18,19 +18,22 @@ package yugecin.opsudance.core; import com.google.inject.Inject; -import org.newdawn.slick.Game; -import org.newdawn.slick.GameContainer; -import org.newdawn.slick.Graphics; -import org.newdawn.slick.SlickException; +import org.newdawn.slick.*; import yugecin.opsudance.kernel.InstanceContainer; import yugecin.opsudance.states.EmptyState; import yugecin.opsudance.states.GameState; +import yugecin.opsudance.states.transitions.FadeInTransitionState; +import yugecin.opsudance.states.transitions.FadeOutTransitionState; +import yugecin.opsudance.states.transitions.TransitionState; public class Demux implements Game { private final InstanceContainer instanceContainer; - private GameState currentState; + private TransitionState fadeOutTransitionState; + private TransitionState fadeInTransitionState; + + private GameState state; @Inject public Demux(InstanceContainer instanceContainer) { @@ -39,22 +42,26 @@ public class Demux implements Game { @Override public void init(GameContainer container) throws SlickException { - currentState = instanceContainer.provide(EmptyState.class); + fadeOutTransitionState = instanceContainer.provide(FadeOutTransitionState.class); + fadeInTransitionState = instanceContainer.provide(FadeInTransitionState.class); + state = instanceContainer.provide(EmptyState.class); + state.enter(); } @Override public void update(GameContainer container, int delta) throws SlickException { - currentState.update(delta); + state.update(delta); } @Override public void render(GameContainer container, Graphics g) throws SlickException { - currentState.render(g); + state.render(g); } @Override public boolean closeRequested() { - return false; + // TODO for what is this used + return !isTransitioning(); } @Override @@ -62,4 +69,25 @@ public class Demux implements Game { return "opsu!dance"; } + public boolean isTransitioning() { + return state == fadeInTransitionState || state == fadeOutTransitionState; + } + + public void switchState(GameState newState) { + if (isTransitioning()) { + return; + } + fadeOutTransitionState.setApplicableState(state); + fadeInTransitionState.setApplicableState(newState); + state = fadeOutTransitionState; + state.enter(); + } + + public void switchStateNow(GameState newState) { + if (!isTransitioning()) { + return; + } + state = newState; + } + } diff --git a/src/yugecin/opsudance/kernel/OpsuDanceModule.java b/src/yugecin/opsudance/kernel/OpsuDanceModule.java index 884c8d98..71a473b8 100644 --- a/src/yugecin/opsudance/kernel/OpsuDanceModule.java +++ b/src/yugecin/opsudance/kernel/OpsuDanceModule.java @@ -21,6 +21,10 @@ import com.google.inject.AbstractModule; import yugecin.opsudance.PreStartupInitializer; import yugecin.opsudance.core.Container; import yugecin.opsudance.core.Demux; +import yugecin.opsudance.states.EmptyRedState; +import yugecin.opsudance.states.EmptyState; +import yugecin.opsudance.states.transitions.FadeInTransitionState; +import yugecin.opsudance.states.transitions.FadeOutTransitionState; public class OpsuDanceModule extends AbstractModule { @@ -29,6 +33,10 @@ public class OpsuDanceModule extends AbstractModule { bind(PreStartupInitializer.class).asEagerSingleton(); bind(Demux.class).asEagerSingleton(); bind(Container.class).asEagerSingleton(); + bind(FadeInTransitionState.class).asEagerSingleton(); + bind(FadeOutTransitionState.class).asEagerSingleton(); + bind(EmptyRedState.class).asEagerSingleton(); + bind(EmptyState.class).asEagerSingleton(); } } diff --git a/src/yugecin/opsudance/states/EmptyRedState.java b/src/yugecin/opsudance/states/EmptyRedState.java new file mode 100644 index 00000000..b1a15524 --- /dev/null +++ b/src/yugecin/opsudance/states/EmptyRedState.java @@ -0,0 +1,62 @@ +/* + * opsu!dance - fork of opsu! with cursordance auto + * Copyright (C) 2017 yugecin + * + * opsu!dance is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * opsu!dance is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with opsu!dance. If not, see . + */ +package yugecin.opsudance.states; + +import com.google.inject.Inject; +import org.newdawn.slick.Color; +import org.newdawn.slick.Graphics; +import yugecin.opsudance.core.Demux; +import yugecin.opsudance.kernel.InstanceContainer; + +public class EmptyRedState implements GameState { + + private int counter; + + private final Demux demux; + private final InstanceContainer instanceContainer; + + @Inject + public EmptyRedState(InstanceContainer instanceContainer, Demux demux) { + this.instanceContainer = instanceContainer; + this.demux = demux; + } + + @Override + public void update(int delta) { + counter -= delta; + if (counter < 0) { + demux.switchState(instanceContainer.provide(EmptyState.class)); + } + } + + @Override + public void render(Graphics g) { + g.setColor(Color.red); + g.fillRect(0, 0, 100, 100); + } + + @Override + public void enter() { + counter = 5000; + } + + @Override + public void leave() { + } + +} diff --git a/src/yugecin/opsudance/states/EmptyState.java b/src/yugecin/opsudance/states/EmptyState.java index 2bc4d825..503f727b 100644 --- a/src/yugecin/opsudance/states/EmptyState.java +++ b/src/yugecin/opsudance/states/EmptyState.java @@ -18,33 +18,45 @@ package yugecin.opsudance.states; import com.google.inject.Inject; +import org.newdawn.slick.Color; import org.newdawn.slick.Graphics; +import yugecin.opsudance.core.Demux; +import yugecin.opsudance.kernel.InstanceContainer; public class EmptyState implements GameState { - @Inject - public EmptyState() { + private int counter; + private final InstanceContainer instanceContainer; + private final Demux demux; + + @Inject + public EmptyState(InstanceContainer instanceContainer, Demux demux) { + this.instanceContainer = instanceContainer; + this.demux = demux; } @Override public void update(int delta) { - System.out.println("updatin' " + delta); + counter -= delta; + if (counter < 0) { + demux.switchState(instanceContainer.provide(EmptyRedState.class)); + } } @Override public void render(Graphics g) { - System.out.println("renderin'"); + g.setColor(Color.green); + g.fillRect(0, 0, 100, 100); } @Override public void enter() { - System.out.println("entered"); + counter = 2000; } @Override public void leave() { - System.out.println("left"); } } diff --git a/src/yugecin/opsudance/core/ContainerWrapper.java b/src/yugecin/opsudance/states/transitions/FadeInTransitionState.java similarity index 53% rename from src/yugecin/opsudance/core/ContainerWrapper.java rename to src/yugecin/opsudance/states/transitions/FadeInTransitionState.java index 2f2dc7f3..b935d74f 100644 --- a/src/yugecin/opsudance/core/ContainerWrapper.java +++ b/src/yugecin/opsudance/states/transitions/FadeInTransitionState.java @@ -15,9 +15,36 @@ * You should have received a copy of the GNU General Public License * along with opsu!dance. If not, see . */ -package yugecin.opsudance.core; +package yugecin.opsudance.states.transitions; -public class ContainerWrapper { +import com.google.inject.Inject; +import yugecin.opsudance.core.Container; +import yugecin.opsudance.core.Demux; +public class FadeInTransitionState extends TransitionState { + + private final Demux demux; + + @Inject + public FadeInTransitionState(Container container, Demux demux) { + super(container, 300); + this.demux = demux; + } + + @Override + protected float getMaskAlphaLevel() { + return 1f - (float) fadeTime / fadeTargetTime; + } + + @Override + public void enter() { + super.enter(); + applicableState.enter(); + } + + @Override + protected void onFadeFinished() { + demux.switchStateNow(applicableState); + } } diff --git a/src/yugecin/opsudance/states/transitions/FadeOutTransitionState.java b/src/yugecin/opsudance/states/transitions/FadeOutTransitionState.java new file mode 100644 index 00000000..2fd966a6 --- /dev/null +++ b/src/yugecin/opsudance/states/transitions/FadeOutTransitionState.java @@ -0,0 +1,47 @@ +/* + * opsu!dance - fork of opsu! with cursordance auto + * Copyright (C) 2017 yugecin + * + * opsu!dance is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * opsu!dance is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with opsu!dance. If not, see . + */ +package yugecin.opsudance.states.transitions; + +import com.google.inject.Inject; +import yugecin.opsudance.core.Container; +import yugecin.opsudance.core.Demux; + +public class FadeOutTransitionState extends TransitionState { + + private final Demux demux; + private final FadeInTransitionState fadeInTransitionState; + + @Inject + public FadeOutTransitionState(Container container, Demux demux, FadeInTransitionState fadeInTransitionState) { + super(container, 200); + this.demux = demux; + this.fadeInTransitionState = fadeInTransitionState; + } + + @Override + protected float getMaskAlphaLevel() { + return (float) fadeTime / fadeTargetTime; + } + + @Override + protected void onFadeFinished() { + applicableState.leave(); + demux.switchStateNow(fadeInTransitionState); + fadeInTransitionState.enter(); + } +} diff --git a/src/yugecin/opsudance/states/transitions/TransitionState.java b/src/yugecin/opsudance/states/transitions/TransitionState.java new file mode 100644 index 00000000..dd90b5ce --- /dev/null +++ b/src/yugecin/opsudance/states/transitions/TransitionState.java @@ -0,0 +1,74 @@ +/* + * opsu!dance - fork of opsu! with cursordance auto + * Copyright (C) 2017 yugecin + * + * opsu!dance is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * opsu!dance is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with opsu!dance. If not, see . + */ +package yugecin.opsudance.states.transitions; + +import org.newdawn.slick.Color; +import org.newdawn.slick.Graphics; +import yugecin.opsudance.core.Container; +import yugecin.opsudance.states.GameState; + +public abstract class TransitionState implements GameState { + + protected GameState applicableState; + + private final Container container; + + protected final int fadeTargetTime; + protected int fadeTime; + + private final Color black; + + public TransitionState(Container container, int fadeTargetTime) { + this.container = container; + this.fadeTargetTime = fadeTargetTime; + black = new Color(Color.black); + } + + public void setApplicableState(GameState applicableState) { + this.applicableState = applicableState; + } + + @Override + public void update(int delta) { + applicableState.update(delta); + fadeTime += delta; + if (fadeTime >= fadeTargetTime) { + onFadeFinished(); + } + } + + @Override + public void render(Graphics g) { + applicableState.render(g); + black.a = getMaskAlphaLevel(); + g.setColor(black); + g.fillRect(0, 0, container.getWidth(), container.getHeight()); + } + + @Override + public void enter() { + fadeTime = 0; + } + + @Override + public void leave() { } + + protected abstract float getMaskAlphaLevel(); + protected abstract void onFadeFinished(); + +}