X-Git-Url: http://nitlanguage.org diff --git a/contrib/action_nitro/src/action_nitro.nit b/contrib/action_nitro/src/action_nitro.nit index 56a055b..2c6afdc 100644 --- a/contrib/action_nitro/src/action_nitro.nit +++ b/contrib/action_nitro/src/action_nitro.nit @@ -18,7 +18,6 @@ module action_nitro is app_version(1, 0, git_revision) android_manifest_activity """android:screenOrientation="sensorLandscape"""" - android_api_target 10 end import gamnit::depth @@ -41,9 +40,12 @@ redef class App # 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") @@ -77,11 +79,11 @@ redef class App # 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 @@ -134,22 +136,26 @@ redef class App 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") # Load 3d models iss_model.load + if iss_model.errors.not_empty then print_error iss_model.errors.join("\n") # Setup cameras world_camera.reset_height 60.0 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 @@ -275,7 +281,6 @@ redef class App 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 @@ -403,16 +408,12 @@ redef class App 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 @@ -469,12 +470,12 @@ redef class Human # 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 @@ -507,7 +508,7 @@ end redef class Boss redef var actor is lazy do var actor = new Actor(app.iss_model, center) - actor.rotation = pi/2.0 + actor.yaw = pi/2.0 return actor end @@ -524,19 +525,31 @@ redef class Boss 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 @@ -556,7 +569,7 @@ redef class Player var splatter = new Actor(app.splatter_model, new Point3d[Float](center.x, 0.05 & 0.04, center.y)) splatter.scale = 32.0 - splatter.rotation = 2.0 * pi.rand + splatter.yaw = 2.0*pi.rand app.actors.add splatter end @@ -611,60 +624,12 @@ redef class World 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) - end - end -end - -redef class Int - # Pad a number with `0`s on the left side to reach `size` digits - private fun pad(size: Int): String - do - var s = to_s - var d = size - s.length - if d > 0 then s = "0"*d + s - return s - 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) + 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 @@ -721,8 +686,8 @@ redef class SmokeProgram 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