分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

捕鱼达人是一款非常流行的游戏,几年里赚取了数以千万的收入,这里借用它来介绍一下用Gamebuilder+CanTK开发游戏的方法。其实赚钱的游戏未必技术就很难,今天我们就仅用90来行代码来实现这个游戏。

CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏和APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://github.com/drawapp8/cantk

0.先Show一下最终成果:

在线运行:http://www.tangide.com/apprun.html?appid=previewupyunosgames1-841431856568571

在线编辑:http://www.tangide.com/gamebuilder.php?appid=previewupyunosgames1-841431856568571

1,新建一个项目,删除场景里的球和地面,把手机设置成横屏,然后设置场景的物理引擎参数,把X/Y方向的重力设置为0。

设置场景的背景图片:

效果如下:

2,在场景中放一个图片,如下图设置它的属性。

3,在图片中再放一个帧动画,用来表示大炮,如下图设置它的属性。

4,在场景中再放一个帧动画,用来表示鱼,如下图设置它的属性。

通过拷贝&粘贴,创建10条鱼,名称分别命名为ui-fish1到ui-fish10。得到下面的效果:

5,在场景中再放一个帧动画,用来表示金币,如下图设置它的属性。

6,在场景中再放一个帧动画,用来表示炮弹,如下图设置它的属性。

7,在底部的图片中放一个图片字体,用来表示总金币数量,如下图设置它的属性。

8,在场景中中放一个图片字体,用来表示单次金币数,如下图设置它的属性。

9,在底部的图片中放两个按钮,用来改变大炮的威力,如下图设置它的属性。

到此界面基本完成了(后面可能需要做些调整),效果如下:

10,现在我们开始写代码。

在场景的onOpen里定义几个函数:

var win = this;function isObjInvisible(obj) {return !obj.visible;}//当炮弹和鱼移动到场景之外时,把它们设置为不可见不可用,后面重用这些对象,以减小内存开销。function handleOnMoved() {    var x = this.x, y = this.y, r = x + this.w, b = y + this.h, w = win.w, h = win.h;    if(x > w || y > h || r < 0 || b < 0) {        this.setVisible(false).setEnable(false);    }}//定时产生鱼function makeFish() {    if(!win.info) return;    var info = win.info,cannon = info.cannon;    var fish = info.fishs.find(isObjInvisible);    if(!fish && info.fishs.length < 20) {        var index = Math.floor(10 * Math.random())+1;        fish = win.dupChild("ui-fish"+index);            }    if(fish) {        info.fishs.push(fish);        var y = Math.max(0, Math.floor((win.h - info.bottom.h) * Math.random() - fish.h));        var x =  y%2 ? -fish.w : win.w;        var vx = x > 0 ? -1 : 1;        var rotation = x > 0 ? Math.PI : 0;        fish.setPosition(x, y).setVisible(true).setEnable(true).setV(vx, 0).setRotation(rotation).play("live");    }    setTimeout(makeFish, 500);}//初始化游戏win.initGame = function() {    var info = {bullets:[], fishs:[], cannonType:1, scoreValue:0};    var cannon = this.find("ui-cannon", true);    var p = cannon.getPositionInWindow();     cannon.center ={x: p.x + (cannon.w >> 1), y: p.y + (cannon.h >> 1)};        info.cannon = cannon;    info.bottom = this.find("ui-image");    var totalScore = this.find("ui-total-score", true);    p = totalScore.getPositionInWindow();     totalScore.center ={x: p.x + (totalScore.w >> 1), y: p.y + (totalScore.h >> 1)};        info.totalScore = totalScore;        var bullet = this.find("ui-bullet").setVisible(false).setEnable(false);    bullet.handleOnMoved = handleOnMoved;    info.bullets.push(bullet);        info.coin = this.find("ui-coin").setVisible(false);    info.score = this.find("ui-score").setVisible(false);    for(var i = 0; i < this.children.length; i++) {        var iter = this.children[i];        if(iter.name.indexOf("ui-fish") >= 0) {            iter.handleOnMoved = handleOnMoved;            iter.setEnable(false).setVisible(false);            info.fishs.push(iter);        }    }    info.timerID = setTimeout(makeFish, 1000);    this.info = info;}//改变大炮类型win.changeCannon = function(delta) {    var info = this.info,cannon = info.cannon;    info.cannonType = Math.max(1, Math.min(7, info.cannonType + delta));    cannon.play("default"+info.cannonType, 100000);}//炮弹打中鱼时,炮弹变成网,鱼播放die动画,金币从炮弹处移动到总金币处。win.onContacted = function(bullet, fish) {    var info = this.info,cannon = info.cannon;    bullet.setEnable(false).play("web"+info.cannonType, 1, function() {bullet.setVisible(false);});    fish.setEnable(false).play("die", 1, function() {fish.setVisible(false)});    info.scoreValue += 100;    info.totalScore.setValue(info.scoreValue);    info.coin.setVisible(true).animate({xStart:bullet.x, yStart:bullet.y, xEnd:info.totalScore.x, yEnd:info.totalScore.y-20});}//点击场景时,调整大炮位置,发射炮弹,大炮播放射击动画。win.handleClick = function(point) {    var info = this.info,cannon = info.cannon;    if(this.targetShape != this.info.bottom) {        var angle = Math.lineAngle(cannon.center, point) - 1.5 * Math.PI;        cannon.setRotation(angle);        var bullet = info.bullets.find(isObjInvisible);        if(!bullet)  {            bullet = win.dupChild("ui-bullet",0);            info.bullets.push(bullet);        }        var x = cannon.center.x - (bullet.w >> 1), y = cannon.center.y - (bullet.h >> 1);        bullet.setPosition(x, y).setRotation(angle).setVisible(true).setEnable(true).setV(5*Math.sin(angle),-5*Math.cos(angle));        bullet.play("bullet"+info.cannonType);        cannon.play("fire"+info.cannonType, 1);        console.log(angle);    }}this.initGame();

