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.
32 # Half width of the hit box
34 # Heigth of the hit box
42 init (g
: Game, x
, y
: Int)
53 if (20.0*game
.speed_modifier
).to_i
.rand
== 0 then
58 else if (80.0*game
.speed_modifier
).to_i
.rand
== 0 then
62 else if (100.0*game
.speed_modifier
).to_i
.rand
== 0 then
66 # shot traps only at 50 points and up
68 if game
.points
> 50 then
70 # After 50 points we have more and more traps until point 1000
71 var d
= 1250-(game
.points
- 50)
72 if d
< 200 then d
= 200
74 if d
.rand
< 100 then trap
= true
79 fun intercepts
(event
: PointerEvent): Bool
81 if not up
or hitted
then return false
83 var dx
= (dx
*display_scale
).to_i
84 var dy
= (dy
*display_scale
).to_i
85 var ex
= event
.x
.to_i
- display_offset_x
86 var ey
= event
.y
.to_i
- display_offset_y
87 return ex
> x
- dx
and ex
< x
+ dx
and
88 ey
> y
- dy
and ey
< y
98 if game
.points
< 0 then game
.points
= 0
107 var holes
= new Array[Hole].with_capacity
(4)
110 var modifier_half_life
= 1000.0
111 fun rows
: Int do return 4
112 fun columns
: Int do return 5
116 var speed_modifier
= 1.0
119 var dist_between_rows
= 512
120 var dist_between_columns
= 600
121 fun global_speed_modifier
: Float do return 2.0
125 var dx
= (dist_between_columns
.to_f
*display_scale
).to_i
126 var dy
= (dist_between_rows
.to_f
*display_scale
).to_i
127 for x
in [0 .. columns
[ do
128 for y
in [0 .. rows
[ do
129 holes
.add
(new Hole(self, x
*dx
, y
*dy
))
135 for hole
in holes
do hole
.do_turn
137 speed_modifier
= modifier_half_life
/ (modifier_half_life
+points
.to_f
) * global_speed_modifier
141 # Where all the UI stuff is done
147 var numbers
: NumberImages
149 var sign_warning
: Image
157 empty_img
= app
.load_image
("images/empty.png")
158 up_img
= app
.load_image
("images/up.png")
159 hit_img
= app
.load_image
("images/hit.png")
160 trap_img
= app
.load_image
("images/trap.png")
161 numbers
= app
.load_numbers
("images/#.png")
163 sign_warning
= app
.load_image
("images/sign-warning.png")
164 sign_cute
= app
.load_image
("images/sign-cute.png")
165 sign_hits
= app
.load_image
("images/sign-hits.png")
168 fun do_frame
(display
: Display)
170 display
.clear
(0.1, 0.65, 0.2)
172 sign_warning
.scale
= display_scale
173 sign_cute
.scale
= display_scale
174 sign_hits
.scale
= display_scale
175 for img
in numbers
.imgs
do img
.scale
= display_scale
177 display
.blit
(sign_warning
, (-120.0*display_scale
).to_i
, (-235.0*display_scale
).to_i
)
178 display
.blit
(sign_cute
, (540.0*display_scale
).to_i
, (-180.0*display_scale
).to_i
)
179 display
.blit
(sign_hits
, (1340.0*display_scale
).to_i
, (55.0*display_scale
).to_i
)
180 display
.blit_number
(numbers
, game
.points
, (1460.0*display_scale
).to_i
, (270.0*display_scale
).to_i
)
182 for hole
in game
.holes
do
185 var dx
= 512.0*display_scale
186 var dy
= 512.0*display_scale
187 img
.scale
= display_scale
188 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
194 dx
= 256.0*display_scale
195 dy
= 417.0*display_scale
199 dx
= 512.0*display_scale
200 dy
= 830.0*display_scale
203 dx
= 512.0*display_scale
204 dy
= 830.0*display_scale
209 img
.scale
= display_scale
210 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
215 fun input
(event
: InputEvent): Bool
217 if event
isa PointerEvent then
218 for hole
in game
.holes
do
219 if hole
.intercepts
(event
) then
220 if hole
.up
then hole
.hit
232 var screen
: nullable Screen = null
234 var target_dt
= 20000000
236 redef fun window_created
243 fun init_screen_and_game
do screen
= new Screen(self)
245 redef fun frame_core
(display
)
247 var screen
= self.screen
248 if screen
!= null then
249 var clock
= new Clock
252 screen
.do_frame
(display
)
255 if dt
.sec
== 0 and dt
.nanosec
< target_dt
then
256 var sleep_t
= target_dt
- dt
.nanosec
257 sys
.nanosleep
(0, sleep_t
)
265 if ie
isa QuitEvent or
266 (ie
isa KeyEvent and ie
.to_c
== 'q') then
269 else if screen
!= null then
270 return screen
.input
(ie
)
272 print
"unknown input: {ie}"
278 fun display_scale
: Float do return 1.0
280 # Depends on the hole center in the uo image
281 fun display_offset_x
: Int do return (512.0*display_scale
).to_i
283 # Depends on the width of the holes
284 fun display_offset_y
: Int do return (800.0*display_scale
).to_i