Phaser.js之简单的跑酷游戏
程序员文章站
2022-07-02 07:54:43
采用的物理引擎是Phaser.js 官网地址:http://phaser.io/ 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 2.载入资源 3.将资源创建到舞台上 4.在创建场景 ......
采用的物理引擎是phaser.js
官网地址:
在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿)
效果展示:
源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone)
1.创建游戏舞台
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); // 创建游戏
2.载入资源
1 function preload() { 2 this.load.image('sky', 'assets/sky.png'); 3 this.load.image('ground', 'assets/platform.png'); 4 5 6 this.load.spritesheet('dude', 'assets/dude.png', { 7 framewidth: 32, 8 frameheight: 48 9 }); 10 }
3.将资源创建到舞台上
1 var distancetext; // 路程文本 2 var distance = 0; // 路程 3 var platforms; // 地面 4 var player; // 玩家 5 var enemy; // 敌人 6 var enemys; // 敌人们 7 var enemytimer; // 敌人计时器 8 var distancetimer; // 路程计时器 9 10 function create() { 11 // 添加画布背景 12 this.add.image(400, 200, 'sky'); 13 // 添加分数文本 14 distancetext = this.add.text(16, 16, 'distance: 0m', { 15 fontsize: '20px', 16 fill: '#000' 17 }); 18 // 添加地面 19 platforms = this.physics.add.staticgroup(); 20 platforms.create(400, 400, 'ground').setscale(3).refreshbody(); 21 // 添加玩家(精灵) 22 player = this.physics.add.sprite(100, 300, 'dude'); 23 player.setbounce(0); // 设置阻力 24 player.setcollideworldbounds(true); // 禁止玩家走出世界 25 26 // 敌人 27 enemys = this.physics.add.group(); 28 enemys.children.iterate(function (child) { 29 child.setcollideworldbounds(false); 30 }); 31 // 动态创建敌人 32 enemytimer = setinterval(function () { 33 enemy = enemys.create(1000, 300, 'dude'); 34 enemy.settint(getcolor()); 35 enemy.anims.play('left', true); 36 enemy.setvelocityx(phaser.math.between(-300, -100)); 37 }, phaser.math.between(4000, 8000)) 38 39 distancetimer = setinterval(function () { 40 distance += 1; 41 distancetext.settext('distance: ' + distance + 'm'); 42 }, 1000) 43 44 this.physics.add.collider(player, platforms); //玩家在地面上 45 this.physics.add.collider(enemys, platforms); //敌人在地面上 46 this.physics.add.collider(player, enemys, hitbomb, null, this); 47 }
4.在创建场景过程中写键盘监听事件
var cursors; // 按键 // 事件 this.anims.create({ key: 'left', frames: this.anims.generateframenumbers('dude', { start: 0, end: 3 }), framerate: 10, repeat: -1 }); this.anims.create({ key: 'right', frames: this.anims.generateframenumbers('dude', { start: 5, end: 8 }), framerate: 10, repeat: -1 }); this.anims.create({ key: 'turn', frames: [{ key: 'dude', frame: 4 }], framerate: 20 }); cursors = this.input.keyboard.createcursorkeys();
5.写碰撞函数(当玩家与敌人碰撞的结果)
1 var gameover = false; // 游戏结束 2 function hitbomb(player, enemys) { 3 this.physics.pause(); 4 clearinterval(enemytimer); 5 clearinterval(distancetimer); 6 player.settint(0xff0000); 7 gameover = true; 8 alert('游戏结束,您跑了' + distance + 'm'); 9 }
6.在update函数中写时间的执行(须注意的是此函数每一帧都在执行,1帧≠1秒)
1 function update() { 2 if (cursors.up.isdown && player.body.touching.down) { 3 player.setvelocityy(-220); 4 } else { 5 player.anims.play('right', true); 6 } 7 if (gameover) { 8 player.setvelocityx(0); 9 player.anims.play('turn'); 10 return; 11 } 12 }
这里我给敌人上了颜色的,随机16进制颜色
1 function getcolor() { 2 var color = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort(function(){ 3 return math.random() - 0.5 4 }).join("").substr(0,6); 5 6 return "0x" + color; 7 }
整个源码奉上(建议去github上自己clone):
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 39 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 }
上一篇: 一图看懂hadoop分布式文件存储系统HDFS工作原理
下一篇: asp缓存类