Skip to content
/ airplanes Public

A 2D shoot 'em up game made with Go, Ebitengine, and donburi. Featuring ECS (Entity Component System).

License

Notifications You must be signed in to change notification settings

m110/airplanes

Repository files navigation

airplanes

License Go Report Card ActionsCI Play online

A 2D shoot 'em up game made with:

Assets by Kenney.

GitHub GameOff Disclaimer

Most of this game was created during October 2022. I wanted to take part in GitHub GameOff, but sadly didn't have enough time to create a new game.

I'm submitting this one and I hope this is still in the spirit of the competition since it was created pretty much within one month. You be the judge. :)

Status

Playable, with a long list of ideas and TODOs in the code. There are just two levels right now.

How to play

  • Player 1: WASD to move, Space to shoot
  • Player 2: to move, Enter to shoot

Shoot enemies and avoid bullets.

Collect powerups to evolve your airplane!

Playing

Play online: https://m110.github.io/airplanes/

Or local:

go run github.com/m110/airplanes@latest

Debug Mode

To enable debug mode, press the slash key (/).

Architecture

This game uses the ECS architecture provided by donburi. Parts of airplanes were ported to donburi as features.

The ECS structure is as follows:

  • component - contains all components. Components are Go structs with no behavior other than occasional helper methods.
  • system - contains all systems. Systems keep the logic of the game. Each system works on entities with a specific set of components.
  • archetype - contains helper functions for creating entities with specific sets of components.

Other packages:

  • assets - contains all assets. Assets are loaded using Go embedding, so they are compiled into the final binary (which makes it easier to distribute the game).
  • engine - helper functions for generic game logic.
  • scenes - contains all scenes.

Level Editor

You can edit the levels in the assets/levels directory using Tiled.

Levels are loaded using the level*.tmx pattern, so you can add new levels by adding new files with bigger numbers.

Supported objects are:

Object Description
enemy-airplane An enemy airplane.
enemy-tank An enemy tank shooting at the player.
enemy-turret-missiles An enemy turret shooting homing missiles.
group-spawn A group enemy spawn.

The rotation of objects is reflected in-game.

Parameters:

Parameter Description
speed Speed of the enemy, if different than default.
path Path of the enemy. If not provided, the enemy moves in the facing direction.
spawn Group spawn, if a group of enemies needs to spawn at once.

The path should point to either a polygon or a polyline object in the same layer. If a polyline is used, the enemy will follow the path and keep moving in the facing direction after the last point. Polygon paths work like loops.

Spawning

Enemies are spawned once the top camera boundary reaches their position. A group spawn spawns all connected enemies at once.

All objects despawn once they go out of screen.

Mobile Development Notes

  1. task mobile to create the Airplanes.xcframework.
  2. Open the Xcode project and deploy.
  3. If the app takes long to launch, Cmd + Shift + , and disable the "Debug executable" option.

Creating a new mobile project

  1. Create a new Xcode project (Game, SpriteKit).
  2. Add the Airplanes.xcframework to the project as a framework.
  3. Add the GameController.framework to the project as a framework.
  4. Update GameViewController to use MobileEbitenViewController.