Git Product home page Git Product logo

prg0108game's Introduction

Installation

Step 1:

Clone the repository to your local environment

Step 2:

run npm install to acquire all the required packages

Step 3:

Run CMD + Shift + b to build the project. Select the tsconfig.json file that's inside the project folder.

Class diagram

UML

Code Snippets + Explanation

Singleton Pattern

De Singleton Pattern heb is toegepast op de Game Class. Hierdoor ben ik er zeker van dat er altijd maar 1 instantie van de game is, en ik altijd de juiste instantie aanspreek door de getInstance functie. Hieronder de singleton zoals ik deze heb toegepast op mijn Game class.

class Game {
    private static __instance : Game;

    private constructor(){}

    public static getInstance() : Game
    {
        return this._instance || (this._instance = new this());
    }
}

Strategy Pattern

De Strategy Pattern is toegepast op de vissen. Voor de strategy pattern heb ik 2 nieuwe gedragstypen gemaakt; Swimming en deadFish(). Deze implementeren beide de iBehaviour interface zodat deze als 'behaviour' parameter kan worden meegeven voor het gedrag van de vis.

In de Swimming Class staat de code geschreven waardoor de vis van links naar rechts zwemt. In de deadFish Class staat de functionaliteit beschreven als de vis dood gaat, dan drijft hij naar boven en veranderd de afbeelding naar een dode vis.

Doordat beide gedragstypen de interface implementeren beschikken zij beide over een update() functie. Hierdoor kan ik deze gemakkelijk aanspreken in de update functie van de GameObject zelf. Welke weer wordt aangesproken in de gameloop.

Hierdoor kan ik dus heel makkelijk het gedrag veranderen van de vis, door simpelweg de inhoud van de 'behaviour' parameter te vervangen voor een andere class die voldoet aan de iBehvaiour interface.

Interface

interface iBehaviour {
    gameObject: GameObject;
    update():void;
}

Fish

class Fish extends GameObject{
    public behaviour: iBehaviour;

    constructor(){
        super('fish');
    }

    public update():void{
        this.behaviour.update();
    }
}

Observer Pattern

Voor de Observer Pattern heb ik een rode knop toegevoegd onder de Ammo en Tijd. Deze knop kun je 1 malig gebruiken om in 1x alle vissen te vangen uit de zee. Dit heb ik gedaan door gebruik te maken van de Observer Pattern. Ik heb 2 interfaces; Observable en Observer.

De knop is bij mij een observable. Deze beheert alle Observers (Elementen die naar deze knop moeten luisteren). Bij het aanmaken van een vis, koppel ik de vis meteen aan de knop. Vervolgens heb ik een EventListener met klik toegevoegd aan de knop, die door de observers array heen loopt, om vervolgens bij elke Observer de receiveNotification() function aan te spreken.

Observable

interface IObservable {
    observers:Array<IObserver>;
    RegisterObserver(observer : IObserver ) : void;
    RemoveObserver(observer : IObserver ) : void;
}

Observer

interface IObserver {
    ReceiveNotification() : void;
}

Polymorphism

Polymorfisme heb ik toegpast met de GameObject class. Ik heb eerst een globale class aangemaakt voor een gameObject met standaard variabelen die elk gameObject zou moeten hebben zoals een -x en y waarde en dergelijke. Naast de standaardwaarden zit er ook een update() functie in. Deze functie wordt gebruikt om elk gameObjkect te updaten.

Dit doe ik in de Game class. Hier heb ik een array met alle GameObjecten van de game. Het type wat er wordt opgeslagen in de array is ook van het GameObject. Echter zou ik wel nog later kunnen terugzien of dat het van bijvoorbeeld het type Fish is.

GameObject Class

class GameObject {
    x : number;
    y : number;
    width: number;
    height: number;;
    element : HTMLElement;

    constructor(name:string){
        this.element = document.createElement(name);
    }

    update(){}

    public getRectangle() {
        return this.element.getBoundingClientRect()
    }

}

Loopen door gameobjecten

class Game {

private gameObjectsArray:Array<GameObject>;
    
private constructor(){}

    private gameLoop(){
        this.gameObjectsArray.forEach(element => {
            element.update();
        });
}

Gameplay Components

Game can be played here

www.lesleykras.nl

Pull Request - Week 4

https://github.com/0909758/PRG08_Bobs_Nightmare/commit/8211faefbef7c0a397fecb0629e7038bd8843092

Peer review - Week 6

0909758/PRG08_Bobs_Nightmare#5

prg0108game's People

Contributors

lesleykras avatar 0909758 avatar

Watchers

James Cloos avatar  avatar

Forkers

0909758

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.