namespace graphics {
ColorFade::ColorFade(State *slave, Uint32 color, int duration, bool in, bool interactive)
-: ctrl(0)
-, slave(slave)
+: slave(slave)
, blinds(0)
, color(color)
, duration(duration)
+, leadIn(0)
+, leadOut(0)
+, leadInDone(true)
+, fadeDone(false)
, in(in)
, interactive(interactive) {
}
-void ColorFade::EnterState(Application &c, SDL_Surface *screen) {
- timer = GraphicsTimers().StartCountdown(duration);
- ctrl = &c;
+void ColorFade::OnEnterState(SDL_Surface *screen) {
+ if (leadIn > 0) {
+ timer = GraphicsTimers().StartCountdown(leadIn);
+ } else {
+ timer = GraphicsTimers().StartCountdown(duration);
+
+ }
}
-void ColorFade::ExitState(Application &, SDL_Surface *screen) {
+void ColorFade::OnExitState(SDL_Surface *screen) {
if (blinds) {
SDL_FreeSurface(blinds);
blinds = 0;
}
}
-void ColorFade::ResumeState(Application &ctrl, SDL_Surface *screen) {
+void ColorFade::OnResumeState(SDL_Surface *screen) {
UpdateBlinds(screen->w, screen->h);
}
-void ColorFade::PauseState(Application &ctrl, SDL_Surface *screen) {
+void ColorFade::OnPauseState(SDL_Surface *screen) {
}
-void ColorFade::Resize(int width, int height) {
+void ColorFade::OnResize(int width, int height) {
slave->Resize(width, height);
UpdateBlinds(width, height);
}
}
Uint8 ColorFade::GetAlpha() const {
- if (in) {
- return timer.Remaining() * 255 / duration;
+ if (!leadInDone) {
+ return in ? 255 : 0;
+ } else if (!fadeDone) {
+ return (in ? timer.Remaining() : timer.Elapsed()) * 255 / duration;
} else {
- return timer.Elapsed() * 255 / duration;
+ return in ? 0 : 255;
}
}
slave->HandleEvents(input);
}
if (timer.Finished()) {
- ctrl->PopState();
+ if (!leadInDone) {
+ leadInDone = true;
+ timer = GraphicsTimers().StartCountdown(duration);
+ } else if (!fadeDone) {
+ fadeDone = true;
+ if (leadOut > 0) {
+ timer = GraphicsTimers().StartCountdown(leadOut);
+ } else {
+ Ctrl().PopState();
+ }
+ } else {
+ Ctrl().PopState();
+ }
}
}