Get the full commented source code of

HTML5 Suika Watermelon Game

Talking about Way of an Idea game, Game development, HTML5, Javascript and Phaser.

Earlier this week I showed you a physics engine with no physics, now it’s time to bring some good real physics in game development so here I am with the HTML5 port of “Way of an Idea“, a Flash physics game released back in 2009.

You have to draw a platform to make the ball reach the goal.

Look at the game:

Draw a platform with the mouse, once you stop drawing the ball will start to move. The game restarts if you hit the goal or if the ball falls off the bottom of the screen.

I also provided a completely commented source code:

let game;
let gameOptions = {

    // minimum length of a segment, in pixels
    segmentLength: 10
}
window.onload = function() {
    var gameConfig = {
        type: Phaser.AUTO,
        backgroundColor: 0xf5f5f5,
        scale: {
            mode: Phaser.Scale.FIT,
            autoCenter: Phaser.Scale.CENTER_BOTH,
            parent: "thegame",
            width: 640,
            height: 480
        },
        physics: {
            default: "matter",
            matter: {
                debug: true
            }
        },
        scene: playGame
    }
    game = new Phaser.Game(gameConfig);
}
class playGame extends Phaser.Scene{
    constructor(){
        super("PlayGame");
    }
    create(){

        // is the player drawing?
        this.isDrawing = false;

        // has the ball been added?
        this.ballAdded = false;

        // this is the ball. I am lazy so I didn't use a sprite :)
        this.ballGraphics = this.add.graphics();
        this.ballGraphics.fillStyle(0xff0000, 1);
        this.ballGraphics.fillCircle(30, 30, 20);

        // this is the goal
        this.matter.add.rectangle(game.config.width - 30, game.config.height - 30, 20, 20, {
            isStatic: true,
            label: "goal"
        });

        // listeners
        this.input.on("pointerdown", this.startDrawing, this);
        this.input.on("pointerup", this.stopDrawing, this);
        this.input.on("pointermove", this.draw, this);

        // listener for collisions
        this.matter.world.on("collisionstart", function(event, bodyA, bodyB){

            // if the ball and the goal collide...
            if((bodyA.label == "ball" && bodyB.label == "goal") || (bodyB.label == "ball" && bodyA.label == "goal")){

                // ... restart the game
                this.scene.start("PlayGame")
            }
        }.bind(this));
    }

    // when we start drawing
    startDrawing(e){

        // the player is drawing
        this.isDrawing = true;

        // current drawing point
        this.startDrawingPoint = new Phaser.Math.Vector2(e.position);
    }

    // when we stop drawing
    stopDrawing(){

        // player is no longer drawing
        this.isDrawing = false;

        // remove the ball
        this.ballGraphics.clear();

        // if the physics ball hasn't already be added...
        if(!this.ballAdded){

            // the ball is added
            this.ballAdded = true;

            // add the ball itself
            this.dynamicBall = this.matter.add.circle(30, 30, 20, {
                friction: 0,
                restitution: 1,
                label: "ball"
            });
        }
    }

    // when we are drawing
    draw(e){

        // is the player drawing?
        if(this.isDrawing){

            // calculate the distance between start drawing point and current position
            let distance = this.startDrawingPoint.distance(e.position);

            // is the distance greater than the minimum segment length?
            if(distance > gameOptions.segmentLength){

                // create a line between start drawing point and current position
                let line = new Phaser.Geom.Line(this.startDrawingPoint.x, this.startDrawingPoint.y, e.position.x, e.position.y);

                // get the center of the line
                let center = Phaser.Geom.Line.GetPoint(line, 0.5);

                // get the angle of the line
                let angle = Phaser.Geom.Line.Angle(line);

                // add a static rectangle matching the line
                this.matter.add.rectangle(center.x, center.y, distance, 5, {
                    isStatic: true,
                    angle: angle,
                    friction: 0,
                    restitution: 1
                });

                // update start drawing point
                this.startDrawingPoint.x = e.position.x;
                this.startDrawingPoint.y = e.position.y;
            }
        }
    }

    update(){

        // if the physics ball has been added...
        if(this.ballAdded){

            // if the ball falls down the screen...
            if(this.dynamicBall.position.y > game.config.height){

                // ... restart the game
                this.scene.start("PlayGame")
            }
        }
    }
}

Building this prototype was very easy thanks to Phaser and Matter physics. Next time I’ll show you how to delete the path, meanwhile download the source code.

Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.