Jump to content
  • Advertisement
  • entries
  • comments
  • views

About this blog

Still making games...

Entries in this blog


Particle effects


Since the last update, I worked mainly on the hud and on particle effects for color change and for the eclipse in the hud (when it ends, the player has ran out of time to complete the current level - right now the level never ends, but you get the idea). Here's a video of the new stuff.





Hello there. Since my last entry I finished these items:

- Points system
- Options screen
- Pause menu
- 360 Gamepad support

Click here for a video. It's longer than usual but shows pretty much everything that's finished (except for the intro sequence).

- Tutorial
- Levels, lots more
- End sequence
- between-world sequences
- Credits




New Zombie Animations

My brother finished the new zombie animations. There are more frames for movement, attacking and dying. Video below:


Also, merry Christmas everyone!




DreamBuildPlay 2012

Graveyard Shift made the top 20!


A reference: http://www.theverge.com/gaming/2012/8/20/3255885/dream-build-play-design-competition-announces-it-40-finalists




Bennu on the 360...

I had a plan that if Bennu wasn't selected for the PAX 10, which it wasn't, I would participate in this year's DreamBuildPlay contest. But this year's DreamBuildPlay contest is for the 360 only, so I figured that since Braid was out too, I'd buy a 360. :) And by the way, Braid is totally worth it.

I was curious about how much effort it would take to port the game to the 360. The steps I went through may help someone in the same situation (some of them are explained in more detail in the creator's club web site):

1. Used XNA Studio's option to create a copy of each project for the 360, which gave me new compiler errors, as expected. This works well, the projects share files but you have to add new files to each project separately.

2. Added to each 360 project the 360-specific xna framework dlls (included in the XNA directory in Program Files).

4. Replaced references to libraries not supported on the 360. I was using the Application class in the System.Windows.Forms library to change the current system culture so the decimal separator employed on data files wouldn't get messed up on other systems. It was replaced by Double/Integer/whatever.Parse with an invariant culture. Timers also aren't supported, so I did a basic Timer class of my own.

3. Added a XBOX360 flag to each 360 project so I could use conditional compiling instructions for the platform. With this flag I was able to keep the mouse/keyboard code in the PC generated code but not on 360 code.

5. Removed the encoding specification from the XML files I load game data from as XNA on the 360 doesn't support encoding specification. Luckily I wasn't counting on a specific encoding.

6. Purchased a Creator's Club gold membership and downloaded XNA Game Connect from the XBOX live games list. I'm not sure you need the gold membership to do this, but I want to check out other games anyway.

7. Added the 360 console to XNA Game Studio on the pc, just needed to input an identification code so it knows which console to upload the game to (the game is uploaded through the internet without any direct connection needed between the pc and the console).

8. Deployed the game to the 360. Each time you build the game it checks which files were altered and uploads them, which is pretty neat.

By then the game was running on the 360. Which was freaking cool.

On the positive side, I was surprised I had to alter so little of the game code, specially the file input/output code. Also, the game looked good on a small tv, the colors where much brighter than on my LCD monitor.

On the negative side, I'm having performance issues on the 360. This is a common issue, reported my many developers. This is where I am now: Every 5-10 seconds, the game freezes for a second or so. I think it's the garbage collector, but I'm still running tests. Here's a collection of resources I've gathered on this subject:

Managed Code Performance on Xbox 360 for XNA: Part 1 - Intro and CPU
The cost of value types in .NET Compact Framework
XNA Framework Remote Performance Monitor for Xbox 360
Understanding XNA Framework Performance
Twin paths to garbage collector nirvana
Foreach, Garbage, and the CLR Profiler




Attack of the Verbose Dinosaur...

...The update is finally out. It should fixe the garbage collector slowdowns that occurred from time to time.

Also, although it passed peer review, two people mentioned a crash but couldn't tell how to reproduce it. If you find it please tell me. :)




Bennu Revisited...

I just pulled Bennu out of the Xbox Marketplace, the reason being I'm about to release a free version for PC. Even though Bennu is only selling an average of 1 copy per month, it would be harsh having a priced version of Bennu with it being free on the PC.

The PC version will not be a direct port, featuring:
- Improved controls (more accurate pointing, faster rolling).
- Keyboard controls (and mouse on the menus).
- Improved tutorial.
- New and missing levels (the harsher ones of the first world were removed and replaced by easier ones).
- Some minor changes to dialogue.

Why free? As mentioned before, sales on the Xbox weren't so good (it sold about 180 copies), but I still feel it was our best game so far. I'm hoping it will get to more people on PC, where gamers are more used to hard-to-master games.




Bennu "box" art

To submit a game to community games you need to create "fake box" art to display on the xbox marketplace. Here's Bennu's:

EDIT: New version




The Papyrus Swamps

Click here for a video of a level on Bennu's second area, "The Papyrus Swamps".

To create the trees in the background (and the papyrus) I used the classes that were created for the game intro. Each tree is composed of a trunk, lianas and branches.

When a tree is generated, I randomly pick 3 to 6 of the 6 maximum branches and rotate them
around the point where they're attached to the trunk. I also scale and rotate the whole tree randomly.

I submitted Bennu for the PAX 10. I'm not expecting anything to come out of this, because there are bigger teams working on their games full-time and I'm just doing Bennu after work - I'm a programmer for a stock-broker.

The demo I sent featured the intro, the main menu and 7 levels, 3 from the "Lost Temple of Abu Simbel" area and 4 from "The Papyrus Swamps".

I expect Bennu to be ready this year if everything goes right.




Intro & Isis

I pretty much finished the intro to Bennu. I got some criticism about the "actors" in it looking too mechanical, so I attached some wires to make them look like marionettes. :) Click here for a video.

