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