Giter VIP home page Giter VIP logo

elminator's Introduction

Allgemein

In diesem Projekt wurde ein Rennspiel mit Elm realisiert. Hierbei wurde Elm in der Version 0.19 verwendet. Die Darstellung des Spiels erfolgt mittels PNG Grafiken und SVG Elementen, die in einem festgelegtem Intervall aktualisiert werden.

Auf Grund von Verwendung der Elm Ports, muss eine angepasste index.html verwendet werden. Bei Änderungen kann daher nicht mehr der elm reactor verwendet werden. Das Erzeugen der neuen Version erfolgt mir dem Befehl elm make src/main.elm --output src/js/elm.js

Die Darstellung ist für die Browser Chrome optimiert.

Verwendete Techniken

Auf Grund des Projektumfangs wurde die gesamte Applikation in Untermodule unterteilt, die durch einen Router in der Main.elm die entsprechenden Messages erhalten um darauf zu reagieren.

WebSockets

Der Multiplayer wurde mit WebSockets realisiert. Hierfür existiert jedoch kein natives Modul von Elm, weswegen auf ein Community Package zurückgegriffen werden musste (billstclair/elm-websocket-client). Hierbei wird ein Elm Port verwendet, um die WebSocket Verbindung über JavaScript anzusprechen.

JSON Encoding/Decoding

Über den WebSocket werden lediglich Strings versendet, weswegen die einzelnen Nachrichten zunächst enkodiert/dekodiert werden müssen. Elm bietet prinzipiell die Möglichkeit Nachrichten zu einem JSON zu verarbeiten. Das Handling ist jedoch bei größere Objekten unkomfortabel, weswegen wir uns für die Verwendung des Pakets elm-community/json-extra entschieden haben, welches es ermöglicht verschiedene Decoder zu pipen.

Des Weiteren wurde ein Schema eingeführt, welches aus dem umfangreichen GameObjects des Spielers nur die relevanten Informationen nutzt und diese über den WebSocket zu versenden.

Commands, Subscriptions

Die Commands wurden eingesetzt um Nachrichten an den WebSocket zu senden. Subscriptions kamen für die KeyBoard Inputs sowie die intervallbasierten Aktualisierungen zum Einsatz.

Generator

Um Lobbies sowie Spieler eindeutig identifizieren zu können, wurde das Paket TSFoster/elm-uuid eingeführt, welches u.A. zufällige UUID erzeugen kann. Dieses Paket stellt entsprechende Generatoren bereit, welche im Programm direkt verwendet werden können.

Inhaltliche Herausforderungen

Es wurde auf fertige Pakete bzgl. der "Game-Engine" komplett verzichtet. Insbesondere die Umsetzung der Collision Detection und der Physikalischen Einflüsse erforderten viel Aufmerksamkeit. Die Collision Detection wurde zum aktuellen Stand aus Zeitgründen mit Axis Aligned Bounding Boxen realisiert.

Das Programm sieht schon jetzt geometrischen Collider Formen vor, die von den typischen Rechteck abweichen können. Die Verwendeung dieser wäre in Verbindung mit dem Seperated Axis Theorem (https://www.metanetsoftware.com/technique/tutorialA.html) möglich.

Performance Anmerkungen

Bei paralleler Ausführung mehrere Elminator Instanzen verringert sich die FPS Anzahl (geräte abhängig). Es wäre genauer zu Untersuchen, ob SVG performant in den Browser ausgeführt werden kann oder dieses Anwendungsszenario eine andere Technologie, wie z.B. WebGL benötigt wird.

Abgrenzungen

Die Grafiken, welche in dieser Arbeit zu sehen sind, entstammen (mit Ausnahme des Logos) nicht unserer Arbeit, sondern wurden aus fremden Quellen verwendet.

Credits

elminator's People

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.