在场景的点击事件中:

this.handleClick(point);

在两个按钮中:

this.getWindow().changeCannon(-1);

好了,我们的捕鱼达人基本完成了。还有几个地方需要完善:1.射中多条鱼时分数加倍。2.鱼有不同的生命值,炮弹有不同的杀伤力。

呵河,这些问题留给读者动手去做吧,或许您就是下一个千万级游戏的开发者呢:)

参考资料:

https://github.com/drawapp8/gamebuilder/wiki/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

HTML5游戏实战 2 90行代码实现捕鱼达人相关推荐

  1. HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏,几年里赚取了数以千万的收入,这里借用它来介绍一下用Gamebuilder+CanTK开发游戏的方法.其实赚钱的游戏未必技术就很难,今天我们就仅用90来行代码来实现这个游戏 ...

  2. 通过90行代码学会HTML5 WebSQL的4种基本操作

    Web SQL数据库API是一个独立的规范,在浏览器层面提供了本地对结构化数据的存储,已经被很多现代浏览器支持了. 我们通过一个简单的例子来了解下如何使用Web SQL API在浏览器端创建数据库表并 ...

  3. 90行代码!大一学生自学编程,自创搜题网站,已在GitHub开源

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 大数据文摘出品 作者:Caleb 考试早已不是学生的"特权"了. ...

  4. php本地文件打包代码,PHP实战:几行代码轻松实现PHP文件打包下载zip

    <PHP实战:几行代码轻松实现PHP文件打包下载zip>要点: 本文介绍了PHP实战:几行代码轻松实现PHP文件打包下载zip,希望对您有用.如果有疑问,可以联系我们. PHP应用 //获 ...

  5. 90行代码轻松实现!结合 Whisper + Stable-diffusion 的语音生成图像任务!

    本项目将 Whisper 与 Stable Diffusion 模型结合,可以直接完成语音生成图像的任务.用户可以语音输入一个短句,Whisper 会自动将语音转化为文本,接着,Stable Diff ...

  6. 基于引擎开发HTML5游戏实战(一)---游戏引擎

    最近从一个技术沙龙活动中了解到一个游戏引擎(construct2), 这款引擎彻底地改变了游戏开发在我心目中的印象.以前看过一些游戏开发的书籍,基本上都是从canvas,从坐标系讲起,再加上复杂地绘图 ...

  7. HTML5游戏实战之消灭星星(完整源代码)

    消灭星星是一款经典的休闲游戏,因此花了一点时间在Hola Studio上实现它.本游戏包含完整的游戏元素,包括广告.音乐.音效.振动.关卡.分享等. 游戏截图 扫描二维码 游戏链接:http://st ...

  8. 用c语言400行代码小游戏,程序员400行代码制作翻牌游戏解决无聊时间

    原标题:程序员400行代码制作翻牌游戏解决无聊时间 上班感觉累,很想放假,但是放假在家又感觉非常无聊,总是不知道干什么,又感觉还不如上班呢,反正无聊不如练练写小游戏吧,即练习了代码,做完后还能接着玩, ...

  9. onclick 源码_仿照React源码流程打造90行代码的Hooks

    作者:苏畅 转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA 前言 你可能已经看过其它简易的Hooks实现.那么本文和其它实现有什么区别呢? ...

最新文章

  1. 电子科技大学计算机学院保研夏令营,电子科技大学计算机科学与工程学院网络空间安全保研夏令营...
  2. linux 相对路径
  3. 【收藏】cgroup的简单使用
  4. linux go语言环境配置文件,linux下安装配置go语言环境
  5. [hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup
  6. Linux学习之后台运行进程
  7. concatenate python_python中numpy.concatenate()函数的使用
  8. 联想y50p70换固态硬盘_换了固态硬盘电脑就变快?告诉你:固态硬盘不是万能药...
  9. HTML+CSS零基础学习笔记(二)
  10. 一、全国计算机三级数据库考试——理论知识总结(选择题)
  11. 虚幻4 游戏引擎(一):材质教学
  12. 2014-10-18 多玩初面
  13. 排序算法——选择排序
  14. 如何修复老照片,Bringing-Old-Photos-Back-to-Life机器学习开源项目安装使用 | 机器学习
  15. 畅想物联网未来 | 百度云天工智能物联网沙龙圆满落幕
  16. cmd无法打开jupyter notebook问题
  17. xcode8 上传app到appStore 遇到 error ITMS90096
  18. 深恶痛绝……残忍虐杀何时终止?
  19. 第149篇 笔记-web3
  20. python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...

热门文章

  1. 强化学习--Sarsa
  2. 小白兔视频格式转换器下载
  3. 基于CTC转换器的自动拼写校正端到端语音识别
  4. 网页自动点击脚本(可用于自动评教)
  5. 计算机中丢失msvcp40.dll,电脑丢失msvcp140.dll的解决方法 电脑缺少msvcp140.dll怎么解决...
  6. php 算页数,PHP 分页的计算
  7. ssh: connect to host xx.xx.xxx.xxx port 22: Connection refused
  8. 湖南省第6届程序大赛第5题 内部收益率
  9. 网站建设(2)——DNS及DNS解析
  10. Undefined control sequence.<recently read> \multirow