经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Phaser.js实现简单的跑酷游戏附源码下载
来源:jb51  时间:2018/10/29 9:34:35  对本文有异议

采用的物理引擎是Phaser.js

官网地址:http://phaser.io/

在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿)

效果展示:

源码(详细源码图片资源可点击文章下方或屏幕右上方的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. 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', {
  5.   frameWidth: 32,
  6.   frameHeight: 48
  7.  });
  8. }

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. function create() {
  10.  // 添加画布背景
  11.  this.add.image(400, 200, 'sky');
  12.  // 添加分数文本
  13.  distanceText = this.add.text(16, 16, 'Distance: 0m', {
  14.   fontSize: '20px',
  15.   fill: '#000'
  16.  });
  17.  // 添加地面
  18.  platforms = this.physics.add.staticGroup();
  19.  platforms.create(400, 400, 'ground').setScale(3).refreshBody();
  20.  // 添加玩家(精灵)
  21.  player = this.physics.add.sprite(100, 300, 'dude');
  22.  player.setBounce(0); // 设置阻力
  23.  player.setCollideWorldBounds(true); // 禁止玩家走出世界
  24.  // 敌人
  25.  enemys = this.physics.add.group();
  26.  enemys.children.iterate(function (child) {
  27.   child.setCollideWorldBounds(false);
  28.  });
  29.  // 动态创建敌人
  30.  enemyTimer = setInterval(function () {
  31.   enemy = enemys.create(1000, 300, 'dude');
  32.   enemy.setTint(getColor());
  33.   enemy.anims.play('left', true);
  34.   enemy.setVelocityX(Phaser.Math.Between(-300, -100));
  35.  }, Phaser.Math.Between(4000, 8000))
  36.  distanceTimer = setInterval(function () {
  37.   distance += 1;
  38.   distanceText.setText('Distance: ' + distance + 'm');
  39.  }, 1000)
  40.  this.physics.add.collider(player, platforms); //玩家在地面上
  41.  this.physics.add.collider(enemys, platforms); //敌人在地面上
  42.  this.physics.add.collider(player, enemys, hitBomb, null, this);
  43. }

4.在创建场景过程中写键盘监听事件

  1. var cursors; // 按键
  2.  // 事件
  3.  this.anims.create({
  4.   key: 'left',
  5.   frames: this.anims.generateFrameNumbers('dude', {
  6.    start: 0,
  7.    end: 3
  8.   }),
  9.   frameRate: 10,
  10.   repeat: -1
  11.  });
  12.  
  13.  this.anims.create({
  14.   key: 'right',
  15.   frames: this.anims.generateFrameNumbers('dude', {
  16.    start: 5,
  17.    end: 8
  18.   }),
  19.   frameRate: 10,
  20.   repeat: -1
  21.  });
  22.  
  23.  this.anims.create({
  24.   key: 'turn',
  25.   frames: [{
  26.    key: 'dude',
  27.    frame: 4
  28.   }],
  29.   frameRate: 20
  30.  });
  31.  
  32.  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', {
  39.   frameWidth: 32,
  40.   frameHeight: 48
  41.  });
  42. }
  43.  
  44. // 将资源展示到画布创建资源
  45. function create() {
  46.  // 添加画布背景
  47.  this.add.image(400, 200, 'sky');
  48.  // 添加分数文本
  49.  distanceText = this.add.text(16, 16, 'Distance: 0m', {
  50.   fontSize: '20px',
  51.   fill: '#000'
  52.  });
  53.  // 添加地面
  54.  platforms = this.physics.add.staticGroup();
  55.  platforms.create(400, 400, 'ground').setScale(3).refreshBody();
  56.  // 添加玩家(精灵)
  57.  player = this.physics.add.sprite(100, 300, 'dude');
  58.  player.setBounce(0); // 设置阻力
  59.  player.setCollideWorldBounds(true); // 禁止玩家走出世界
  60.  
  61.  // 敌人
  62.  enemys = this.physics.add.group();
  63.  enemys.children.iterate(function (child) {
  64.  
  65.   child.setCollideWorldBounds(false);
  66.  });
  67.  
  68.  // 事件
  69.  this.anims.create({
  70.   key: 'left',
  71.   frames: this.anims.generateFrameNumbers('dude', {
  72.    start: 0,
  73.    end: 3
  74.   }),
  75.   frameRate: 10,
  76.   repeat: -1
  77.  });
  78.  
  79.  this.anims.create({
  80.   key: 'right',
  81.   frames: this.anims.generateFrameNumbers('dude', {
  82.    start: 5,
  83.    end: 8
  84.   }),
  85.   frameRate: 10,
  86.   repeat: -1
  87.  });
  88.  
  89.  this.anims.create({
  90.   key: 'turn',
  91.   frames: [{
  92.    key: 'dude',
  93.    frame: 4
  94.   }],
  95.   frameRate: 20
  96.  });
  97.  
  98.  cursors = this.input.keyboard.createCursorKeys();
  99.  
  100.  // 动态创建敌人
  101.  enemyTimer = setInterval(function () {
  102.   enemy = enemys.create(1000, 300, 'dude');
  103.   enemy.setTint(getColor());
  104.   enemy.anims.play('left', true);
  105.   enemy.setVelocityX(Phaser.Math.Between(-300, -100));
  106.  }, Phaser.Math.Between(4000, 8000))
  107.  
  108.  distanceTimer = setInterval(function () {
  109.   distance += 1;
  110.   distanceText.setText('Distance: ' + distance + 'm');
  111.  }, 1000)
  112.  
  113.  
  114.  
  115.  this.physics.add.collider(player, platforms); //玩家在地面上
  116.  this.physics.add.collider(enemys, platforms);
  117.  this.physics.add.collider(player, enemys, hitBomb, null, this);
  118.  
  119. }
  120. // 一直执行
  121. function update() {
  122.  if (cursors.up.isDown && player.body.touching.down) {
  123.   player.setVelocityY(-220);
  124.  } else {
  125.   player.anims.play('right', true);
  126.  }
  127.  if (gameOver) {
  128.   player.setVelocityX(0);
  129.   player.anims.play('turn');
  130.   return;
  131.  }
  132. }
  133.  
  134. function hitBomb(player, enemys) {
  135.  this.physics.pause();
  136.  clearInterval(enemyTimer);
  137.  clearInterval(distanceTimer);
  138.  player.setTint(0xff0000);
  139.  gameOver = true;
  140.  alert('游戏结束,您跑了' + distance + 'm');
  141. }
  142.  
  143. function getColor() {
  144.  var color = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort(function(){
  145.   return Math.random() - 0.5
  146.  }).join("").substr(0,6);
  147.  
  148.  return "0x" + color;
  149. }

GitHub:Fuck me on GitHub Fuck me on GitHub

总结

以上所述是小编给大家介绍的Phaser.js实现简单的跑酷游戏附源码下载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号