1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Portable game to destroy asteroids
18 app_namespace
"org.nitlanguage.asteronits"
19 app_version
(1, 0, git_revision
)
24 import gamnit
::landscape
29 redef class Spritesheet
30 # Largest meteors, organized by color
31 var meteors_big
: Array[Array[Texture]] = [
32 [meteor_brown_big1
, meteor_brown_big2
, meteor_brown_big3
, meteor_brown_big4
],
33 [meteor_grey_big1
, meteor_grey_big2
, meteor_grey_big3
, meteor_grey_big4
]]
35 # Medium size meteors, organized by color
36 var meteors_med
: Array[Array[Texture]] = [
37 [meteor_brown_med1
, meteor_brown_med3
],
38 [meteor_grey_med1
, meteor_grey_med2
]]
40 # Small meteors, organized by color
41 var meteors_small
: Array[Array[Texture]] = [
42 [meteor_brown_small1
, meteor_brown_small2
],
43 [meteor_grey_small1
, meteor_grey_small2
]]
45 # Tiny meteors, organized by color
47 # TODO use these in particles
48 var meteors_tiny
: Array[Array[Texture]] = [
49 [meteor_brown_tiny1
, meteor_brown_tiny2
],
50 [meteor_grey_tiny1
, meteor_grey_tiny2
]]
53 var ships
: Array[Texture] = [enemy_green1
]
58 # Current world in play
59 var world
= new World(12, 2, display
.aspect_ratio
) is lazy
62 private var fx_fire
= new Sound("sounds/fire.ogg")
63 private var fx_explosion_ship
= new Sound("sounds/explosion_ship.wav")
64 private var fx_explosion_asteroids
= new Sound("sounds/explosion_asteroids.wav")
66 redef fun create_scene
70 # Move the camera to show all the world world in the screen range
71 world_camera
.reset_height
(world
.half_height
* 2.0)
73 ui_camera
.reset_height
720.0
76 # Main spritesheet with ships, asteroids and beams
77 var spritesheet
= new Spritesheet
84 # Setup new world if all asteroids are destroyed
85 if world
.asteroids
.is_empty
then
87 world
= new World(world
.n_asteroids
*2, world
.n_asteroid_parts
+1, display
.aspect_ratio
)
91 redef fun accept_event
(event
)
93 if super then return true
95 if event
isa QuitEvent then
97 else if event
isa KeyEvent then
98 var thrust
= event
.thrust
100 app
.world
.ship
.applied_thrust
= if event
.is_down
then thrust
else 0.0
104 var rot
= event
.rotation
106 app
.world
.ship
.applied_rotation
= if event
.is_down
then rot
else 0.0
110 if event
.name
== "space" and event
.is_down
then
113 else if event
.name
== "escape" then
115 else if event
.name
== "." and event
.is_down
then
116 dynamic_resolution_ratio
*= 2.0
117 print dynamic_resolution_ratio
118 else if event
.name
== "," and event
.is_down
then
119 dynamic_resolution_ratio
/= 2.0
120 print dynamic_resolution_ratio
128 redef class SpacialObject
129 # Main `Sprite` to draw for this object
130 var sprite
: Sprite is noinit
132 # All `Sprites` composing this object
133 var sprites
: Collection[Sprite] = new Ref[Sprite](sprite
) is lazy
135 init do app
.sprites
.add_all sprites
137 redef fun do_turn
(dt
)
140 sprite
.rotation
= rotation
- pi
/2.0
146 for s
in sprites
do app
.sprites
.remove s
154 # Select texture from `size` and `color`
155 var tex
= if size
== 3 then
156 app
.spritesheet
.meteors_big
[color
].rand
157 else if size
== 2 then
158 app
.spritesheet
.meteors_med
[color
].rand
159 else app
.spritesheet
.meteors_small
[color
].rand
161 sprite
= new Sprite(tex
, center
)
168 app
.fx_explosion_asteroids
.play
175 sprite
= new Sprite(app
.spritesheet
.laser_blue01
, center
)
183 sprite
= new Sprite(app
.spritesheet
.ships
.rand
, center
)
184 sprites
= [sprite
, thrust_sprite
]
189 private var thrust_sprite
= new Sprite(app
.spritesheet
.fire09
, new Point3d[Float](0.0, 0.0, 0.0))
191 private var sprites_with_fire
: Array[Sprite] = [thrust_sprite
, sprite
] is lazy
193 redef fun do_turn
(dt
)
197 # Update position of the thrust sprite
198 var dist_to_engine
= 45.0
199 thrust_sprite
.center
.x
= center
.x
- dist_to_engine
*rotation
.cos
200 thrust_sprite
.center
.y
= center
.y
- dist_to_engine
*rotation
.sin
201 thrust_sprite
.center
.z
= center
.z
202 thrust_sprite
.rotation
= rotation
- pi
/2.0
204 # Show or hide the thrust sprite
205 if applied_thrust
> 0.0 then
206 thrust_sprite
.alpha
= 1.0
208 else if thrust_sprite
.alpha
> 0.0 then
209 thrust_sprite
.alpha
-= dt
*4.0
210 if thrust_sprite
.alpha
< 0.0 then thrust_sprite
.alpha
= 0.0
213 # HACK, the "enemy" ship used for the player points downwards
214 sprite
.rotation
+= pi
226 app
.fx_explosion_ship
.play
232 # How does this event affect the ship thrust?
235 if name
== "up" or name
== "w" then return 1.0
239 # How does this event affect the ship thrust?
242 if name
== "right" or name
== "d" then return -1.0
243 if name
== "left" or name
== "a" then return 1.0