dino: keep track of the score and display it
[nit.git] / examples / mnit_dino / src / graphism.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # Graphism for the Dino game
18 # Uses the Display interface from MNit.
19 module graphism
20
21 import mnit # for Display
22
23 import game_logic
24
25 redef class GamePos
26 fun to_screen( d : Display ) : ScreenPos
27 do
28 var x = x+d.width/2
29 var y = d.height/2-y
30 return new ScreenPos( x.to_f, y.to_f )
31 end
32 end
33
34 class ScreenPos
35 var x : Float
36 var y : Float
37
38 fun to_game( d : Display ) : GamePos
39 do
40 var x = x.to_i-d.width/2
41 var y = d.height/2-y.to_i
42 return new GamePos( x, y )
43 end
44 end
45
46 redef class Entity
47 fun draw( display : Display, imgs : ImageSet, turn : Turn ) is abstract
48 end
49
50 redef class Dino
51 redef fun draw( display, imgs, turn )
52 do
53 var spos = pos.to_screen( display )
54 var img : Image
55 if is_alive then
56 img = imgs.dino_img
57 else
58 img = imgs.dino_dead_img
59 end
60 display.blit_centered( img, spos.x.to_i, spos.y.to_i )
61 end
62 end
63
64 redef class Caveman
65 redef fun draw( display, imgs, turn )
66 do
67 var man_pos = pos.to_screen( display )
68 var img : Image
69
70 if not is_alive then
71 img = imgs.blood_img
72 else if is_afraid( turn ) then
73 img = imgs.caveman_afraid_img
74 else if can_throw( turn ) then
75 img = imgs.caveman_ready_img
76 else
77 img = imgs.caveman_img
78 end
79
80 display.blit_centered( img, man_pos.x.to_i, man_pos.y.to_i )
81 end
82 end
83
84 redef class Javelin
85 redef fun draw( display, imgs, turn )
86 do
87 var spos = pos.to_screen( display )
88 spos.y -= z.to_f/10.0
89 display.blit_rotated( imgs.javelin_img, spos.x, spos.y, angle )
90 end
91 end
92
93 class ImageSet
94 var javelin_img : Image
95
96 var dino_img : Image
97 var dino_dead_img : Image
98
99 var caveman_img : Image
100 var caveman_afraid_img : Image
101 var caveman_ready_img : Image
102 var blood_img : Image
103
104 var life_img : Image
105 var life_empty_img : Image
106
107 var you_won_img : Image
108 var you_lost_img : Image
109 var start_over_img : Image
110 fun start_over_path : String is abstract
111
112 var numbers: NumberImages
113
114 init ( app : App )
115 do
116 javelin_img = app.load_image( "images/javelin.png" )
117
118 dino_img = app.load_image( "images/dino.png" )
119 dino_dead_img = app.load_image( "images/dino_dead.png" )
120
121 caveman_img = app.load_image( "images/caveman.png" )
122 caveman_afraid_img = app.load_image( "images/caveman_afraid.png" )
123 caveman_ready_img = app.load_image( "images/caveman_ready.png" )
124 blood_img = app.load_image( "images/blood.png" )
125
126 life_img = app.load_image( "images/life.png" )
127 life_empty_img = app.load_image( "images/life_empty.png" )
128
129 you_won_img = app.load_image( "images/you_won.png" )
130 you_lost_img = app.load_image( "images/you_lost.png" )
131 start_over_img = app.load_image( start_over_path )
132
133 numbers = app.load_numbers("images/#.png")
134 end
135 end
136
137 redef class Game
138 fun draw( display : Display, imgs : ImageSet, turn : Turn )
139 do
140 display.clear( 0.0, 0.5, 0.1 )
141
142 # entities (dino, cavemen and javelins)
143 for e in entities do
144 e.draw( display, imgs, turn )
145 end
146
147 # life
148 var life_out_of_ten = 10 * dino.life / dino.total_life
149 if dino.life*10 % dino.total_life != 0 then
150 life_out_of_ten += 1
151 end
152
153 for life in [0..life_out_of_ten[ do
154 display.blit_centered( imgs.life_img, display.width*(life+1)/11, display.top_offset )
155 end
156
157 for empty in [life_out_of_ten..10[ do
158 display.blit_centered( imgs.life_empty_img, display.width*(empty+1)/11, display.top_offset )
159 end
160
161 # display score
162 display.blit_number(imgs.numbers, score.item, display.width/11, display.top_offset+32)
163
164 # game over messages
165 if over then
166 var concl_img : Image
167 if won then
168 concl_img = imgs.you_won_img
169 else
170 concl_img = imgs.you_lost_img
171 end
172 display.blit_centered( concl_img, display.width/2, 60+display.top_offset )
173
174 if ready_to_start_over then
175 display.blit_centered( imgs.start_over_img, display.width/2, 100+display.top_offset )
176 end
177 end
178 end
179 end
180
181 redef interface Display
182 fun top_offset: Int do return 48
183 end