100行JS实现HTML5的3D贪吃蛇游戏

图扑软件 2014-03-09 11:34:57
百行JS实现HTML5的3D贪吃蛇游戏,供参考

最终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]) < 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/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 < 0 || x >= 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;
}
...全文
1450 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2014-08-08
  • 打赏
  • 举报
回复
这是站在“巨人肩膀”上的100行么?
从此程序员 2014-08-08
  • 打赏
  • 举报
回复
好玩,自己在移动端搞一个
不知名导演 2014-05-11
  • 打赏
  • 举报
回复
不明觉历 学习
智商余额不足 2014-05-11
  • 打赏
  • 举报
回复
曼珠沙华糯米 2014-05-10
  • 打赏
  • 举报
回复
好厉害啊
KK3K2005 2014-05-09
  • 打赏
  • 举报
回复
dm = new ht.DataModel(); 巨人已经跑了10公里了
Dragon之介 2014-05-08
  • 打赏
  • 举报
回复
这个要怎么才能玩?
rwcych 2014-05-08
  • 打赏
  • 举报
回复
太牛啦!这也想得出。
hellkk 2014-05-06
  • 打赏
  • 举报
回复
牛B,很好~~~~
Sailhere 2014-04-30
  • 打赏
  • 举报
回复
真强大,受教了
shadow柒度 2014-04-30
  • 打赏
  • 举报
回复
不明觉厉啊,谢谢你的分享
叶落无痕0826 2014-04-27
  • 打赏
  • 举报
回复
liuxingfffff 2014-03-11
  • 打赏
  • 举报
回复
这样也行,你干脆说自己10字符 实现这个效果好了。
wangyazhou 2014-03-11
  • 打赏
  • 举报
回复
wz_307 2014-03-09
  • 打赏
  • 举报
回复
把ht算上呢~

39,082

社区成员

发帖
与我相关
我的任务
社区描述
HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准,是构建以及呈现互联网内容的一种语言方式.被认为是互联网的核心技术之一。
社区管理员
  • HTML5社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