博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebGL实现HTML5的3D贪吃蛇游戏
阅读量:5892 次
发布时间:2019-06-19

本文共 2494 字,大约阅读时间需要 8 分钟。

收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围。

自己写不出来,站在巨人肩膀总是有机会吧,想起这篇提到的,和的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小游戏,折腾了一番最终采用搞了个3D贪吃蛇游戏,算了算JS代码还只有90来行,终于满足了自己的小小心愿写完这篇可以满意去睡觉了。

以下先上一段最终3D游戏在平板上的运行交互:

传统2D的贪吃蛇游戏一般通过方向键盘控制蛇的前进方向,我一开始就想定位可运行在平板上的Touch交互,所以不考虑键盘的操作交互方式,采用完全用点击的方式来控制,通过的g3d.getHitPosition(e)函数我能得到鼠标点击所在的平面位置,这样与蛇头的位置做比较就能判断出新的前进方向,如果点击位置超出了贪吃蛇的运行矩阵范围我就不做处理,这时候留给的标准orbit旋转操作方式,通过ht.Default.isDoubleClick(e)监听双击事件重启游戏。所谓的可移动化方面也没太多需要考虑的设计,仅在添加点击时需要考虑touch的情况 view.addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', 

90来行所有JS源代码如下,各位游戏高手不要喷我,肯定很多人可以写得更精炼,但我只想通过这个玩一玩3D,HTML5和WebGL,包括给整天搞企业应用的自己换换脑子思考些新元素。

function init() {                            w = 40; m = 20; d = w * m / 2; food = null;                        dm = new ht.DataModel();                        g3d = new ht.graph3d.Graph3dView(dm);                            g3d.setGridVisible(true);            g3d.setGridColor('#29B098'); g3d.setGridSize(m); g3d.setGridGap(w); view = g3d.getView(); view.className = 'main'; document.body.appendChild(view); window.addEventListener('resize', function (e) { g3d.invalidate(); }, false); g3d.sm().setSelectionMode('none'); view.addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', function(e){ if(isRunning){ var p = g3d.getHitPosition(e); if(Math.abs(p[0]) < d && Math.abs(p[2]) < d){ if(direction === 'up' || direction === 'down'){ direction = p[0] > snake[0].p3()[0] ? 'right' : 'left'; } else if(direction === 'left' || direction === 'right'){ direction = p[2] > snake[0].p3()[2] ? 'down' : 'up'; } } }else if(ht.Default.isDoubleClick(e)){ start(); } }, false); start(); setInterval(function(){ if(isRunning){ isRunning = next(); } }, 200); } function start(){ dm.clear(); snake = []; score = 0; direction = 'up'; isRunning = true; shape = new ht.Shape(); shape.setPoints(new ht.List([ {x: -d, y: d}, {x: d, y: d}, {x: d, y: -d}, {x: -d, y: -d}, {x: -d, y: d} ])); shape.setThickness(4); shape.setTall(w); shape.setElevation(w/2); shape.s({'all.color': 'rgba(20, 120, 120, 0.5)', 'all.transparent': true, 'all.reverse.cull': true}); dm.add(shape); for(var i=0; i
= m || y < 0 || y >= m || touchSnake(x, y)){ return false; } if(touchFood(x, y)){ score++; snake.splice(0, 0, createNode(x, y)); createFood(); }else{ snake.splice(0, 0, createNode(x, y)); dm.remove(snake.pop()); } return true; }

 

转载于:https://www.cnblogs.com/xhload3d/p/4990184.html

你可能感兴趣的文章
DEDE全站评论总数调用以及与使用方法
查看>>
1-2 给容器和PODS 分配CPU资源
查看>>
natas系列0--10
查看>>
Kubernetes 1.5.1 部署
查看>>
shell echo打印换行的方法
查看>>
数据导数据工具xtrabackup之xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info区别
查看>>
67:zabbix之添加主动/被动模式|添加监控主机|自定义模块|图形中乱码|自动发现...
查看>>
汽车保养
查看>>
Unix系统性能监控工具之--SAR
查看>>
JVM参数调优
查看>>
基于模块类型php部署LAMP
查看>>
shell快速迁移海量文件
查看>>
Postfix Relay to Exchange Server 2010
查看>>
icinga2学习和使用(一)
查看>>
PLSQL找不到配置的数据等信息
查看>>
word 批量取消超链接
查看>>
HTML5开发环境搭建
查看>>
我的友情链接
查看>>
Oracle基本操作
查看>>
活动目录实战之七 windows 2008 r2 理解FSMO角色的概念
查看>>