1 # This file is part of NIT (http://www.nitlanguage.org).
3 # Copyright 2012-2014 Alexis Laferrière <alexis.laf@xymus.net>
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
9 # http://www.apache.org/licenses/LICENSE-2.0
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.
19 # This is a minimal practical example of the mnit framework.
21 app_version
(1, 0, git_revision
)
22 app_name
("Crazy Groundhogs")
34 # Half width of the hit box
36 # Heigth of the hit box
44 init (g
: Game, x
, y
: Int)
55 if (20.0*game
.speed_modifier
).to_i
.rand
== 0 then
60 else if (80.0*game
.speed_modifier
).to_i
.rand
== 0 then
64 else if (100.0*game
.speed_modifier
).to_i
.rand
== 0 then
68 # shot traps only at 50 points and up
70 if game
.points
> 50 then
72 # After 50 points we have more and more traps until point 1000
73 var d
= 1250-(game
.points
- 50)
74 if d
< 200 then d
= 200
76 if d
.rand
< 100 then trap
= true
81 fun intercepts
(event
: PointerEvent): Bool
83 if not up
or hitted
then return false
85 var dx
= (dx
*display_scale
).to_i
86 var dy
= (dy
*display_scale
).to_i
87 var ex
= event
.x
.to_i
- display_offset_x
88 var ey
= event
.y
.to_i
- display_offset_y
89 return ex
> x
- dx
and ex
< x
+ dx
and
90 ey
> y
- dy
and ey
< y
100 if game
.points
< 0 then game
.points
= 0
109 var holes
= new Array[Hole].with_capacity
(4)
112 var modifier_half_life
= 1000.0
113 fun rows
: Int do return 4
114 fun columns
: Int do return 5
118 var speed_modifier
= 1.0
121 var dist_between_rows
= 512
122 var dist_between_columns
= 600
123 fun global_speed_modifier
: Float do return 2.0
127 var dx
= (dist_between_columns
.to_f
*display_scale
).to_i
128 var dy
= (dist_between_rows
.to_f
*display_scale
).to_i
129 for x
in [0 .. columns
[ do
130 for y
in [0 .. rows
[ do
131 holes
.add
(new Hole(self, x
*dx
, y
*dy
))
137 for hole
in holes
do hole
.do_turn
139 speed_modifier
= modifier_half_life
/ (modifier_half_life
+points
.to_f
) * global_speed_modifier
143 # Where all the UI stuff is done
149 var numbers
: NumberImages
151 var sign_warning
: Image
159 empty_img
= app
.load_image
("images/empty.png")
160 up_img
= app
.load_image
("images/up.png")
161 hit_img
= app
.load_image
("images/hit.png")
162 trap_img
= app
.load_image
("images/trap.png")
163 numbers
= app
.load_numbers
("images/#.png")
165 sign_warning
= app
.load_image
("images/sign-warning.png")
166 sign_cute
= app
.load_image
("images/sign-cute.png")
167 sign_hits
= app
.load_image
("images/sign-hits.png")
170 fun do_frame
(display
: Display)
172 display
.clear
(0.1, 0.65, 0.2)
174 sign_warning
.scale
= display_scale
175 sign_cute
.scale
= display_scale
176 sign_hits
.scale
= display_scale
177 for img
in numbers
.imgs
do img
.scale
= display_scale
179 display
.blit
(sign_warning
, (-120.0*display_scale
).to_i
, (-235.0*display_scale
).to_i
)
180 display
.blit
(sign_cute
, (540.0*display_scale
).to_i
, (-180.0*display_scale
).to_i
)
181 display
.blit
(sign_hits
, (1340.0*display_scale
).to_i
, (55.0*display_scale
).to_i
)
182 display
.blit_number
(numbers
, game
.points
, (1460.0*display_scale
).to_i
, (270.0*display_scale
).to_i
)
184 for hole
in game
.holes
do
187 var dx
= 512.0*display_scale
188 var dy
= 512.0*display_scale
189 img
.scale
= display_scale
190 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
196 dx
= 256.0*display_scale
197 dy
= 417.0*display_scale
201 dx
= 512.0*display_scale
202 dy
= 830.0*display_scale
205 dx
= 512.0*display_scale
206 dy
= 830.0*display_scale
211 img
.scale
= display_scale
212 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
217 fun input
(event
: InputEvent): Bool
219 if event
isa PointerEvent then
220 for hole
in game
.holes
do
221 if hole
.intercepts
(event
) then
222 if hole
.up
then hole
.hit
234 var screen
: nullable Screen = null
236 redef fun window_created
244 fun init_screen_and_game
do screen
= new Screen(self)
246 redef fun frame_core
(display
)
248 var screen
= self.screen
249 if screen
!= null then
251 screen
.do_frame
(display
)
258 if ie
isa QuitEvent or
259 (ie
isa KeyEvent and ie
.to_c
== 'q') then
262 else if screen
!= null then
263 return screen
.input
(ie
)
265 print
"unknown input: {ie}"
271 fun display_scale
: Float do return 1.0
273 # Depends on the hole center in the uo image
274 fun display_offset_x
: Int do return (512.0*display_scale
).to_i
276 # Depends on the width of the holes
277 fun display_offset_y
: Int do return (800.0*display_scale
).to_i