当前位置:   article > 正文

如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码及链接)_贪吃蛇网页版

贪吃蛇网页版

先来看游戏的最终效果:

3D网页版贪吃蛇游戏

下面来具体讲一下如何实现。

该游戏使用Hightopo的SDK制作,总共100多行代码,没有WebGL基础的同学们也可很快掌握。

场景初始化

首先,我们对页面进行初始化,包括初始化3D场景,设置地面网格,以及开启事件监听等。主要代码及注释如下:

  1. w = 40; // 网格间距
  2. m = 20; // 网格行列数
  3. d = w * m / 2;
  4. food = null;
  5. dm = new ht.DataModel();
  6. g3d = new ht.graph3d.Graph3dView(dm); // 初始化一个3d场景
  7. // 配置网格
  8. g3d.setGridVisible(true);
  9. g3d.setGridColor('#29B098');
  10. g3d.setGridSize(m);
  11. g3d.setGridGap(w);
  12. // 将3D场景添加到body下面
  13. view = g3d.getView();
  14. view.className = 'main';
  15. document.body.appendChild(view);
  16. // 开启事件监听
  17. window.addEventListener('resize', function (e) { g3d.invalidate(); }, false);
  18. g3d.sm().setSelectionMode('none');
  19. view.addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', function(e){
  20. if(isRunning){
  21. var p = g3d.getHitPosition(e); // 获取当前鼠标点击点在3D场景中的位置
  22. // 根据点击点x,z轴坐标,计算贪吃蛇前进方向
  23. if(Math.abs(p[0]) < d && Math.abs(p[2]) < d){
  24. if(direction === 'up' || direction === 'down'){
  25. direction = p[0] > snake[0].p3()[0] ? 'right' : 'left';
  26. }
  27. else if(direction === 'left' || direction === 'right'){
  28. direction = p[2] > snake[0].p3()[2] ? 'down' : 'up';
  29. }
  30. }
  31. }else if(ht.Default.isDoubleClick(e)){
  32. start(); // 双击启动游戏
  33. }
  34. }, false);
  35. start();
  36. setInterval(function(){ if(isRunning){ isRunning = next(); } }, 200); // 每间隔200ms贪吃蛇往前走一步

创建食物

贪吃蛇每次吃完一个食物,其身体就会增长一段。此时需要创建新的食物并随机放到一个新的位置。创建食物时,其位置不能与上一个位置重合,也不能与当前贪吃蛇身体重复。

  1. /**
  2. * 创建食物,并摆放到随机位置。
  3. * 食物不能放到贪吃蛇身上,也不能放到上一个食物的位置
  4. *
  5. */
  6. function createFood(){
  7. var x = getRandom(), y = getRandom();
  8. // 确保新创建的食物不与贪吃蛇重叠,也不与上一个食物的位置重叠
  9. while(touchFood(x, y) || touchSnake(x, y)){ x = getRandom(); y = getRandom(); }
  10. if(food) dm.remove(food);
  11. food = createNode(x, y);
  12. food.s({'shape3d': 'sphere', 'shape3d.color': 'red'});
  13. }
  14. /**
  15. * x, y是否与snake身体重叠
  16. *
  17. * @param {*} x
  18. * @param {*} y
  19. * @return {*}
  20. */
  21. function touchSnake(x, y){
  22. for(var i=0; i<snake.length; i++){
  23. if(snake[i].a('x') === x && snake[i].a('y') === y){ return true; }
  24. }
  25. return false;
  26. }
  27. /**
  28. * x, y是否与食物身体重叠
  29. *
  30. * @param {*} x
  31. * @param {*} y
  32. * @return {*}
  33. */
  34. function touchFood(x, y){
  35. return food && food.a('x') === x && food.a('y') === y;
  36. }
  37. function getRandom(){
  38. return parseInt(Math.random() * m);
  39. }
  40. /**
  41. * 创建一个节点,调整其位置和大小
  42. *
  43. * @param {*} x
  44. * @param {*} y
  45. * @return {*}
  46. */
  47. function createNode(x, y){
  48. var node = new ht.Node();
  49. node.a({ x: x, y: y });
  50. node.s3(w*0.9, w*0.9, w*0.9);
  51. node.p3(-w*m/2+w*x+w/2, w/2, -w*m/2+w*y+w/2);
  52. dm.add(node);
  53. return node;
  54. }

创建贪吃蛇及四周围墙

在第一步初始化时,我们设置了网格大小及间距。这样也就确定了整个网格的长宽以及贪吃蛇每个块的大小。在这一步,我们为网格增加边界,同时生成贪吃蛇。

  1. /**
  2. * 清空场景。创建贪吃蛇及四周围墙。
  3. *
  4. */
  5. function start(){
  6. dm.clear(); snake = []; score = 0; direction = 'up'; isRunning = true;
  7. // 四周围墙
  8. shape = new ht.Shape();
  9. shape.setPoints(new ht.List([
  10. {x: -d, y: d},
  11. {x: d, y: d},
  12. {x: d, y: -d},
  13. {x: -d, y: -d},
  14. {x: -d, y: d}
  15. ]));
  16. shape.setThickness(4);
  17. shape.setTall(w);
  18. shape.setElevation(w/2);
  19. shape.s({'all.color': 'rgba(20, 120, 120, 0.5)', 'all.transparent': true, 'all.reverse.cull': true});
  20. dm.add(shape);
  21. // 创建贪吃蛇的身体
  22. for(var i=0; i<m/2; i++) { snake.push(createNode(m/2 + i, m/2)); }
  23. createFood();
  24. }

处理贪吃蛇行走逻辑

有了贪吃蛇和食物后,下一步就是处理贪吃蛇行走逻辑。包括:

 * 1. 检测到达边界或接触自己身体,则游戏结束

 * 2. 如果吃到食物,则身体增加一段

 * 3. 否则,继续往前走

  1. /**
  2. * 根据direction计算下一个位置。同时:
  3. * 1. 检测到达边界或接触自己身体,则游戏结束
  4. * 2. 如果吃到食物,则身体增加一段
  5. * 3. 继续往前走
  6. *
  7. * @return {*}
  8. */
  9. function next(){
  10. var node = snake[0], x = node.a('x'), y = node.a('y');
  11. if(direction === 'up') y--;
  12. if(direction === 'down') y++;
  13. if(direction === 'left') x--;
  14. if(direction === 'right') x++;
  15. if(x < 0 || x >= m || y < 0 || y >= m || touchSnake(x, y)){ return false; }
  16. if(touchFood(x, y)){
  17. score++;
  18. snake.splice(0, 0, createNode(x, y));
  19. createFood();
  20. }else{
  21. snake.splice(0, 0, createNode(x, y));
  22. dm.remove(snake.pop());
  23. }
  24. return true;
  25. }

到这里,整个贪吃蛇游戏就完成了。双击场景即可启动游戏。点击场景可改变贪吃蛇运动方向。

对于懒得动代码的同学们,也可以点击下面链接直接体验该游戏:

3D网页版贪吃蛇游戏

网页打开后,源码可以直接通过F12获取

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/414494
推荐阅读
相关标签
  

闽ICP备14008679号