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.
31 # Half width of the hit box
33 # Heigth of the hit box
41 init (g
: Game, x
, y
: Int)
52 if (20.0*game
.speed_modifier
).to_i
.rand
== 0 then
57 else if (80.0*game
.speed_modifier
).to_i
.rand
== 0 then
61 else if (100.0*game
.speed_modifier
).to_i
.rand
== 0 then
65 # shot traps only at 50 points and up
67 if game
.points
> 50 then
69 # After 50 points we have more and more traps until point 1000
70 var d
= 1250-(game
.points
- 50)
71 if d
< 200 then d
= 200
73 if d
.rand
< 100 then trap
= true
78 fun intercepts
(event
: PointerEvent): Bool
80 if not up
or hitted
then return false
82 var dx
= (dx
*display_scale
).to_i
83 var dy
= (dy
*display_scale
).to_i
84 var ex
= event
.x
.to_i
- display_offset_x
85 var ey
= event
.y
.to_i
- display_offset_y
86 return ex
> x
- dx
and ex
< x
+ dx
and
87 ey
> y
- dy
and ey
< y
97 if game
.points
< 0 then game
.points
= 0
106 var holes
= new Array[Hole].with_capacity
(4)
109 var modifier_half_life
= 1000.0
110 fun rows
: Int do return 4
111 fun columns
: Int do return 5
115 var speed_modifier
= 1.0
118 var dist_between_rows
= 512
119 var dist_between_columns
= 600
120 fun global_speed_modifier
: Float do return 2.0
124 var dx
= (dist_between_columns
.to_f
*display_scale
).to_i
125 var dy
= (dist_between_rows
.to_f
*display_scale
).to_i
126 for x
in [0 .. columns
[ do
127 for y
in [0 .. rows
[ do
128 holes
.add
(new Hole(self, x
*dx
, y
*dy
))
134 for hole
in holes
do hole
.do_turn
136 speed_modifier
= modifier_half_life
/ (modifier_half_life
+points
.to_f
) * global_speed_modifier
140 # Where all the UI stuff is done
146 var numbers
: NumberImages
148 var sign_warning
: Image
156 empty_img
= app
.load_image
("images/empty.png")
157 up_img
= app
.load_image
("images/up.png")
158 hit_img
= app
.load_image
("images/hit.png")
159 trap_img
= app
.load_image
("images/trap.png")
160 numbers
= app
.load_numbers
("images/#.png")
162 sign_warning
= app
.load_image
("images/sign-warning.png")
163 sign_cute
= app
.load_image
("images/sign-cute.png")
164 sign_hits
= app
.load_image
("images/sign-hits.png")
167 fun do_frame
(display
: Display)
169 display
.clear
(0.1, 0.65, 0.2)
171 sign_warning
.scale
= display_scale
172 sign_cute
.scale
= display_scale
173 sign_hits
.scale
= display_scale
174 for img
in numbers
.imgs
do img
.scale
= display_scale
176 display
.blit
(sign_warning
, (-120.0*display_scale
).to_i
, (-235.0*display_scale
).to_i
)
177 display
.blit
(sign_cute
, (540.0*display_scale
).to_i
, (-180.0*display_scale
).to_i
)
178 display
.blit
(sign_hits
, (1340.0*display_scale
).to_i
, (55.0*display_scale
).to_i
)
179 display
.blit_number
(numbers
, game
.points
, (1460.0*display_scale
).to_i
, (270.0*display_scale
).to_i
)
181 for hole
in game
.holes
do
184 var dx
= 512.0*display_scale
185 var dy
= 512.0*display_scale
186 img
.scale
= display_scale
187 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
193 dx
= 256.0*display_scale
194 dy
= 417.0*display_scale
198 dx
= 512.0*display_scale
199 dy
= 830.0*display_scale
202 dx
= 512.0*display_scale
203 dy
= 830.0*display_scale
208 img
.scale
= display_scale
209 display
.blit
(img
, hole
.x-dx
.to_i
+display_offset_x
, hole
.y-dy
.to_i
+display_offset_y
)
214 fun input
(event
: InputEvent): Bool
216 if event
isa PointerEvent then
217 for hole
in game
.holes
do
218 if hole
.intercepts
(event
) then
219 if hole
.up
then hole
.hit
231 var screen
: nullable Screen = null
233 redef fun window_created
241 fun init_screen_and_game
do screen
= new Screen(self)
243 redef fun frame_core
(display
)
245 var screen
= self.screen
246 if screen
!= null then
248 screen
.do_frame
(display
)
255 if ie
isa QuitEvent or
256 (ie
isa KeyEvent and ie
.to_c
== 'q') then
259 else if screen
!= null then
260 return screen
.input
(ie
)
262 print
"unknown input: {ie}"
268 fun display_scale
: Float do return 1.0
270 # Depends on the hole center in the uo image
271 fun display_offset_x
: Int do return (512.0*display_scale
).to_i
273 # Depends on the width of the holes
274 fun display_offset_y
: Int do return (800.0*display_scale
).to_i