TangIDE游戏开发之60行代码实现打地鼠

对于没有接触过html的朋友,要实现一个最简单的html5打地鼠游戏,也是不知道从何下手的。就算是html高手,没有上千行代码,也完不成一个像样的打地鼠游戏。

网上找到一个开源的打地鼠游戏(参见下载地址),粗略看了一下代码,代码行数1000+。

今天我要介绍的打地鼠游戏,主要逻辑代码,也就60多行,所有的代码加起来也就100多行,是为某客户定制的一款比较完整的商业游戏,大部分的功能也就只是一下午的时间就能完成。

先看一下实际的成果:

PC点击这里玩

手机下方扫描二维码玩

如果你想在本游戏上进行改进,点击这里

开始讲解之前,打个广告,欢迎html5游戏开发爱好者扫描下方二维码或者搜群号223466431,加入开发者QQ群,我们免费提供最快速的开发工具,我们的所有html5游戏都开源。

整个游戏的开发,基于在线H5游戏开发工具TangIDE,相关开发文档点击这里,开发视频正在制作中…如果您致力于开发H5轻应用,请点这里

1. 准备工作

浏览器打开TangIDE链接,右上角有登陆按钮,选择QQ登陆。

浏览器推荐谷歌浏览器或者猎豹浏览器

2. 创建第一个场景

打开工具后,就有个默认场景,这个场景可以作为我们的第一个场景,把里面的足球和和草地删掉,场景改名为win-loading,然后更改背景为”加载背景.jpg”。图片资源在公共资源目录下面:

拖一个音乐控件进来,清除默认背景音乐,选择资源菜单下的”背景音乐.mp3”作为背景音乐,勾选”自动播放”和”循环”两个选项,在通用标签里不勾选”运行时可见选项”。

全部做好之后,成果如下

3. 创建第二个场景

新建一个场景,将场景名字改为win-start。

拖一个图片进来,设置图片为”标题1.png”,放在场景的顶部,按照下图设置位置和大小属性:

其他几个图片控件类似。

拖两个文本控件进来,表示分数和时间。

这里重点要讲的一个元素是雪花,拖一个图片控件进来,将图片设置为”雪花.png”,这里需要拆分图片,方法是长按图片会弹出菜单,选择”拆分图像”后,填入行列数即可

再次选择时就可以选里面的小图了。

选择完图片之后,要用到动画编辑器了(选中控件,菜单栏有个小人图标就是)。

创建一个动画rotate,设置如下图

这个时候点击预览就雪花就可以一直转了。

再拖两个按钮进来,分别放置”开始按钮1.png”,”开始按钮t2.png”。

最后拖一个帧动画进来,在特有属性里面,选择”黑色素.png”作为帧动画元素,按上述方法拆分图片,选择第0,1张图片,帧率设置为3。

全部完成后,如下图:

4. 创建第三个场景

新建一个场景,改名为win-game,其他的控件如第二个场景一样放置。

然后,最终要的控件是地鼠(即黑色素)的实现:

首先拖一个图片控件进来,将背景图片清空。

再拖一个帧动画到图片上,作为这个图片控件的子控件。

用动画编辑器为帧动画设置三个动画,如下图所示:

为帧动画选择图片,在特有属性里面,拆分”黑色素.png”,然后设置2个分组,如下图:

然后选择帧动画的父控件,复制7个,摆放到合适的位置,调整一下旋转角度,使其看起来更美观一些。

再拖一个帧动画,作为点滴效果,选择”精华液.png”作为帧动画图片,图片拆分和分组如上不再赘述。

最后拖一个时钟控件用来做倒计时用,特有属性的时长设置为1000。

全部完成之后,如下图:

5. 编写一点代码

其他的游戏场景不再赘述,读者可自行编辑和参考,到现在为止,游戏的准备工作都已经做完了,我们还没写一行代码,但是点击预览,就已经能看到大部分效果了,只是不能响应事件而已。

现在该写一些代码了,其实很多代码还可以自动生成的。

首先场景的切换,比如第一个场景切换到第二个场景的代码就可以自动生成,选中场景,编辑onClick事件。

点击生成代码即可。

同样第二个场景切换到第三个场景也可以依葫芦画瓢。

现在重点讲第三个场景的实现。

选中黑色素帧动画的父控件,编辑器onUpdateTransform事件,添加如下代码:

canvas.beginPath();
canvas.arc(this.w >> 1, this.h >> 1, this.w >> 1, 0, 2 * Math.PI);
canvas.clip();

这三行代码,实现的是黑色素(也就是地鼠)的隐藏和显示。

在第三个场景的onBeforeOpen中,添加如下代码:

