How to create a HTML draggable and scrollable map with inertia using Phaser framework
Talking about Game development, HTML5, Javascript and Phaser.
Do you like my tutorials?
Then consider supporting me on Ko-fi.
var game; var speedMult = 0.7; // this is the friction which will slow down the map. Must be less than 1 var friction = 0.99; window.onload = function() { game = new Phaser.Game(480, 480, Phaser.AUTO, ""); game.state.add("PlayGame", playGame); game.state.start("PlayGame"); } var playGame = function(game){}; playGame.prototype = { preload: function(){ game.load.image("map", "map.png"); }, create: function(){ // the big map to scroll this.scrollingMap = game.add.image(0, 0, "map"); // map will accept inputs this.scrollingMap.inputEnabled = true; // map can be dragged this.scrollingMap.input.enableDrag(false); // custom property: we save map position this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y); // custom property: the map is not being dragged at the moment this.scrollingMap.isBeingDragged = false; // custom property: map is not moving (or is moving at no speed) this.scrollingMap.movingSpeed = 0; // map can be dragged only if it entirely remains into this rectangle this.scrollingMap.input.boundsRect = new Phaser.Rectangle(game.width - this.scrollingMap.width, game.height - this.scrollingMap.height, this.scrollingMap.width * 2 - game.width, this.scrollingMap.height * 2 - game.height); // when the player starts dragging... this.scrollingMap.events.onDragStart.add(function(){ // set isBeingDragged property to true this.scrollingMap.isBeingDragged = true; // set movingSpeed property to zero. This will stop moving the map // if the player wants to drag when it's already moving this.scrollingMap.movingSpeed = 0; }, this); // when the player stops dragging... this.scrollingMap.events.onDragStop.add(function(){ // set isBeingDragged property to false this.scrollingMap.isBeingDragged = false; }, this); }, update:function(){ // if the map is being dragged... if(this.scrollingMap.isBeingDragged){ // save current map position this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y); } // if the map is NOT being dragged... else{ // if the moving speed is greater than 1... if(this.scrollingMap.movingSpeed > 1){ // adjusting map x position according to moving speed and angle using trigonometry this.scrollingMap.x += this.scrollingMap.movingSpeed * Math.cos(this.scrollingMap.movingangle); // adjusting map y position according to moving speed and angle using trigonometry this.scrollingMap.y += this.scrollingMap.movingSpeed * Math.sin(this.scrollingMap.movingangle); // keep map within boundaries if(this.scrollingMap.x < game.width - this.scrollingMap.width){ this.scrollingMap.x = game.width - this.scrollingMap.width; } // keep map within boundaries if(this.scrollingMap.x > 0){ this.scrollingMap.x = 0; } // keep map within boundaries if(this.scrollingMap.y < game.height - this.scrollingMap.height){ this.scrollingMap.y = game.height - this.scrollingMap.height; } // keep map within boundaries if(this.scrollingMap.y > 0){ this.scrollingMap.y = 0; } // applying friction to moving speed this.scrollingMap.movingSpeed *= friction; // save current map position this.scrollingMap.savedPosition = new Phaser.Point(this.scrollingMap.x, this.scrollingMap.y); } // if the moving speed is less than 1... else{ // checking distance between current map position and last saved position // which is the position in the previous frame var distance = this.scrollingMap.savedPosition.distance(this.scrollingMap.position); // same thing with the angle var angle = this.scrollingMap.savedPosition.angle(this.scrollingMap.position); // if the distance is at least 4 pixels (an arbitrary value to see I am swiping) if(distance > 4){ // set moving speed value this.scrollingMap.movingSpeed = distance * speedMult; // set moving angle value this.scrollingMap.movingangle = angle; } } } } }
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.