GameBuilder开发游戏应用系列之100行代码实现贪吃蛇

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-801422234293697

在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-801422234293697

微信扫描:

运行截图:

除了重力感应游戏,GameBuilder开发传统的游戏也毫不逊色,作为一个怀旧的人,总是对这类游戏情有独钟。

贪吃蛇主要靠一个[UICanvas]来实现,前面一片博客GameBuilder开发游戏应用系列之100行代码实现别踩白块有介绍过,配合四个UIButton来控制方向。

食物生成

win.makeFoodBlock = function(num) {
    var bl = win.blockList;
    var fl = win.foodList;
    Math.min(48 * 72 - bl.length - fl.length, num);
    var x, y;
    for(var i = 0; i < num; i++) {
        var block = {x:0, y:0};
        do {
            x = Math.floor(Math.random() * 48);
            y = Math.floor(Math.random() * 72);
            block.x = x; block.y = y;
        } while(win.blockInList(block, win.blockList) || win.blockInList(block, win.foodList));
        win.foodList.push(block);
    }
};

方向控制

实现UIButtononClick事件。

var win = this.getWindow();
win.changeDirection(win.DIR_UP);
//播放音效
this.playSoundEffect("disappear.mp3");
win.changeDirection = function(dir) {
    switch(win.direction) {
        case win.DIR_RIGHT:
            if(dir == win.DIR_LEFT) {
                return;
            }
            break;
        case win.DIR_UP:
            if(dir == win.DIR_DOWN) {
                return;
            }
            break;
        case win.DIR_LEFT:
            if(dir == win.DIR_RIGHT) {
                return;
            }
            break;
        case win.DIR_DOWN:
            if(dir == win.DIR_UP) {
                return;
            }
            break;
    }
    win.direction = dir;
};

计算蛇头下一个位置

win.nextFirst = function (first) {
    var nextFirst = {x:0, y:0};
    switch(win.direction) {
        case win.DIR_RIGHT:
            nextFirst.x = (first.x + 1) % 48;
            nextFirst.y = first.y;
            break;
        case win.DIR_UP:
            nextFirst.y = (first.y === 0) ? 71 : first.y - 1;
            nextFirst.x = first.x;
            break;
        case win.DIR_LEFT:
            nextFirst.x = (first.x === 0) ? 47 : first.x - 1;
            nextFirst.y = first.y;
            break;
        case win.DIR_DOWN:
            nextFirst.y = (first.y + 1) % 72;
            nextFirst.x = first.x;
    }
    return nextFirst;
};

贪吃蛇主要逻辑

win.updateList = function() {
    var last = win.blockList[win.blockList.length - 1];
    var first = win.blockList[0];
    var nf = win.nextFirst(first);
    //吃到食物了
    if(win.blockInList(nf, win.foodList)) {
        win.removeBlockFromFL(nf);
        win.blockList.unshift(nf);
        win.find("ui-sound-effects").play("disappear.mp3");
        win.makeFoodBlock(1);
        if(48 * 72 === win.blockList.length) {
            win.openWindow("win-result", function(ret){}, false, win.blockList.length);
            win.initGame();
        }
    } else if(win.blockInList(nf, win.blockList) && !win.checkEqual(nf, last)) {
        //蛇头碰到蛇身,游戏结束!
        win.openWindow("win-result", function(ret){}, false, win.blockList.length);
        win.initGame();
        console.log("Game Over");
    } else {
        //正常行进
        win.blockList.pop();
        win.blockList.unshift(nf);
    }
    setTimeout(win.updateList, 150);
};

绘制贪吃蛇

实现UICanvas的onPaint接口。

var win = this.getWindow();
var bl = win.blockList;
var fl = win.foodList;
var ctx = canvas2dCtx;
for(var i = 0; bl !== null && i < bl.length; i++) {
    ctx.strokeStyle = "white";
    ctx.fillStyle = "block";
    ctx.strokeRect(bl[i].x * 10, bl[i].y * 10, 10, 10);
    ctx.fillRect(bl[i].x * 10, bl[i].y * 10, 10, 10);
}
for(var i = 0; fl !== null && i < fl.length; i++) {
    ctx.strokeRect(fl[i].x * 10, fl[i].y * 10, 10, 10);
    ctx.fillRect(fl[i].x * 10, fl[i].y * 10, 10, 10);
}

