# Textures of the biplane, jet, helicopter, parachute and powerups
var planes_sheet = new PlanesImages
+ # Animation when opening the parachute
+ var parachute_animation = new Animation(planes_sheet.parachute, 16.0)
+
# Animation for the player movement
- private var player_textures: Array[Texture] =
- [for f in [1..12] do new Texture("textures/player/frame_{f.pad(2)}.png")]
+ private var running_texture = new Texture("textures/player.png")
+ private var running_animation: Animation = running_texture.to_animation(10.0, 12, 0)
# Boss 3D model
private var iss_model = new Model("models/iss.obj")
# Particle effects
# Explosion particles
- var explosions = new ParticleSystem(20, explosion_program,
+ var explosions = new ParticleSystem(100, explosion_program,
new Texture("particles/explosion00.png"))
# Blood explosion particles
- var blood = new ParticleSystem(20, explosion_program,
+ var blood = new ParticleSystem(100, explosion_program,
new Texture("particles/blood07.png"))
# Smoke for the background
redef fun on_create
do
+ blood.texture.as(RootTexture).premultiply_alpha = false
+ explosions.texture.as(RootTexture).premultiply_alpha = false
+
super
show_splash_screen new Texture("textures/splash.jpg")
ui_camera.reset_height 1080.0
# Register particle systems
- particle_systems.add explosions
- particle_systems.add blood
particle_systems.add smoke
particle_systems.add clouds
+ particle_systems.add blood
+ particle_systems.add explosions
# Stars background
sprites.add stars
player.moving = 0.0
if pressed_keys.has("left") then player.moving -= 1.0
if pressed_keys.has("right") then player.moving += 1.0
- player.sprite.as(PlayerSprite).update
end
# Try to fire as long as a key is pressed
if event.name == "left" then
var mod = if event.is_down then -1.0 else 1.0
player.moving += mod
- end
-
- if event.name == "right" then
+ player.animate_move
+ else if event.name == "right" then
var mod = if event.is_down then 1.0 else -1.0
player.moving += mod
+ player.animate_move
end
-
- if player.moving == 0.0 then
- player.sprite.as(PlayerSprite).stop_running
- else player.sprite.as(PlayerSprite).start_running
end
end
end
# Show death animation (explosion)
fun death_animation
do
- var force = 4.0
+ var force = 2.0
health = 0.0
- for i in 32.times do
+ for i in 16.times do
app.blood.add(
new Point3d[Float](center.x & force, center.y & force, center.z & force),
- (2048.0 & 4096.0) * force, 0.3 & 0.1)
+ (4096.0 & 2048.0) * force, 0.3 & 0.1)
end
end
end
end
redef class Enemy
- redef var sprite = new Sprite(app.player_textures.rand, center) is lazy
+ redef var sprite = new Sprite(app.running_animation.frames.rand, center) is lazy
init do sprite.scale = width/sprite.texture.width * 2.0
end
redef class Parachute
- redef var sprite = new Sprite(app.planes_sheet.parachute, center) is lazy
- init do sprite.scale = width / sprite.texture.width
+ redef var sprite = new Sprite(app.planes_sheet.parachute_open, center) is lazy
+ init
+ do
+ sprite.scale = width / sprite.texture.width
+ sprite.animate app.parachute_animation
+ end
end
redef class Player
- redef var sprite = new PlayerSprite(app.player_textures[1], center, app.player_textures, 0.08) is lazy
+ redef var sprite = new Sprite(app.running_animation.frames.last, center) is lazy
init do sprite.scale = width/sprite.texture.width * 2.0
+ # Update current animation
+ fun animate_move
+ do
+ if moving == 0.0 then
+ sprite.animate_stop
+ else sprite.animate(app.running_animation, -1.0)
+ end
+
redef fun update(dt, world)
do
super
super
# Particles
- app.explosions.add(center, 8192.0 * force, 0.3)
- for i in (4.0*force).to_i.times do
+ var range = 0.5 * force
+ app.explosions.add(center, 4096.0 * force, 0.3)
+ for i in (2.0*force).to_i.times do
app.explosions.add(
- new Point3d[Float](center.x & force, center.y & force/2.0, center.z & force),
- (4096.0 & 2048.0) * force, 0.3 & 0.3, 0.5.rand)
+ new Point3d[Float](center.x & range, center.y & range, center.z & range),
+ (2048.0 & 1024.0) * force, 0.3 & 0.3, 0.5.rand)
end
end
end
end
end
-# Special `Sprite` for the player character which is animated
-class PlayerSprite
- super Sprite
-
- # Animation of the running character
- var running_animation: Array[Texture]
-
- # Seconds per frame of the animations
- var time_per_frame: Float
-
- # Currently playing animation
- private var current_animation: nullable Array[Texture] = null
-
- # Second at witch `current_animation` started
- private var anim_ot = 0.0
-
- # Start the running animation
- fun start_running
- do
- anim_ot = app.world.t
- current_animation = running_animation
- end
-
- # Stop the running animation
- fun stop_running do current_animation = null
-
- # Update `texture` from `current_animation`
- fun update
- do
- var anim = current_animation
- if anim != null then
- var dt = app.world.t - anim_ot
- var i = (dt / time_per_frame).to_i+2
- texture = anim.modulo(i)
- end
- end
-end
-
# Manager to display numbers in sprite
class CounterSprites
gl_PointSize = scale / gl_Position.z * (pt+0.1);
if (pt < 0.1)
- v_color.a = pt / 0.1;
+ v_color *= pt / 0.1;
else
- v_color.a = 1.0 - pt*0.9;
+ v_color *= 1.0 - pt*0.9;
"""
end