Holy Exploding Planets Batman!
Greetings all!
I've still been tinkering with adding elements to the environment, and have something new I wanted to share with the community. And if you read the title, you probably already guessed it -- exploding planets! Yes, there is already a very nice explosion visual available in the provided script library (thank you Daid!), but I wanted to take that up a level and add planetary "chunks" that explode outward in a randomized pattern and velocity. This is the basic set up to do just that.
I've commented the code and all the variables should be self-explanatory. There's also a little bit of console print statements for debugging purposes, but of course you don't need to keep these.
So run this on the server, and then access the player ship from a client and watch the explosion from the main screen and different positions. It's pretty neat! (You initiate the explosion countdown via the "Kaboom" button in the GM screen.)
Obviously, this is just the base set up. Next level … yup, supernovas! Bet you can't wait. ;]
Copy everything below into your script file, save, run, enjoy, repeat! ;]
I've still been tinkering with adding elements to the environment, and have something new I wanted to share with the community. And if you read the title, you probably already guessed it -- exploding planets! Yes, there is already a very nice explosion visual available in the provided script library (thank you Daid!), but I wanted to take that up a level and add planetary "chunks" that explode outward in a randomized pattern and velocity. This is the basic set up to do just that.
I've commented the code and all the variables should be self-explanatory. There's also a little bit of console print statements for debugging purposes, but of course you don't need to keep these.
So run this on the server, and then access the player ship from a client and watch the explosion from the main screen and different positions. It's pretty neat! (You initiate the explosion countdown via the "Kaboom" button in the GM screen.)
Obviously, this is just the base set up. Next level … yup, supernovas! Bet you can't wait. ;]
Copy everything below into your script file, save, run, enjoy, repeat! ;]
-- Name: Exploding Planet Test ver 0.4
-- Description: Planets, exploding, in a test
-- Type: Basic
require("utils.lua")
function kaboom(exploding_planet_x_location, exploding_planet_y_location)
-- set variable to initiate countdown of test planetary explosion
countdown_active = true
countdown_timer = 300 -- 60 'ticks' per second
-- set up the initial multi-dimensional array to contain all the exploding chunks of the planet (asteroids)
explosive_chunks = 250 -- careul here -- 500 seems to be about the max before server crashes; seems to handle 250 ok
explosive_chunks_matrix = {}
-- set up the min and max boundaries for exploding chunk sizes
-- a random value will be assigned from this range
chunk_min_size = 50
chunk_max_size = 750
-- set up the min and max velocity boundaries for exploding chunks
-- a random value will be assigned from this range
chunk_min_velocity = 20
chunk_max_velocity = 100
for i=1,explosive_chunks do
explosive_chunks_matrix[i] = {}
-- for each verticle "record" in the multi-dimensional array, these are the items in the record:
-- item 1: an asteroid object (our 'exploding chunks'), with a randomly generated size,
-- initially set to the same location as the planet to explode
explosive_chunks_matrix[i][1]=Asteroid()
:setSize(math.random(chunk_min_size, chunk_max_size))
:setPosition(exploding_planet_x_location, exploding_planet_y_location)
-- item 2: the heading of the chunk as it explodes outward, randomly generated
explosive_chunks_matrix[i][2]=math.random(1, 360)
-- item 3: the velocity of the chunk, randomly generated
explosive_chunks_matrix[i][3]=math.random(chunk_min_velocity, chunk_max_velocity)
end
print("Explosion matrix initiated with " .. explosive_chunks .. " chunks!")
print(countdown_timer/60 .. " second countdown underway....")
return countdown_active, countdown_timer, explosive_chunks, explosive_chunks_matrix
end
function init()
print("\n","\n","Exploding Planet Test Scenario newly initiated")
-- Spawn a player ship (Atlantis) (mostly just for seeing objects through the ship's forward view screens)
player_ship = PlayerSpaceship()
:setFaction("Human Navy")
:setTemplate("Atlantis")
:setPosition(0, 20000)
:setHeading(0)
-- player_ship:setShieldsActive(true)
countdown_active = false
explosion_in_progress = false
exploding_planet_x_location = 0
exploding_planet_y_location = 0
exploding_planet_radius = 2000
-- very important! set the distance from the explosion center you'd like the chunks (asteroids) to be
-- removed from the game, otherwise they'll continue on forever and forever.... ;]
clean_up_distance = 100000
exploding_planet = Planet()
:setPosition(exploding_planet_x_location, exploding_planet_y_location)
:setPlanetRadius(exploding_planet_radius)
:setPlanetSurfaceTexture("planets/planet-1.png")
:setPlanetCloudTexture("planets/clouds-1.png")
:setPlanetAtmosphereTexture("planets/atmosphere.png")
:setPlanetAtmosphereColor(0.2,0.2,1.0)
-- put in the button to activate the planet explosion countdown
addGMFunction("Kaboom",
function()
countdown_active, countdown_timer, explosive_chunks, explosive_chunks_matrix
= kaboom(exploding_planet_x_location, exploding_planet_y_location)
remaining_number_of_chunks = explosive_chunks
end
)
end
function update(delta)
if delta ~= 0 then
-- Countdown first.....
if countdown_active then
countdown_timer = countdown_timer -1
if countdown_timer == 0 then
explosion_in_progress = true
countdown_active = false
print("BOOM!")
local x, y = exploding_planet:getPosition()
-- kill off the planet object
exploding_planet:destroy()
-- replace the planet with an explosion effect:
ExplosionEffect()
:setPosition(x,y)
:setSize(exploding_planet_radius * 5)
end
end
if explosion_in_progress then
-- iterate through the explosive_chunks_matrix and move chunks according to previously randomized heading and speed
for i,chunk in ipairs(explosive_chunks_matrix) do
if chunk[1]:isValid() then
chunk_pos_x, chunk_pos_y = chunk[1]:getPosition()
-- from utils.lua:
-- setCirclePos(obj, x, y, angle, distance)
-- obj: An object.
-- x, y: Origin coordinates.
-- angle, distance: Relative heading and distance from the origin.
-- also remember the array positions for each asteroid (chunk) in the matrix:
-- index 1: is the asteroid object
-- index 2: is the asteroid's heading
-- index 3: is the asteroid's speed
setCirclePos(chunk[1], chunk_pos_x, chunk_pos_y, chunk[2], chunk[3])
-- check to see if the chunk has gone beyond the established "clean_up_distance", and if so, remove from game
-- and clean up the array
if distance(chunk[1], exploding_planet_x_location, exploding_planet_y_location) > clean_up_distance then
chunk[1]:destroy()
chunk[2] = nil
chunk[3] = nil
-- these next few lines print the remaining number of chunkc to the console
-- (I need to find a more elegant way of calling an end to the explosion as some chunks
-- are lost due to collision with ships and this number is not tracked at the moment)
remaining_number_of_chunks = remaining_number_of_chunks - 1
print("Remaining number of chunks = ", remaining_number_of_chunks)
if remaining_number_of_chunks == 0 then
explosion_in_progress = false
end
end
end
end
end
end
end
Comments