Skip to content

A toy Asteroids clone written in Elixir with the Scenic UI library

License

Notifications You must be signed in to change notification settings

axelson/scenic_asteroids

Repository files navigation

Scenic Asteroids Logo

Scenic Asteroids

Demo of Gameplay

This is an Asteroids clone written in Elixir with Nerves, more for fun and learning than for anything else. Also since the code (and behavior) is relatively simple, I hope that it can serve as an example for Scenic, Nerves, and as a simple poncho project.

It is licensed under the 3-clause BSD license (see LICENSE) for details.

Instructions

From the root of the repository run the following commands:

Note: if scenic doesn't launch then you may be affected by the bug ScenicFramework/scenic_new#36

Keys:

  • W - Move up
  • A - Move left
  • S - Move down
  • D - Move right
  • SPC - Shoot an asteroid

Use the mouse to target the asteroids (or your finger if you're running with a Nerves touch screen)

Have fun!

Implementation Notes

SchedEx is used to implement the core animation timer which runs at a rate of 60 frames per second.

Collision detection is incredibly basic and non-performant. Ideally either scenic or a cooperating library would implement some collision detector helpers. If you're interested in collision detection then please contribute to Scenic issue #91.

Projects

  • play/ - The main game logic
  • play_ui/ - Run via scenic on the desktop
  • fw/ - Run on a Nerves device with a touchscreen
    • Official Raspberry PI touch screen is supported

JS Multiplayer (in progress)

TODO:

  • Get basic nerves install working on network
  • Run scenic play application on nerves!
  • Add multiplayer via Phoenix channels
    • Add single player control via browser
    • Ask for player name
    • Add a waiting screen/lobby
  • Splash screen add option to choose single player or multiplayer
    • Logo will come down and then the options appear
    • Pressing "SPC" or "s" will start single player immediately
    • Pressing "m" will start multi player immediately
  • Test possibility of rendering the current scene to an html canvas

The player javascript will record action states (not key states) Actions:

  • move_aim_direction (vector)
    • Note: This will also be used for aiming direction
  • move_up
  • move_right
  • move_down
  • move_left
  • aim_direction (vector)
  • shoot

NOTE: if move_aim_direction is used then the other move and aim actions should not be used. This will be enforced on the server-side.

  • Channel actions
    • set:actions
      • When the channel receives this it will do a GenServer.cast to the Asteroids scene to update that players currently set actions
      • If the channel process goes down, the scene will clear all actions for that player
        • Perhaps this can be accomplished with a process link?

About

A toy Asteroids clone written in Elixir with the Scenic UI library

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published