之所以用了100行代码,是因为食物是一个列表,而不是传统的一个食物,这样会多费一些代码维护食物列表。
时间: 2024-08-26 04:21:20

GameBuilder开发游戏应用系列之100行代码实现贪吃蛇的相关文章

GameBuilder开发游戏应用系列之100行代码实现别踩白块

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-961421749977376 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-961421749977376 微信扫描: 游戏截图: 别踩白块是一款非常流行的游戏,该游戏于2014年4月16日上线App Store.并在全球40多个国家.地区免费游戏榜登顶榜首[4] ,超过一百个国家或地区排名前十 ,5月份荣

GameBuilder开发游戏应用系列之100行代码实现微信打飞机

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-951421981197090 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-951421981197090 微信扫描: 微信打飞机实现起来并不难,需要用到的知识点有如下几点: 碰撞检测:敌机与敌机之间不检测,子弹与敌机需要检测. 触摸跟随:我方飞机要根据触摸点的位置变化而变化. 子弹与敌机生成:子弹需要定时

GameBuilder开发游戏应用系列之70行代码实现套圆环

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-551421721381542 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-551421721381542 微信扫描: 运行截图: 套圆环是火舞上的一款非常火爆的游戏,它是FlappyBird的变种,也是重力感应类的游戏,不同的是碰撞检测从FlappyBird的钢管,变成中间的一根绳子. 这根绳子在Game

GameBuilder开发游戏应用系列之60行代码实现FlappyBird

在线演示:http://osgames.duapp.com/apprun.html?appid=osgames1-911422256817006 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-911422256817006 微信扫描: 运行截图: FlappyBird是2014年爆红的一款游戏,属于经典的重力感应游戏,玩法非常简单同时又非常虐心,正是这样的特点让FlappyBird得以在社交网络病毒式的传播. GameB

GameBuilder开发游戏应用系列之50行代码实现微信漂流瓶

在线运行:http://osgames.duapp.com/apprun.html?appid=osgames1-871422195197258 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-871422195197258 微信扫描: 运行截图: 这里实现微信漂流瓶不是真的完全实现,而是借机会介绍一下Cantk的UIFootprint控件. 漂流瓶中的网走的是一个曲线,在Cantk种可以用UIFootprint来实现,请

在HTML5全栈开发中用十几行代码做贪吃蛇

教你如何在HTML5全栈开发中用十几行代码做出贪吃蛇,直接上源码: <!DOCTYPE html><html><body><canvas id="myCanvas" width="240" height="240" style="border:1px solid #d3d3d3;">Your browser does not support the HTML5 canvas ta

GameBuilder开发游戏应用系列

最近迷上了一个在线html游戏开发工具GameBuilder,作者是知名csdn博客专家李先静老师, 李老师在内核.驱动.GUI.MMI.软件设计方法和软件优化等方面均有建树,这一次的GameBuilder,是李老师基于html5画布构建的html5游戏应用开发平台中的一部分. 开发平台分为两部分: 在线开发工具GameBuilder,GameBuilder是一个可视化编程工具,游戏中的场景控件,只要鼠标轻轻一拖即可生成. GUI框架Cantk,一个开源的游戏引擎和APP框架,是开发HTML5游

GameBuilder开发游戏应用系列之Cantk窗口生命周期

Cantk中的窗口(UIWindow/UIScene)与Android的Activity等组件一样有完整的生命周期,假设我的Web应用有两个窗口:FirstWindow,SecondWindow,整个应用的生命应该如下图所示: Created with Rapha?l 2.1.2FirstWindowFirstWindowSecondWindowSecondWindow1.FirstWindow's onSystemInit called2.SecondWindow's onSystemInit

Cocos2d-x 3.x 开发(十八)10行代码看自动Batch,10行代码看自动剔除

1.概述 在游戏的运行过程中,图形的绘制是非常大的开销.对于良莠不齐的Android手机市场,绘制优化较好的游戏,可以在更多的手机上运行,因此也是优化的重中之重.图形方面的优化主要体现在减少GUP的绘制次数上.这里我们分别从自动优化渲染批次和绘制剔除两个方面来看新版本在绘制上的优化. 2.自动batch 在Cocos2d-x 3.x中,抛弃了先前手动编写BatchNode,采用自动管理的方式.说起BatchNode,就难免涉及到显卡底层的绘制原理.简单的说,每提交一条绘制指令到显卡都会产生消耗,