changed worldmap format a bit to be more consistent with level format
[supertux.git] / src / object / display_effect.cpp
1 #include <config.h>
2 #include "display_effect.h"
3
4 #include <assert.h>
5 #include "video/drawing_context.h"
6 #include "main.h"
7
8 DisplayEffect::DisplayEffect()
9     : type(NO_FADE), fadetime(0), fading(0), black(false)
10 {
11 }
12
13 DisplayEffect::~DisplayEffect()
14 {
15 }
16
17 void
18 DisplayEffect::update(float elapsed_time)
19 {
20     switch(type) {
21         case NO_FADE:
22             return;
23         case FADE_IN:
24             fading -= elapsed_time;
25             if(fading < 0) {
26                 type = NO_FADE;
27             }
28             break;
29         case FADE_OUT:
30             fading -= elapsed_time;
31             if(fading < 0) {
32                 type = NO_FADE;
33                 black = true;
34             }
35             break;
36         default:
37             assert(false);
38     }
39 }
40
41 void
42 DisplayEffect::draw(DrawingContext& context)
43 {
44     if(!black && type == NO_FADE)
45         return;
46     
47     context.push_transform();
48     context.set_translation(Vector(0, 0));
49
50     uint8_t alpha;
51     if(black) {
52         alpha = 255;
53     } else {
54         switch(type) {
55             case FADE_IN:
56                 alpha = static_cast<uint8_t>
57                     (fading * 255.0 / fadetime);
58                 break;
59             case FADE_OUT:
60                 alpha = static_cast<uint8_t>
61                     ((fadetime-fading) * 255.0 / fadetime);
62                 break;
63             default:
64                 alpha = 0;
65                 assert(false);
66         }
67     }
68     context.draw_filled_rect(Vector(0, 0), Vector(SCREEN_WIDTH, SCREEN_HEIGHT),
69             Color(0, 0, 0, alpha), LAYER_GUI-10);
70     context.pop_transform();
71 }
72
73 void
74 DisplayEffect::fade_out(float fadetime)
75 {
76     black = false;
77     this->fadetime = fadetime;
78     fading = fadetime;
79     type = FADE_OUT;
80 }
81
82 void
83 DisplayEffect::fade_in(float fadetime)
84 {
85     black = false;
86     this->fadetime = fadetime;
87     fading = fadetime;
88     type = FADE_IN;
89 }
90
91 void
92 DisplayEffect::set_black(bool enabled)
93 {
94     black = enabled;
95 }
96
97 bool
98 DisplayEffect::is_black()
99 {
100     return black;
101 }
102