{"id":16837880,"url":"https://github.com/m110/airplanes","last_synced_at":"2025-08-17T14:07:13.195Z","repository":{"id":61628519,"uuid":"545715722","full_name":"m110/airplanes","owner":"m110","description":"A 2D shoot 'em up game made with Go, Ebitengine, and donburi. Featuring ECS (Entity Component System).","archived":false,"fork":false,"pushed_at":"2024-11-03T09:54:52.000Z","size":24104,"stargazers_count":300,"open_issues_count":2,"forks_count":16,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-08-12T06:32:08.640Z","etag":null,"topics":["ebiten","ebitengine","ecs","entity-component-system","game"],"latest_commit_sha":null,"homepage":"https://m110.github.io/airplanes/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m110.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-04T21:24:58.000Z","updated_at":"2025-08-09T21:47:55.000Z","dependencies_parsed_at":"2024-12-11T06:03:01.678Z","dependency_job_id":null,"html_url":"https://github.com/m110/airplanes","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/m110/airplanes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m110%2Fairplanes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m110%2Fairplanes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m110%2Fairplanes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m110%2Fairplanes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m110","download_url":"https://codeload.github.com/m110/airplanes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m110%2Fairplanes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270856775,"owners_count":24657700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-17T02:00:09.016Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ebiten","ebitengine","ecs","entity-component-system","game"],"created_at":"2024-10-13T12:19:18.015Z","updated_at":"2025-08-17T14:07:13.136Z","avatar_url":"https://github.com/m110.png","language":"Go","readme":"# airplanes\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/m110/airplanes/blob/master/LICENSE)\n[![Go Report Card](https://goreportcard.com/badge/github.com/m110/airplanes)](https://goreportcard.com/report/github.com/m110/airplanes)\n[![ActionsCI](https://github.com/m110/airplanes/actions/workflows/deploy-web.yml/badge.svg)](https://github.com/m110/airplanes/actions/workflows/deploy-web.yml)\n[![Play online](https://img.shields.io/static/v1?label=play\u0026message=online\u0026color=brightgreen\u0026logo=github)](https://m110.github.io/airplanes/)\n\nA 2D shoot 'em up game made with:\n\n* Go\n* [Ebitengine](https://github.com/hajimehoshi/ebiten)\n* [donburi](https://github.com/yohamta/donburi)\n* [Tiled](https://www.mapeditor.org/) and [go-tiled](https://github.com/lafriks/go-tiled)\n\nAssets by [Kenney](https://kenney.nl).\n\n![](docs/screenshot.png)\n\n## GitHub GameOff Disclaimer\n\nMost of this game was created during October 2022. I wanted to take part in GitHub GameOff,\nbut sadly didn't have enough time to create a new game.\n\nI'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.\nYou be the judge. :)\n\n## Status\n\nPlayable, with a long list of ideas and TODOs in the code. There are just two levels right now.\n\n## How to play\n\n* Player 1: \u003ckbd\u003eW\u003c/kbd\u003e\u003ckbd\u003eA\u003c/kbd\u003e\u003ckbd\u003eS\u003c/kbd\u003e\u003ckbd\u003eD\u003c/kbd\u003e to move, \u003ckbd\u003eSpace\u003c/kbd\u003e to shoot\n* Player 2: \u003ckbd\u003e↑\u003c/kbd\u003e\u003ckbd\u003e←\u003c/kbd\u003e\u003ckbd\u003e↓\u003c/kbd\u003e\u003ckbd\u003e→\u003c/kbd\u003e to move, \u003ckbd\u003eEnter\u003c/kbd\u003e to shoot\n\nShoot enemies and avoid bullets.\n\nCollect powerups to evolve your airplane!\n\n![](docs/evolution.gif)\n\n## Playing\n\nPlay online: https://m110.github.io/airplanes/\n\nOr local:\n\n```\ngo run github.com/m110/airplanes@latest\n```\n\n## Debug Mode\n\nTo enable debug mode, press the slash key (`/`).\n\n![](docs/debug.png)\n\n## Architecture\n\nThis game uses the ECS architecture provided by [donburi](https://github.com/yohamta/donburi).\nParts of airplanes were ported to donburi as features.\n\nThe ECS structure is as follows:\n\n* `component` - contains all components. **Components** are Go structs with no behavior other than occasional helper methods.\n* `system` - contains all systems. **Systems** keep the logic of the game. Each system works on entities with a specific set of components.\n* `archetype` - contains helper functions for creating entities with specific sets of components.\n\nOther packages:\n\n* `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).\n* `engine` - helper functions for generic game logic.\n* `scenes` - contains all scenes.\n\n## Level Editor\n\nYou can edit the levels in the `assets/levels` directory using [Tiled](https://www.mapeditor.org/).\n\nLevels are loaded using the `level*.tmx` pattern, so you can add new levels by adding new files with bigger numbers.\n\n![](docs/editor.png)\n\nSupported objects are:\n\n| Object                  | Description                               |\n|-------------------------|-------------------------------------------|\n| `enemy-airplane`        | An enemy airplane.                        |\n| `enemy-tank`            | An enemy tank shooting at the player.     |\n| `enemy-turret-missiles` | An enemy turret shooting homing missiles. |\n| `group-spawn`           | A group enemy spawn.                      |\n\nThe rotation of objects is reflected in-game.\n\nParameters:\n\n| Parameter | Description                                                                  |\n|-----------|------------------------------------------------------------------------------|\n| `speed`   | Speed of the enemy, if different than default.                               |\n| `path`    | Path of the enemy. If not provided, the enemy moves in the facing direction. |\n| `spawn`   | Group spawn, if a group of enemies needs to spawn at once.                   |   \n\nThe `path` should point to either a polygon or a polyline object in the same layer.\nIf a polyline is used, the enemy will follow the path and keep moving in the facing direction after the last point.\nPolygon paths work like loops.\n\n### Spawning\n\nEnemies are spawned once the top camera boundary reaches their position.\nA group spawn spawns all connected enemies at once.\n\nAll objects despawn once they go out of screen.\n\n### Mobile Development Notes\n\n1. `task mobile` to create the `Airplanes.xcframework`.\n2. Open the Xcode project and deploy.\n3. If the app takes long to launch, \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003e,\u003c/kbd\u003e and disable the \"Debug executable\" option.\n\n#### Creating a new mobile project\n\n1. Create a new Xcode project (Game, SpriteKit).\n2. Add the `Airplanes.xcframework` to the project as a framework.\n3. Add the `GameController.framework` to the project as a framework.\n4. Update `GameViewController` to use `MobileEbitenViewController`.\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm110%2Fairplanes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm110%2Fairplanes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm110%2Fairplanes/lists"}