• (附源码)使用 javascript 制作网页端 3D 贪吃蛇游戏


    3D 网页版贪吃蛇游戏!下面来具体讲一下如何实现。

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

    场景初始化

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

    创建食物

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

    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. 否则,继续往前走

    /**

    * 根据direction计算下一个位置。同时:

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

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

    * 3. 继续往前走

    1. *
    2. * @return {*}
    3. */
    4. function next(){
    5. var node = snake[0], x = node.a('x'), y = node.a('y');
    6. if(direction === 'up') y--;
    7. if(direction === 'down') y++;
    8. if(direction === 'left') x--;
    9. if(direction === 'right') x++;
    10. if(x < 0 || x >= m || y < 0 || y >= m || touchSnake(x, y)){ return false; }
    11. if(touchFood(x, y)){
    12. score++;
    13. snake.splice(0, 0, createNode(x, y));
    14. createFood();
    15. }else{
    16. snake.splice(0, 0, createNode(x, y));
    17. dm.remove(snake.pop());
    18. }
    19. return true;
    20. }

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

  • 相关阅读:
    SpringBoot + uniApp实现的掌上生鲜超市购物微信小程序系统 附带详细运行指导视频
    Ubuntu22.04系统安装Unreal Engine 5.1.0
    ext文件系统
    12c++呵呵老师【变量,定时器和事件】
    算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用
    uni-app yrkDataPicker 日期和时间选择控件
    63. 不同路径 II
    [Codeforces] number theory (R1200) Part.7
    【Axure高保真原型】首字母筛选下拉列表
    图注意力和序列图模型
  • 原文地址:https://blog.csdn.net/iotopo/article/details/132621309