Get the full commented source code of

HTML5 Suika Watermelon Game

Talking about Down The Mountain game, Game development, HTML5, Javascript and Phaser.

Do you remember my tutotial series about Down The Mountain game? The prototype works using hexagons to simulate isometric cubes – read this post for more information – but if you play at the latest prototype I published you will notice characther movement does not give the feeling of something actually jumping down, because it moves straight to its destination because of the tween I’ve set. So we are going to use a Bezier curve – more information at this post – to give the tween a fake idea of an isometric jump, the result is exactly what you would expect:
Play with left and right arrow keys to make the character jump down the mountain block by block. I modified a bit the source code, also added a fade effect when blocks disappear and next time I’ll update everything to the latest Phaser version and add some comments.
var game;
var hexagonWidth = 70;
var hexagonHeight = 80;
var minRow = 0;
var gridSizeX = 5;
var gridSizeY = 9;
var marker;
var hexagonGroup;
var hexagonArray = [];
var cursors;
var playerCol = 2;
var playerRow = 0;
var playerMove = true;

window.onload = function() {	
	game = new Phaser.Game(480, 480);
     game.state.add("PlayGame", playGame);
     game.state.start("PlayGame");
}
var playGame = function(game){}
playGame.prototype = {
     preload: function(){
     	game.load.image("hexagon", "hexagon.png");
          game.load.image("marker", "marker.png");          
     },
     create: function(){
          hexagonGroup = game.add.group();
          game.stage.backgroundColor = "#ffffff";
          cursors = game.input.keyboard.createCursorKeys();
          for(var i = 0; i < gridSizeY; i ++){
               addHexagonRow(i);
          }
          hexagonGroup.x = (game.width - hexagonWidth * gridSizeX) / 2;
          hexagonGroup.y = 20;
          marker = game.add.sprite(hexagonGroup.width / 2, 20, "marker");
          marker.anchor.setTo(0.5);
          hexagonGroup.add(marker);      
     },
     update: function(){
          if(playerMove){
			if(cursors.left.isDown && cursors.right.isUp && (playerCol > 0 || (playerRow % 2 == 1))){	
                    placeMarker(playerCol - (1 - playerRow % 2), playerRow + 1);
			}
			if(cursors.right.isDown  && cursors.left.isUp && playerCol < gridSizeX - 1){				
                    placeMarker(playerCol + (playerRow % 2), playerRow + 1);
			}
               if(gridSizeY - playerRow < 8){
                    addHexagonRow(gridSizeY);
                    gridSizeY ++;
               }
		}
          if(marker.world.y > 60){
               hexagonGroup.y -= 1;
          }
          if(marker.world.y > 240){
               hexagonGroup.y -= (marker.world.y - 240);     
          }
          var destroyedRow = false;
          for(var i = minRow; i < gridSizeY; i ++){
			for(var j = 0; j < gridSizeX; j ++){
				if((i % 2 == 0 || j < gridSizeX - 1) && hexagonArray[i][j].world.y < 0){
                         var destroyTween = game.add.tween(hexagonArray[i][j]).to({
                              alpha:0,
                              y: hexagonArray[i][j].y + hexagonHeight / 2
                         }, 200,  Phaser.Easing.Quadratic.Out, true);
                         destroyTween.onComplete.add(function(e){
                              e.destroy();     
                         })
                         destroyedRow = true;                        
				}
			}
		}
          if(destroyedRow){
               minRow ++;
          }     
     }
}                

function placeMarker(posX, posY){	
     playerRow = posY;
     playerCol = posX;	          
     var nextX = hexagonWidth * (2 * posX + 1 + posY % 2) / 2;
	var nextY = hexagonHeight * (3 * posY + 1) / 4;		       
     playerMove = false;
     var bezierX = hexagonWidth;
     if(marker.x > nextX){
          bezierX *= -1;
     }
     var playerTween = game.add.tween(marker).to({
          x: [marker.x, marker.x + bezierX, nextX, nextX],
          y: [marker.y, marker.y, nextY, nextY]
     }, 500, Phaser.Easing.Quadratic.InOut, true).interpolation(function(v, k){
          return Phaser.Math.bezierInterpolation(v, k);
     }); 
     playerTween.onComplete.add(function(){
          playerMove = true;           
     });
     marker.bringToTop();
}     

function addHexagonRow(i){
     hexagonArray[i] = [];
	for(var j = 0; j < gridSizeX - i % 2; j ++){
          var hexagonX = hexagonWidth * j + (hexagonWidth / 2) * (i % 2);
          var hexagonY = hexagonHeight * i / 4 * 3;	
          var hexagon = game.add.sprite(hexagonX, hexagonY, "hexagon");
          var hexagonText = game.add.text(0 + hexagonWidth / 3 + 5, 0 + 15, i + "," + j);
		hexagonText.font = "arial";
          hexagonText.align = "center";
		hexagonText.fontSize = 10;
          hexagon.addChild(hexagonText);   
		hexagonGroup.add(hexagon);
		hexagonArray[i][j] = hexagon;	
	}
}
I also highlighted the lines which simulate the isometric jump using Bezier curves in tweens. You can play with these values to get a different kind of movement. As usual, download the source code and experiment!

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