1. 程式人生 > >Phaser.js之簡單的跑酷遊戲

Phaser.js之簡單的跑酷遊戲

  1 var config = {
  2     type: Phaser.AUTO,
  3     width: 800,
  4     height: 400,
  5     physics: {
  6         default: 'arcade',
  7         arcade: {
  8             gravity: {
  9                 y: 300
 10             },
 11             debug: false
 12         }
 13     },
 14     scene: {
15 preload: preload, 16 create: create, 17 update: update 18 } 19 }; 20 21 var game = new Phaser.Game(config); // 建立遊戲 22 23 var distanceText; // 路程文字 24 var distance = 0; // 路程 25 var platforms; // 地面 26 var player; // 玩家 27 var enemy; // 敵人 28 var enemys; //
敵人們 29 var gameOver = false; // 遊戲結束 30 var enemyTimer; // 敵人計時器 31 var distanceTimer; // 路程計時器 32 33 var cursors; // 按鍵 34 // 載入資源 35 function preload() { 36 this.load.image('sky', 'assets/sky.png'); 37 this.load.image('ground', 'assets/platform.png'); 38 this.load.image('star', 'assets/star.png');
39 this.load.image('bomb', 'assets/bomb.png'); 40 this.load.spritesheet('dude', 'assets/dude.png', { 41 frameWidth: 32, 42 frameHeight: 48 43 }); 44 } 45 46 // 將資源展示到畫布建立資源 47 function create() { 48 // 新增畫布背景 49 this.add.image(400, 200, 'sky'); 50 // 新增分數文字 51 distanceText = this.add.text(16, 16, 'Distance: 0m', { 52 fontSize: '20px', 53 fill: '#000' 54 }); 55 // 新增地面 56 platforms = this.physics.add.staticGroup(); 57 platforms.create(400, 400, 'ground').setScale(3).refreshBody(); 58 // 新增玩家(精靈) 59 player = this.physics.add.sprite(100, 300, 'dude'); 60 player.setBounce(0); // 設定阻力 61 player.setCollideWorldBounds(true); // 禁止玩家走出世界 62 63 // 敵人 64 enemys = this.physics.add.group(); 65 enemys.children.iterate(function (child) { 66 67 child.setCollideWorldBounds(false); 68 }); 69 70 // 事件 71 this.anims.create({ 72 key: 'left', 73 frames: this.anims.generateFrameNumbers('dude', { 74 start: 0, 75 end: 3 76 }), 77 frameRate: 10, 78 repeat: -1 79 }); 80 81 this.anims.create({ 82 key: 'right', 83 frames: this.anims.generateFrameNumbers('dude', { 84 start: 5, 85 end: 8 86 }), 87 frameRate: 10, 88 repeat: -1 89 }); 90 91 this.anims.create({ 92 key: 'turn', 93 frames: [{ 94 key: 'dude', 95 frame: 4 96 }], 97 frameRate: 20 98 }); 99 100 cursors = this.input.keyboard.createCursorKeys(); 101 102 // 動態建立敵人 103 enemyTimer = setInterval(function () { 104 enemy = enemys.create(1000, 300, 'dude'); 105 enemy.setTint(getColor()); 106 enemy.anims.play('left', true); 107 enemy.setVelocityX(Phaser.Math.Between(-300, -100)); 108 }, Phaser.Math.Between(4000, 8000)) 109 110 distanceTimer = setInterval(function () { 111 distance += 1; 112 distanceText.setText('Distance: ' + distance + 'm'); 113 }, 1000) 114 115 116 117 this.physics.add.collider(player, platforms); //玩家在地面上 118 this.physics.add.collider(enemys, platforms); 119 this.physics.add.collider(player, enemys, hitBomb, null, this); 120 121 } 122 // 一直執行 123 function update() { 124 if (cursors.up.isDown && player.body.touching.down) { 125 player.setVelocityY(-220); 126 } else { 127 player.anims.play('right', true); 128 } 129 if (gameOver) { 130 player.setVelocityX(0); 131 player.anims.play('turn'); 132 return; 133 } 134 } 135 136 function hitBomb(player, enemys) { 137 this.physics.pause(); 138 clearInterval(enemyTimer); 139 clearInterval(distanceTimer); 140 player.setTint(0xff0000); 141 gameOver = true; 142 alert('遊戲結束,您跑了' + distance + 'm'); 143 } 144 145 function getColor() { 146 var color = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort(function(){ 147 return Math.random() - 0.5 148 }).join("").substr(0,6); 149 150 return "0x" + color; 151 }