The Flyin’Island game was an opportunity to develop a range of visual tricks. As a consequence, the gameplay was almost unexisting.
Here’s a detail of some of the techniques used to achieve the overall visual look in “the Flying Island”.
The 3D assets used for the game :
The Sea :
I made it with a set of concentric vertical waves. Each even circles are animated to the left, the odd ones are rotated to the right, then vice versa.
The UV coordinates were animated, to produce a scrolling effect of the texture, synchronised with the object animation.
Pros : easy to setup, no need for a morph or any kind of mesh deformation. Visually quite compelling.
Cons : once setup, it was almost impossible for the boat to move over the sea without making the trick obvious.
The island :
As the boat doesn’t really change its position, I had to implement an internal system to make it actually move.
Depending on its speed and heading, the boat will come closer to the island, or not.
The distance between the boat and the island it real, so is the compass representation, unless we come very close.
The visual representation of the island works like this :
screen_island_pos = (real_island_pos - real_boat_pos).Normalize() * Mtr(1500)
So that, whatever happens, the island will always remain at the same distance.
To give the illusion of distance, the island mesh is scaled, more and more, as the player will come closer to it.
The good : fun to implement
The bad : players won’t understand why they can’t actually reach the island !
The moon :
The glowing moon is a 3d sphere, with a 2D ring in its half, to mimick the glow effect. In order for this ring no to be noticed, the moon is always facing the camera, as for a billboard sprite.
The main light used on this scene has the same coordinated as the moon, so that everything looks like it was actually lit by the moon.
The Water Impacts :
Only a ring modeled in polygons, that was scaled on its Y axis to create an animation.
Pros : easy to setup, no morph, no texture
Cons : quite cheap once animated, looks like a bad Adobe Flash animation.
The boat animation :
In order for the boat to appear sailing on the sea, it was rotated on its X axis, back and forth, using a simple Cosine function.
But I wanted it to physically interact with the rest of the environment (skulls, cannon feedback, etc). So I enabled the physics on the whole boat object.
Directly modification of the boat rotation didn’t make any good to the physic system, especially regarding the collision detection.
To fix this problem, a dummy object was rotated, and the boat was connected to this dummy thanks to 3 physical joints (Position Constraints, aka Springs). Hence, the rotation was physically transmited to the boat thru the springs, easing greatly the collision system.
Same thing for the boat heading / turning.
In order to catch collisions properly, I placed collision cubes inside the boat. The result is not 100% accurate, but it works quite well.
Pros : The physics creates some additional appeal to the boat.
Cons : A bit complex to setup. Took me time to find the correct combination, though tt doesn’t serve the gameplay directly.
The boat visual :
The boat stands for the main part of the cockpit. It was modeled entirely, but eventually I got rid of the sails & poles, for they would have obscured the camera & the main view.
At first I planned to texture it, but with the lack of time, I simply relied on an Ambient Occlusion baking. Auto UV unwrap and render texture did almost all the work for me.
Pros : quite fast to get a cool & proper result.
Cons : less personal than a hand painted texture.
The canon & boulders :
As for the ship, they are all handled in physics. Before being shot, they will remain on the bridge, for they are trapped into an invisible collision box. Their trajectory is full physic as well, the initial force of ejection being proportionnal to the time the player pressed the fire button.
The good : Easy to implement, as the physics handled everything for me, collision included.
The bad : the straight trajectory is not really fun. As Toastie mentionned in the thread, a curved path would have been more interesting to play with.
The enemies :
The enemies are spawn behind the player, whatever its position.
To do this with a minimal maths skills, I used 3 dummmies objects, parented to the boat object. These dummies defined the area in which I wanted the enemies to be spawn, with a few vector & rand() operations.
k1 = Rand(0.0, 1.0) k2 = Rand(0.0, 1.0) v0 = ItemGetWorldPosition(spawn_area_a) v1 = ItemGetWorldPosition(spawn_area_b) - ItemGetWorldPosition(spawn_area_a) v2 = ItemGetWorldPosition(spawn_area_c) - ItemGetWorldPosition(spawn_area_b) enemy_pos = v0 + v1.Scale(k1) + v2.Scale(k2)
The good : the enemies look like a real armada, surrounding the player.
The bad : No AI at all, they can’t even shoot at the player, thus reducing a lot the challenge. More variety in the type of enemies would have been cool too. I had in mind to make some giant crabs or squids … or even the Kraken in the end.
The good :
* The game looks quite good and is close enough to what I had in mind in the beginning.
* I implemented a lot of stuff as well, that I won’t have to rewrite for the next game (menus, controller, audio manager, gui …).
* it was fun to make it.
The bad :
* The challenge in this game is reduced to the max.
* no AI for the enemies
* the game objectif is quite unclear (reach the island, for what ?)
* no end level boss
* you can’t even die