传统贪吃蛇游戏源码-WebGL实现HTML5 3D贪吃蛇游戏

js1k.com 收集了大于 1k 的小型 JavaScript 示例。 里面有很多很酷的游戏和特效。 今年,规则又增添了新花样。 传统的经典类型也缩小为WebGL类型传统贪吃蛇游戏源码,允许的大小也缩小到2K。 ++类型,我曾多次尝试提交一个小游戏,但一直没能写出一个让我满意并且能控制在这么小的字节范围内的游戏。

我自己写不下来,但总有机会站在巨人的背上。 想起《基于HTML5的联通网管3D机房监控应用》中提到的twojs传统贪吃蛇游戏源码,以及Hightopo的几个基于WebGL的3D引擎,我突然想挑战一下自己。 用100行JS实现了一个3D小游戏。 经过一番折腾,终于使用Hightopo制作了一款3D贪吃蛇游戏。 毕竟JS代码只有90行。 我终于满足了我的小愿望,写完了这篇文章。 心满意足地去睡觉了。

传统贪吃蛇游戏源码-WebGL实现HTML5 3D贪吃蛇游戏

以下是最终3D游戏在平板电脑上运行的第一个互动视频效果:

传统的2D贪吃蛇游戏通常通过方向按钮来控制蛇的前进方向。 我一开始就想定位能跑在平板上的触摸交互,所以不考虑按钮的操作交互方式,用点击的方式来控制。 通过HT的g3d.getHitPosition(e)函数,我可以获得鼠标点击的平面位置,这样我就可以通过与蛇头的位置进行比较来确定新的前进方向。 如果点击位置超出了贪吃蛇运行矩阵的范围,我会不做任何处理,此时就剩下HT的标准轨道旋转操作方法,通过监听双击风暴来重启游戏ht.Default.isDoubleClick(e)。 所谓的移动性没有太多设计需要考虑,只需要在添加点击view时考虑触摸即可。addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown',

传统贪吃蛇游戏源码-WebGL实现HTML5 3D贪吃蛇游戏

90行全部JS源代码如下,资深玩家,不要批评我,我相信很多人都可以写得更简洁,但我只是想通过这个玩转3D、HTML5和WebGL,包括把它改成整天搞企业应用的我自己换个思路,想一些新的元素。

传统贪吃蛇游戏源码-WebGL实现HTML5 3D贪吃蛇游戏

       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])  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/2; i++) { snake.push(createNode(m/2 + i, m/2)); }            
            createFood();                        
        }        
        function createNode(x, y){
            var node = new ht.Node();
            node.a({ x: x,  y: y });
            node.s3(w*0.9, w*0.9, w*0.9);
            node.p3(-w*m/2+w*x+w/2, w/2, -w*m/2+w*y+w/2);
            dm.add(node);
            return node;
        }        
        function getRandom(){
            return parseInt(Math.random() * m);
        }        
        function createFood(){
            var x = getRandom(), y = getRandom();
            while(touchFood(x, y) || touchSnake(x, y)){ x = getRandom(); y = getRandom(); }
            if(food) dm.remove(food);            
            food = createNode(x, y); 
            food.s({'shape3d': 'sphere',  'shape3d.color': 'red'});
        }        
        function touchSnake(x, y){
            for(var i=0; i<snake.length; i++){                
                if(snake[i].a('x') === x && snake[i].a('y') === y){ return true; }
            }
            return false;
        }        
        function touchFood(x, y){
            return food && food.a('x') === x && food.a('y') === y;
        }        
        function next(){
            var node = snake[0], x = node.a('x'), y = node.a('y');
            if(direction === 'up') y--;
            if(direction === 'down') y++;       
            if(direction === 'left') x--;
            if(direction === 'right') x++;
            if(x = m || 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;
        }

复制

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 游戏源码 传统贪吃蛇游戏源码-WebGL实现HTML5 3D贪吃蛇游戏 https://www.wkzy.net/game/155917.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务