Wondering what’s next for npm?Check out our public roadmap! »

    gamedevjs
    TypeScript icon, indicating that this package has built-in type declarations

    1.1.18 • Public • Published

    gamedevjs NPM version Build Status

    game development toolkit

    A collection of common components which are widely used in game development:

    • Scheduler
    • Finite State Machine
    • Object Pool
    • Event Manager

    (other components will be published and documented soon)

    This project is evolving and need your feedback, please create Issue

    Table of contents

    Installation

    $ npm install --save gamedevjs

    Usage

    Node

    var gamedev = require("gamedevjs").gamedev;

    ES6

    // ES6
    import {gamedev} from "gamedevjs";

    Browser CDN: https://cdn.jsdelivr.net/npm/gamedevjs

    <script src="https://cdn.jsdelivr.net/npm/gamedevjs"></script>
     
    <script>
      var gamedev = window.gamedevjs.gamedev;
    </script> 

    Scheduler


    Creation


    Schedule tasks at specific times

    var scheduler = gamedev.scheduler.config([
        {at: 200, run: function() {console.log("Hello 200ms")} },
        {at: 1300, run: function() {console.log("Hello 1300ms")} },
        {at: 5000, run: function() {console.log("Hello 5000ms")} },
    ]);
     
    scheduler.start();

    Schedule sequence tasks

     
    var scheduler = gamedev.scheduler.sequence([
        {duration: 1100, run: function() {console.log("Hello 200ms")} },
        {duration: 3700, run: function() {console.log("Hello 1300ms")} },
        {duration: 100, run: function() {console.log("Hello 5000ms")} },
    ]);
     
    // start scheduler with delay time
    scheduler.start(200);

    Repeat

    // start scheduler with no delay time, repeat 3 times
    scheduler.start(0, 3);
     
    // start scheduler with no delay time, repeat forever
    scheduler.start(0, -1);
     
    // start scheduler with 200ms delay time, repeat 2 times
    // and delay 200ms between each scheduled times
    scheduler.start(200, 2);
     

    Manipulation


    Push task at specific time

    ...
    // push and schedule addional task
    scheduler.pushStep({
        at: 4000,
        run: function() {
            console.log("Hello 4000ms");
        }
    })
     
    // or we can push task when scheduler is running
    // and make sure scheduler has not reached new schedule time
    setTimeout(function() {
        scheduler.pushStep({
            at: 4000,
            run: function() {
                console.log("Hello 4000ms");
            }
        })
    }, 3000);

    Stop scheduler will terminate all running tasks

    scheduler.stop();

    Finite State Machine

    Inspired by javascript-state-machine (author: jakesgordon)


    Creation

    NOTICE: event name must NOT be "any"

    var fsm = gamedev.fsm.config({
        initial: "stand",
        events: {
            move: {from: ["stand", "run"], to: "walk"},
            movefast: {from: ["stand", "walk"], to: "run"},
            stop: {from: ["walk", "run"], to: "stand"},
        }
    });
     
    console.log(fsm.current); // "stand"
    fsm.events.move();
    console.log(fsm.current); // "walk"

    Manipulation

    ...
    fsm.pushEvents({
        die: {from: ["stand", "run", "walk"], to: "dead"}
    });
     
    fsm.events.die();

    Event Handler

    Event execution orders:

    • beforeany - fired before any event
    • beforeEVENT - fired before the event
    • leaveSTATE - fired when leaving the old state (fsm.current is still old state)
    • leaveany - fired when leaving any old state (fsm.current is still old state)
    • enterany - fired when entering any new state (fsm.current is new state)
    • enterSTATE - fired when entering the new state (fsm.current is new state)
    • afterEVENT - fired after the event
    • afterany - fired after any event
    ...
    fsm.events.beforemove = function() {
        console.log("before move");
    }
     
    fsm.events.leavestand = function() {
        console.log("leave stand");
    }
     
    fsm.events.enterwalk = function() {
        console.log("enter walk");
        console.log(fsm.previous); // previous state
        console.log(fsm.current); // current state
    }
     
    fsm.events.aftermove = function() {
        console.log("after move");
    }
     
    // or use registerEvent to pass this object
    fsm.registerEvent("beforemove", function() {
        console.log("before move with registerEvent");
    }, thisObject);
     
    fsm.events.move();

    Cancel Event Handler

    var EventStatus = require("gamedevjs").EventStatus;
     
    ...
    fsm.events.beforemove = function() {
        console.log("before move");
        return EventStatus.CANCEL;
    }
     
    fsm.events.move();
    console.log(fsm.current); // still be "stand"

    Async Event Handler

    var EventStatus = require("gamedevjs").EventStatus;
     
    ...
    fsm.events.beforemove = function(next) {
        console.log("before move");
        setTimeout(function() {
            next();
        }, 2000);
        return EventStatus.ASYNC;
    }
     
    fsm.events.move();
     
    console.log(fsm.current); // still be "stand"
     
    setTimeout(function() {
        console.log(fsm.current); // "walk" now
    }, 3000);

    Object Pool


    Creation

    Item List

    Predefine a list of items for object pool.

    var gamedev = require("gamedevjs").gamedev;
     
    var pool = gamedev.pool.config({
        items: [
            {point: 0}
        ]
    });

    Sample Item

    ...
     
    var pool = gamedev.pool.config({
        sampleItem: {point: 2}
        sampleCount: 2
    });

    Combine

    Predefined items are added to the pool first, then sample items will be added later.

     
    var pool = gamedev.pool.config({
        items: [
            {point: 0}
        ],
        sampleItem: {point: 2}
        sampleCount: 2
    });

    Manipulation

    Get

    ...
     
    // get available item
    item = pool.getItem();
     
    // if pool is empty, it will clone sampleItem
    // if sampleItem is undefined, item2 is undefined as well
    item2 = pool.getItem();

    Return

    ...
    // return item to the pool and trigger onreturn event
    pool.returnItem(item);

    Push

    ...
    // push item to the pool and trigger onpush event
    pool.pushItem(item);

    Clear

    Clear all items

    ...
    pool.clear();

    Events

    • onpush: trigger when item is pushed to pool (init pool or push new items to pool)
    • onget: trigger when item is retrieved from pool (get available item)
    • onreturn: trigger when item is returned to pool (return item to pool)
    pool = gamedev.pool.config({
        onreturn: function(item) { console.log("return item"); },
        onget: function(item) { console.log("get item"); },
        onpush: function(item) { console.log("push item"); },
        sampleItem: {point: 0}
    });

    Event Manager

    Creation

    var gamedev = require("gamedevjs").gamedev;
    var EventManager = require("gamedevjs").EventManager;
     
    // global event manager
    var event = gamedev.event;
     
    // or create new instance
    var event = new EventManager();
     

    Manipulation

    Common usage

    ...
    let isHit = false;
    let heath = 1200;
     
    gamedev.event.register("hit", (data) => {
      isHit = true;
      heath -= data.damage;
    });
     
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 700
     
    gamedev.event.unregister("hit");
     
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 700
     

    Register Once

    let isHit = false;
    let heath = 1200;
     
    gamedev.event.registerOnce("hit", (data) => {
      isHit = true;
      heath -= data.damage;
    });
     
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 700
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 700

    Register Replace

    let isHit = false;
    let heath = 1200;
     
    gamedev.event.register("hit", (data) => {
      isHit = true;
      heath -= data.damage;
    });
     
    gamedev.event.register("hit", (data) => {
      isHit = true;
      heath -= data.damage * 2;
    }, true); // set third parameter to true
     
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 200

    Multiple Register

    let isHit = false;
    let heath = 1200;
     
    gamedev.event.register("hit", (data) => {
      isHit = true;
      heath -= data.damage;
    });
    gamedev.event.register("hit", (data) => {
      isHit = true;
      heath -= 200;
    });
     
    gamedev.event.emit("hit", {damage: 500});
    console.log(heath); // 500

    Unregister list

    gamedev.event.unregisterList(["hit", "death"]);

    Unregister All

    gamedev.event.unregisterAll();

    License

    ISC ©

    Author

    Thinh Tran

    Donation

    Donate

    Install

    npm i gamedevjs

    DownloadsWeekly Downloads

    3

    Version

    1.1.18

    License

    ISC

    Last publish

    Collaborators

    • avatar