等了那么久,终于等到新游戏啦!大炮英雄Cocos Creator实现,关注获取代码!
1
1
游戏预览
1
2
开始场景
摆放一个背景图,在背景图上添加背景地面、开始按钮、4个角色选择按钮、游戏logo。
1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景。跳转场景方法如下:
cc.director.preloadScene('playScene', function () { cc.director.loadScene('playScene');
});
//播放音效
playSound : function(name, isLoop){ cc.loader.loadRes(name, cc.AudioClip, function (err, clip) { if(err){ return; } let audioID = cc.audioEngine.playEffect(clip, isLoop); });
},
1. 将脚本拖到start场景的属性检查器中,并将脚本中声明的属性和组件关联起来,如下图:
2. 给开始按钮绑定回调事件,选中开始按钮,在属性检查器中,找到Button属性,将ClickEvents值改成1,表示有一个点击事件,再按照如下方式将函数和组件关联起来:
3. 给角色按钮绑定回调,方法和给开始按钮绑定回调完全一样,只是绑定的函数不同。
1
03
游戏场景
游戏玩法是控制我方英雄的发炮角度,如果打中敌方英雄就得分,否则会被敌方英雄的炮弹打中,如果我方英雄血量为0则游戏结束。
1. 游戏主界面:包含背景,地面,我方英雄,分数文本,返回主界面按钮。
2. 结算界面:包含遮罩层,最高得分文本,当前得分文本,重新开始按钮,返回主界面按钮。
gamePlay.js脚本是游戏的核心,主要方法如下:
1. 开启物理系统:
cc.director.getPhysicsManager().enabled = true;
2. 设置重力加速度:
cc.director.getPhysicsManager().gravity = cc.v2(0, -640);
3. 添加触摸监听,事件分为TOUCH_START(开始)、TOUCH_MOVE(移动)、TOUCHCANCEL(取消)、TOUCH_END(结束)四个状态,方法如下:
this.node.on(cc.Node.EventType.TOUCH_START, this.onEventStart, this);
this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onEventMove, this);
this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onEventCancel, this);
this.node.on(cc.Node.EventType.TOUCH_END, this.onEventEnd, this);
4. 当开始触摸屏幕时,触发开始的回调onEventStart(),回调中开启定时器,每隔0.03秒角度加1,并改变炮台的角度,方法如下:
//更新炮管角度
updateGunAngle : function(){ this.shootLineImg.active = true; this._curAngle = 0; this.gunSchedule = function(){ if (this._curAngle < 90){ this._curAngle += 1; this.myGunImg.angle = this._curAngle; } }; this.schedule(this.gunSchedule, 0.03); },
5. 当结束触摸时,触发结束的回调onEventEnd(),回调中关闭定时器,方法如下:
//停止更新炮管
stopGunAngle(){ this.unschedule(this.gunSchedule); this.shootLineImg.active = false;
},
6. 敌人开炮,需要先调整角度再发炮,炮的角度通过敌方子弹和我方英雄的坐标可计算出来,方法如下:
//敌方开炮
enemyOpenFire : function(){ //敌方子弹世界坐标 let enemyBulletPos = this._enemyNode.enemyBulletWorldPos(); //我方英雄世界坐标 let myHeroPos = this.myHeroImg.parent.convertToWorldSpaceAR(cc.v2(this.myHeroImg.position.x, this.myHeroImg.position.y + 30)); //计算夹角 let lenX = Math.abs(enemyBulletPos.x - myHeroPos .x); let lenY = Math.abs(enemyBulletPos.y - myHeroPos .y); let angle = Math.atan2(lenY, lenX) * 180 / Math.PI; //设置敌方小火炮的角度 this._enemyNode.setGunAngle(angle); //计算炮运行的距离 let len = Math.sqrt(Math.pow(lenX, 2) + Math.pow(lenY, 2)); this._enemyNode.gunAni(len); this.playSound("sound/enemyBullet", false);
},
7. 更换纹理方法:
//更换纹理
setImgTexture : function(str, node){ cc.loader.loadRes(str, cc.SpriteFrame, function (err, spriteFrame) { if (err) { cc.error(err.message || err); return; } node.getComponent(cc.Sprite).spriteFrame = spriteFrame; }.bind(this));
},
敌人脚本包含敌人,柱子,敌方炮弹等信息,脚本中的主要方法有:
1. 随机设置柱子的高度:
//调整敌方柱子高度
setColumnHight : function(){ //随机获取高度 let y = Math.floor(Math.random() * -250) - 100; this.cloumn.position = cc.v2(this._winSize.width / 2 + 100, y);
},
2. 敌人进出场的动作:
//敌人进场动作
comeOnAni : function(){ this.setColumnHight(); let w = Math.floor(Math.random() * (this._winSize.width / 4)); this.cloumn.runAction(cc.sequence(cc.moveTo(1.0, cc.v2(w, this.cloumn.position.y)), cc.callFunc(() =>{ this.enemyHeroImg.active = true; this.enemyGunImg.active = true; this.enemyAni(); }, this)));
},
//敌方柱子运动
enemyMove : function(){ this.enemyHeroImg.active = false; this.enemyGunImg.active = false; this.cloumn.runAction(cc.sequence(cc.moveTo(1.0, cc.v2(-this._winSize.width / 2 - 100, this.cloumn.position.y)), cc.callFunc(() =>{ if(this.callBack){ this.callBack(); } })));
},
3. 敌人开炮:
//炮运动
gunAni : function(len){ let bulletPos = this.enemyBulletImg.position; this.enemyBulletImg.runAction(cc.sequence(cc.moveTo(0.3, cc.v2(len, 0)), cc.callFunc(() =>{ if(this.hitHeroCallBack){ this.hitHeroCallBack(); } this.enemyBulletImg.position = bulletPos; })));
},
碰撞脚本是给需要做碰撞检测的刚体用的,在碰撞脚本中做碰撞监听,当触发监听后,再调用相应的回调。比如我方子弹需要监听与墙壁,敌人,柱子等物体的碰撞,那么我们先给子弹绑定好碰撞组件,如下图:
再在代码中实现碰撞的回调并保存下来,方法如下:
//碰撞监听
contactFunction (selfCollider, otherCollider){ if(this.callBack){ this.callBack(selfCollider, otherCollider); }
}, contactCallBack (callBack){ this.callBack = callBack;
},
最后在碰撞开始的监听中调用回调,方法如下:
onBeginContact ( contact, selfCollider, otherCollider){ if(selfCollider.tag == 0 && otherCollider.tag == 0){ cc.log("onBeginContact..."); //碰撞开始 this.contactFunction(selfCollider, otherCollider); }
},
游戏中有英雄角色的等待和走路动作,敌人等待动作,如果在编辑器做动画,编辑的个数比较多,所以我的做法是通过修改纹理达到动画效果,用法是将这个脚本绑定到需要播放动画的节点上,并设置一张大图,方法如下:
使用方法:
playAni(nameStr, count, dt, isLoop){ this.stopAni(); this.node.getComponent(cc.Sprite).spriteFrame = this.bigImg.getSpriteFrame(nameStr + 0); let array = []; for(let i = 0; i < count; i++){ array.push(cc.delayTime(dt)); array.push(cc.callFunc(() =>{ this.node.getComponent(cc.Sprite).spriteFrame = this.bigImg.getSpriteFrame(nameStr + i); })); } if(isLoop){ this.node.runAction(cc.repeatForever(cc.sequence(array))); } else{ this.node.runAction(cc.sequence(array)); }
},
参数分别是图片名称,图片张数,间隔时间,是否循环,调用方法:
this.shieldImg.getComponent("spriteFrameAni").playAni("shield", 4, 0.1, true);
1
4
获取代码
关注公众号,发送【大炮英雄】,获取代码。
等了那么久,终于等到新游戏啦!大炮英雄Cocos Creator实现,关注获取代码!相关推荐
- 借Blake老师的投篮小游戏公开课入门Cocos Creator 3D开发!
点击上方蓝字关注我 效果预览 获取代码 关注公众号,发送[3D篮球]获取代码. 游戏介绍 ● 点击屏幕,根据按住屏幕的时间,进行蓄力,时间越短,发出去的力越小,时间越长,发出去的力越大,超过了最大力, ...
- 小游戏开发上手体验 - Cocos Creator
微信群里最大的骚扰源有两种: 一是转发#吱口令#~!@#¥%--&*,长按复制此消息领红包之类的 另一种就是各种小程序和小游戏的分享 前天有同学无意间把一个小游戏分享到了答疑群中,我看了一下, ...
- 微信小游戏云开发在cocos creator中的设置
之前用three.js手撸了一个微信小游戏半成品,但是因为这种手撸的方式,程序和美术很难配合,而且开发难度和时间成本太大,最终决定还是用cocos creator进行微信小游戏的开发. 微信小程序早已 ...
- 微信小游戏游戏圈处理(cocos creator处理)
1. 创建游戏圈,具体可以参考:https://developers.weixin.qq.com/minigame/dev/tutorial/open-ability/game-club.html 2 ...
- [字节/头条]小游戏开发错误码Cocos Creator Engine Errors
github链接:Cocos Creator Engine Errors 0100 %s not yet implemented. 0200 You should specify a valid DO ...
- Cocos Creator 3D v1.0.2 正式发布,新增小游戏平台支持
Hi,各位开发者,Cocos Creator 3D 为大家带来翘首以待的新平台和新功能支持,v1.0.2 已正式发布,欢迎大家移步官网下载使用! 升级之前请根据项目情况进行必要的技术评估和版本备份噢 ...
- OPPO、vivo 小游戏正式上线,Cocos 率先支持
OPPO .vivo 小游戏平台正式发布 在近期举办的 Cocos 开发者沙龙上,OPPO 和 vivo 小游戏商务负责人向与会开发者详细介绍了其小游戏的业务规划.用户属性.产品需求.合作方式.变现能 ...
- 最齐全的Cocos2D Cocos creator Cocos2Dx游戏源代码素材,速来收藏
Cocos2D Cocos creator Cocos2Dx游戏源代码类资源应该算是素材类网站中必不可少的资源类型了吧~今天给大家推荐超好用,免费质量高的素材噢,让你坐拥海量资源同时又不撞款! 本人曾 ...
- Cocos Creator - 塞尔达的3D渲染风格,能在小游戏跑起来?
塞尔达的3D渲染风格,能在小游戏跑起来? 渲染系统作为游戏引擎的核心模块,是引擎画面表现力的天花板,直接决定了游戏所能输出给玩家的内容上限.Cocos Creator 3.x 的渲染系统,从架构到设计 ...
最新文章
- GitHub如何删除一个repository(仓库)
- 视频监控PPP项目投资建设和运营模式分析
- (原)torch中微调某层参数
- 一步步编写操作系统 23 重写主引导记录mbr
- xcode 4.2开发 ——navigation controller 添加按钮
- .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
- SQL函数 left()、charindex()的使用
- 强化学习《基于价值 - Double Q-Learning》
- 华视读卡器多浏览器插件_翻遍Chrome商店,这9款插件值得安装
- 【Java】HashMap 和 Hashtable 的 6 个区别
- (转)VmWare下安装CentOS6图文安装教程
- 在线课程培训系统源码 在线授课 在线教育源码 网课小程序源码
- 北理乐学大学计算机实验报告,北理乐学实验六.doc
- js实现爬取QQ群管理页面所有QQ群成员信息
- Dubbo Monitor 分析
- 2. 文件如何进行md5校验和sha1校验
- 如何学习理财知识,零基础怎么学习理财
- XXE漏洞介绍及利用
- 群硕入列FoodTalks优质供应商地图数字化板块
- 看完,如果你不分享,是我的失败!--超好文章!
热门文章
- BUUCTF-Web-[极客大挑战 2019]Upload
- c语言用二维数组例题,C语言二维数组
- vue格式化时间方法
- RabbitMQ:订阅模型-消息订阅模式
- 接线 科思模块怎么和plc_plc与变频器的接线图_plc和变频器通讯接线图详解 - 全文...
- nimble 2 蓝牙开发API
- CCF认证考试201809-2买菜-Python实现
- 评测:Yahoo! Gmail Live三大邮箱
- 用python批量更新es数据根据id_Python Elasticsearch批量操作客户端
- 产品必备技能(三):互联网数据分析师、产品经理和运营常用数据网站合集