I've also been working on the Isis "actor", which will show up in the tutorial. Below is the finished drawing and the picture she was inspired from (though the starting point was obviously the Set drawing):




Hey kids...

...I guess I can say "kids" now, since I'm almost 30. >

I've finished most of the artwork for the third "world", the egyptian Underworld, and I've also been working on new levels. Click here for a vid of a new level in the Underworld.

Right now I have 13 levels, I want at least 30. Making a level is fast once I get an idea, the problem is getting it. :)




Breaking the chain - more videos and screenshots

In Bennu, everytime you create a ball chain, balls are created in regular intervals from the beak of the Bennu to the first object found in the direction the beak is pointing to. If an object is found the balls are chained together, if no object is found the points are still created but fall to the ground.

Previously, everytime you created a new chain the balls that belonged to the previous chain were removed from the scene and placed in a "ball cache" in order to prevent performance issues. I changed that in order for the balls to remain on the scene until they were needed for a new chain. The result can be seen in this video.

Also I did a new level that explores something I did some months ago: in later worlds everytime the Bennu touches a block of the wrong color (a different color from the Bennu's current color) a new block is spawned. In this level the walls are slippery so the Bennu can't grab to them and he dies if he falls on the water. See it in action.




Suit Suit Go is out now for iOS and Android!

Just realized now I didn't even talk about this game here before.

Suit Suit go is a puzzle/card game where you upgrade cards by making sequences. It was developed with Unity. It's free and our first game to be ad-supported. Please give it a try!






Beta version!

[color=rgb(41,47,51)][font=Arial] The beta version of Twitchy Thrones is ready! If you have an iPhone and want to help us test/improve it please go here: [/font][/color]http://tflig.ht/1w0mXSn

More information about the game here:

Here's the game in motion:




New tile upgrade - Flame trail

Made a new tile upgrade that when the player steps on starts leaving behind a flame trail that damages zombies. The tile sprite is not final. Right now, the big red "X" represents a cooldown during which the player can't step on the tile again. Video here:

[media] [/media]




Phat Ninja

So I finished incorporating a new ninja... phat ninja! When playing co-op, one player will play as the previous "thin" ninja and the other as the phat ninja.

">Video here. If you can watch it on full screen to see all the body animations.





Attack of the 50ft Dinosaur is now in playtest. If you are an Xna Creators Club member and you have nothing better to do, give it a try here.

Here's the game cover, I'm not sure if it's the final one:

EDIT - The second image should be the final one, my brother changed it to make the dinosaur look even more deranged.




Status update...

Bennu is currently at 75% of the Peer Review process. This doesn't exclude the possibility of someone finding a bug that resets the whole process, but still, it's closer.

In the meantime, Bennu was featured in the IndieGames.com Weblog and in Co-Optimus.





I'm doing an animated frog for Bennu, so I started by doing the frog sprite first.
Below are the steps the sprite went through in its creation.

1. I searched the net for reference pictures and drawings.

2. Paths were used to create the main shapes of the frog...

3. ...and the animated parts were left on separate layers so they can be used as separate images.

(These separate images will be rotated and translated to animate the frog)

4. Shadows and highlights were used to make the frog more 3-D (the amulet on the top-right of the reference images was the main source for this)

And it's (mostly) done. :)




Graveyard Shift Update...

Still "working" on Graveyard Shift:

- Corrected a slew of bugs.

- Changed the main font to something more suitable to an action/horror game.

- Fixed a design problem: previously, the only way to win a decent quantity of souls was to lay down a soul sucker tile upgrade. Souls are the currency in this game, so if you didn't lay down the mentioned upgrade before running out of money, you would be stuck with very limited weapons and a very small base. So now, the tile that is already set when you start a game accelerates time during the day and captures nearby zombie souls by night. The player will still need to lay down soul sucker upgrades as her base grows.

- Added delimiters to show the player where the soul capturing limits are (helps to place new soul sucker upgrades).

- Added a new weapon, the Fever Ray (homage FTW). The fever ray will be one of the more powerful weapons, it creates a continuous ray that both damages and pushes
back zombies. With an yet-to-be-introduced upgrade it will hit all zombies in its path.

Here's a new video showing the Fever Ray (in the beginning I place four soul sucker upgrades to increase the soul capture range, it's better to watch in full screen to see all the details):