var win = this.getWindow();
var STATE_IN = 0;
var STATE_OUT = 2;
var STATE_FREE = 3;
var STATE_ATTACKED = 4;
win.attacked = 0;
win.total = 0;
win.times = 30;
win.gameOver = false;
var dropper = win.find("dropper");
win.find("ui-icon-general-1").setVisible(true);
var resetState = function() {
    if(win.gameOver || !this.children) {
        return;
    }
    var self = this;
    var element = self.children[0];
    win.total++;
    element.opacity = 1;
    element.x = 200;
    element.y = 200;
    element.play("normal");
    self.gameState = STATE_IN;
    element.animate("display", function() {
        self.gameState = STATE_FREE;
        setTimeout(function() {
            if(self.gameState === STATE_FREE) {
                self.gameState = STATE_OUT;
                element.animate("dismiss");
            }
            setTimeout(function() {
                if(self) {
                    self.resetState();
                }
            }, 1200 + 800 * Math.random());
        }, 1500);
    });
};
var handleClick = function(point) {
    var self = this;
    if(self.gameState === STATE_FREE) {
        win.attacked++;
        win.find("ui-attacked").setText(win.attacked + "ko");
        dropper.animate({xStart:dropper.x, xEnd:self.x + 50, duration:400}, function() {
            dropper.play("drop", 1, function() {
                dropper.play("normal", 1);
            });
        });
        self.gameState = STATE_ATTACKED;
        var element = this.children[0];
        element.play("attacked", 1, function() {
            element.animate("disappear", function() {
            });
        });
    }
};
for(var i = 1; i <= 7; i++) {
    var melanin = win.find("ui-sprite-general-" + i);
    melanin.resetState = resetState;
    melanin.handleClick = handleClick;
    var ele = melanin.children[0];
    ele.setPosition(200, 200);
}

var index = 1;
function launch() {
    var melanin = win.find("ui-sprite-general-" + index);
    melanin.resetState();
    if(index < 7) {
        index++;
        setTimeout(launch, 1500 * Math.random());
    }
}
launch();

时钟控件的onTimeout事件下添加如下代码:

var win = this.getWindow();
if(win.gameOver) {
    return;
}
win.times--;
win.find("ui-times").setText(win.times + "s‘‘");
if(win.times <= 0) {
    win.gameOver = true;
    var initData = {};
    initData.total = win.total;
    initData.attacked = win.attacked;
    this.openWindow("win-result",
        function (retData) {console.log("window closed.");}, false, initData);
}

TIPS:

如果你想看全部的代码,可以选择工具->代码查看器

如果你看完觉得手痒,想在我的基础上继续改进,点击这里,。

如果有疑问或者指教,欢迎加群223466431讨论,谢谢!

时间: 2024-11-08 09:05:10

TangIDE游戏开发之60行代码实现打地鼠的相关文章

HTML5游戏实战(3): 60行代码实现水平跑酷游戏

跑酷游戏无疑是目前最受欢迎的游戏类型之一,3D跑酷游戏可能比较难做一点(这个我不懂),2D跑酷却是非常容易的,只要有美术资源,做一个<天天酷跑>这类流行游戏也并非是什么难事. 这里通过一个松鼠跑酷的游戏介绍一下用Gamebuilder+CanTK开发游戏的方法,这个游戏的主场景仅用了60来行代码. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏和APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://g

HTML5游戏实战之20行代码实现打地鼠

之前写过一篇打地鼠的博客70行的代码实现打地鼠游戏,细致思考过后,发现70行代码都有点多余了,应用tangide的控件特性,能够将代码量缩减到20行左右. 先show一下终于成果,点击试玩:打地鼠.或者扫描二维码: 假设你想在这个游戏上改进.点击这里. 開始解说之前,打个广告.欢迎html5游戏开发爱好者扫描下方二维码或者搜群号223466431,增加开发人员QQ群,我们免费提供最高速的开发工具.我们的全部html5游戏都开源. 整个游戏的开发.基于在线H5游戏开发工具TangIDE,相关开发文

iOS开发之0行代码加载NSBundle中的@2x与@3x图片

本文只针对通过NSBundle对象的方法 pathForResource 获取本地图片资源遇到的图片名无法自动识别@2x与@3x名称的问题进行测试.总结与分享. 加载本地图片资源的方式一般通过以下两种方法: 第1种: UIImage *img = [UIImage imageNamed:@"imageName"]; 第2种: UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForRes

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

60行代码:Javascript 写的俄罗斯方块游戏

先看效果图: 游戏结束图: javascript实现源码: <!doctype html> <html><head><title>俄罗斯方块</title> <meta name="Description" content="俄罗斯方块Javascript实现"> <meta name="Keywords" content="俄罗斯方块,Javascript,

【分享】60行代码:Javascript 写的俄罗斯方块游戏

效果如下,可测试: javascript实现源码: <!doctype html> <html><head><title>俄罗斯方块</title> <meta name="Description" content="俄罗斯方块Javascript实现"> <meta name="Keywords" content="俄罗斯方块,Javascript,实现,短

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Cocos2d-x游戏开发之lua编辑器 subime 搭建,集成cocos2dLuaApi和自有类

Sublime Text http://baike.baidu.com/view/10701920.htm?from_id=8130415&type=syn&fromtitle=Sublime&fr=aladdin 简介 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的V

iOS游戏开发之UIDynamic

iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