Vertical World is a 2.5D multiplayer-playable game. I say multiplayer-playable because you can control both characters yourself.

I kept changing my idea on what I wanted to implement. In the end, I went for 3D graphics with 2D game play to focus more on the visuals rather than game logic. For tools I used OpenGL, GLUT, and tinyobjloader.


The controls for Vertical World are simple:

For Player 1:

  • Move Left: A
  • Move Right: D
  • Float: S
For Player 2:
  • Move Left: J
  • Move Right: L
  • Float: K

The object of the game is up to you, the player(s)! Here are some suggestions:
  • Play tag: have one player be "it" and try and catch the other player!
  • Race to the top: both players start at the bottom level. The first one to the top wins!
  • Race to the bottom: both players start at the top level. The first one to the bottom wins!
  • Capture the Flag: Whoever can capture the flag wins!
  • Capture the Flag 2: Whoever can capture the flag the most time wins!
  • Tag with Flag: Use the flag to your advantage by switching up the tiles to either get away or trap the other player.



The camera pans out based on the distance between the two players. Note that levels (from ground up) is meant to represent Earth's levels (start at the ground, end at the sky).

Capturing the flag adds a collision effect and then randomly changes the tiles and sets a new flag position. Notice how the red player falls down after the tile below it is removed.

When the characters collide (detected using the distance between them) particles are shown and animated.

I use a 2D array to model where the tiles are placed and then use the character's position to figure out where it is within the model. Using this info, I can determine the bounds of how high/low the character can ascend/descend to. This lets me avoid the costly computation of checking whether a character is colliding with a tile—instead it is basically as simple as indexing into the array.

Other Notes:

  • I created the Character obj (magic floating duck) using Blender. The other objs are from TinySquid.
  • Subtle character animation on the z-axis.
  • Flag constantly spins.
  • The scene is Phong shaded
  • The background of each level has its own texture (many gleaned from Shutter Stock).
  • All colors (except for the white character) are randomly generated. Capturing a flag randomly sets the location and color of itself and every tile.