A very positive review from IGN.

I've been getting some complaints about the controls. The controls in Bennu are definitely not intuitive, because they simulate a ball and chain, and so you have to gain impulse to swing around. Most people expect to be able to just point the ball to wherever they want within the limits of the chain and so get frustrated quickly. I'm doing an update with an alternative control system to update this, but it will be a little too late.

Like IGN says in the review, the more you play the more you like it, but I don't think anyone will like Bennu after playing only 2 minutes.




First level!

Welcome to the Bennu journal.

Right now I've finished the first prototype of the game, which has programmer art *shudders* and lacks many of the features I hope to implement.

Bennu is a puzzle game that can be described as puzzle-bobble meets spiderman meets some-cool-stuff-not-done-yet. Basically you control Bennu, an old bird that can't fly for long and so goes around each level using his tail to grab to whatever he can and swing himself around, smashing bricks with his head (the head and the bricks must have the same color), until there are no bricks left. Currently his color changes every five seconds but in the future the player will have to touch bonuses with the Bennu to change color.

Right now the blocks are generated randomly, but in the final game each level will have a hand-made layout. Click here to see a movie of the game.

The game is being developed using XNA and the Farseer 2D Physics Engine, which (so far) I highly recommend. :)





My brother suggested that I should display a chain instead of the balls I previously used to show the connection from the Bennu to the object it's swinging from. Click here for a video.

I also got major performance improvements from switching my broad-phase collision algorithm. I was previously using a modification of the sweep and prune implementation that came with the Farseer Physics Engine. In the way I was using sweep and prune, objects were being sorted in an array by their lower and upper boundaries along the X axis.

In my specific case I have a lot of objects, but most are static (such as the blocks and obstacles), so the array processing got expensive on more complex levels.

I switched to a grid-based collision algorithm, where all static objects are placed in a two-dimensional matrix where each position corresponds to a sub-square of the level, containing the list of static objects that are present in that sub-square. An object is placed in every sub-square from his lower (x,y) boundary to his upper (x,y) boundary, as depending on the object's dimensions it can belong to more than one sub-square. The non-static objects are kept in a list apart, and collisions are only checked between each non-static object and the static objects in the sub-squares the non-static object is currently located in.

Right now the collisions between each pair of non-static objects are all being checked, since I have a small number of them, but these can be optimized apart.




Shadows & Highlights

A friend thought Twitchy Thrones' sprites were too flat so some shadows/highlights were added. Here's an Hollywood-plastic-surgery-style before/after comparison.








Box2D.XNA and ear clipping...

The first difficulty I ran across in OMA was importing polygons into the game. The polygons in Box2D.XNA must be convex and are limited to 8 vertexes (for performance reasons), which means that when using complex polygons you have to divide them into simpler polygons. One of the authors of Box2D.XNA suggested ear clipping, an algorithm to divide polygons into triangles. The algorithm described in that paper is more optimized than the implementation I went with, because since I only partition the polygons during game initialization, performance isn't that important.

As mentioned in the paper, "an ear of a polygon is a triangle formed by three consecutive vertices Vi0, Vi1, and Vi2 for which no other
vertices of the polygon are inside the triangle." The basic algorithm consists of taking the initial polygon vertex list and removing ears one by one until only one triangle remains. The paper suggests using a double-linked list to store the polygon vertexes because it's a data structure that allows quick access to both current, previous and next elements when iterating the list, as well as fast removal and insertion.

Additionally, a circular list would be even more useful so that no boundary checks would be necessary. In the .Net C# framework, the double-linked list implementation doesn't allow for circular lists, meaning that the last element on the list will always be null, instead of the first element. You also can't change this pointer on the list, because a node can only be inserted in the list once. So I did my own generic circular list implementation, which is basically the same as all circular list implementations: :)

public class CircularListNode
public CircularListNode previous, next;
public T value;

public class CircularList
public CircularListNode first, last;

public void Add(T value)
CircularListNode node;

node = new CircularListNode();
node.value = value;

if(first == null)
first = node;
last = node;
last.next = node;
node.previous = last;

last = node;
first.previous = last;
last.next = first;

public void Remove(CircularListNode node)
if(first == null)

node.previous.next = node.next;
node.next.previous = node.previous;

if(node == first)
first = node.next;

if(node == last)
last = node.next;

(Note that this implementation in particular isn't meant to be used outside of this context: the node removal doesn't check if the list is empty because in our particular case it should never be.)

Next, the ear clipping algorithm:

public class GeometryFactory
public static List> EarClip(CircularList vertices)
List> ears;
CircularListNode node1, node2;
bool isEar;

ears = new List>();

node1 = vertices.first;
while(node1.previous.previous != node1.next)
isEar = (InternalAngle(ref node1.previous.value, ref node1.value, ref node1.next.value)
node2 = node1.next.next;
while(node2 != node1.previous)
if(PointInsideTriangle(ref node2.value,
ref node1.previous.value, ref node1.value, ref node1.next.value))
isEar = false;

node2 = node2.next;

ears.Add(new List { node1.previous.value, node1.value, node1.next.value });

node2 = node1.next;
node1 = node2;

node1 = node1.next;

ears.Add(new List { node1.previous.value, node1.value, node1.next.value });

return ears;

The EarClip function receives the vertex circular list (The vertexes must be ordered in anti-clockwise order). It then iterates it, looking for ears. The first check is done by the InternalAngle function, which verifies if the angle formed by the current vertex and its siblings is convex or concave. If it's concave, it can't be an ear and there's no need to do the next step: verifying if any of the other vertexes is inside the triangle formed by the current vertex (the "ear tip") and its siblings (which is done using the PointInsideTriangle function). Each time a ear is found the triangle it forms is added to the output ear list. The "ear tip" vertex is removed and the iteration continues. The iteration stops when there are only 3 elements on the list, which are the final triangle.

The InternalAngle function:

private static float InternalAngle(ref Vector2 v1, ref Vector2 v2, ref Vector2 v3)
Vector2 a, b;
float angle;

a = v2 - v1;
b = v3 - v2;

angle = (float)Math.Atan2(b.Y, b.X) - (float)Math.Atan2(a.Y, a.X);
if(angle {
angle += (float)Math.PI * 2;

return angle;

The PointInsideTriangle function (if you're interested in how it's derived go here):

private static bool PointInsideTriangle(ref Vector2 p, ref Vector2 a, ref Vector2 b, ref Vector2 c)
Vector2 v0, v1, v2;
float dot00, dot01, dot02, dot11, dot12,
invDenom, u, v;

// Compute vectors
v0 = c - a;
v1 = b - a;
v2 = p - a;

// Compute dot products
Vector2.Dot(ref v0, ref v0, out dot00);
Vector2.Dot(ref v0, ref v1, out dot01);
Vector2.Dot(ref v0, ref v2, out dot02);
Vector2.Dot(ref v1, ref v1, out dot11);
Vector2.Dot(ref v1, ref v2, out dot12);

// Compute barycentric coordinates
invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
u = (dot11 * dot02 - dot01 * dot12) * invDenom;
v = (dot00 * dot12 - dot01 * dot02) * invDenom;

// Check if point is in triangle
return (u > 0) && (v > 0) && (u + v }

The List> returned by the EarClip function can be used to add each triangle to a Box2D.Xna shape:

Body body;
BodyDef bd;
PolygonShape shape;
Fixture f;

CircularList vertices;
List> triangles;

vertices = new CircularList();
// Build the polygon vertex list here

bd = new BodyDef();
// Set additional body properties here

triangles = GeometryFactory.EarClip(vertices);
foreach(List triangle in triangles)
shape = new PolygonShape();
shape.Set(triangle.ToArray(), triangle.Count);
f = body.CreateFixture(shape, 1.0f);
// Set additional fixture properties here

And that's it.



  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!