游戏预览

开始场景

搭建开始场景

摆放一个背景图,在背景图上添加背景地面、开始按钮、4个角色选择按钮、游戏logo。

创建游戏脚本

1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景。跳转场景方法如下:

  1. cc.director.preloadScene('playScene', function () {
  2. cc.director.loadScene('playScene');
  3. });

2. 实现选择角色按钮的回调,点击某个角色时,先将其他角色设置为未选中状态,再将当前选择的角色设为选中状态,最后用cc.sys.localStorage.setItem(“key”,value);方法本地保存选择的角色类型。

3. 在onLoad()方法中,调用cc.sys.localStorage.getItem(“key”);方法获取到本地保存的角色类型,并设置角色按钮的选中状态。

4. 游戏中音效必不可少,点击各个按钮时,都需要播放音效,方法如下:

  1. //播放音效
  2. playSound : function(name, isLoop){
  3. cc.loader.loadRes(name, cc.AudioClip, function (err, clip) {
  4. if(err){
  5. return;
  6. }
  7. let audioID = cc.audioEngine.playEffect(clip, isLoop);
  8. });
  9. },

开始场景和脚本关联

1. 将脚本拖到start场景的属性检查器中,并将脚本中声明的属性和组件关联起来,如下图:

2. 给开始按钮绑定回调事件,选中开始按钮,在属性检查器中,找到Button属性,将ClickEvents值改成1,表示有一个点击事件,再按照如下方式将函数和组件关联起来:

3. 给角色按钮绑定回调,方法和给开始按钮绑定回调完全一样,只是绑定的函数不同。

游戏场景

游戏玩法是控制我方英雄的发炮角度,如果打中敌方英雄就得分,否则会被敌方英雄的炮弹打中,如果我方英雄血量为0则游戏结束。

搭建游戏场景

1. 游戏主界面:包含背景,地面,我方英雄,分数文本,返回主界面按钮。

2. 结算界面:包含遮罩层,最高得分文本,当前得分文本,重新开始按钮,返回主界面按钮。

创建游戏脚本

gamePlay.js脚本是游戏的核心,主要方法如下:

1. 开启物理系统:

  1. cc.director.getPhysicsManager().enabled = true;

2. 设置重力加速度:

  1. cc.director.getPhysicsManager().gravity = cc.v2(0, -640);

3. 添加触摸监听,事件分为TOUCH_START(开始)、TOUCH_MOVE(移动)、TOUCHCANCEL(取消)、TOUCH_END(结束)四个状态,方法如下:

  1. this.node.on(cc.Node.EventType.TOUCH_START, this.onEventStart, this);
  2. this.node.on(cc.Node.EventType.TOUCH_MOVE, this.onEventMove, this);
  3. this.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onEventCancel, this);
  4. this.node.on(cc.Node.EventType.TOUCH_END, this.onEventEnd, this);


  1.  4. 当开始触摸屏幕时,触发开始的回调onEventStart(),回调中开启定时器,每隔0.03秒角度加1,并改变炮台的角度,方法如下:
  1. //更新炮管角度
  2. updateGunAngle : function(){
  3. this.shootLineImg.active = true;
  4. this._curAngle = 0;
  5. this.gunSchedule = function(){
  6. if (this._curAngle < 90){
  7. this._curAngle += 1;
  8. this.myGunImg.angle = this._curAngle;
  9. }
  10. };
  11. this.schedule(this.gunSchedule, 0.03);
  12. },

5. 当结束触摸时,触发结束的回调onEventEnd(),回调中关闭定时器,方法如下:

  1. //停止更新炮管
  2. stopGunAngle(){
  3. this.unschedule(this.gunSchedule);
  4. this.shootLineImg.active = false;
  5. },

6. 敌人开炮,需要先调整角度再发炮,炮的角度通过敌方子弹和我方英雄的坐标可计算出来,方法如下:

  1. //敌方开炮
  2. enemyOpenFire : function(){
  3. //敌方子弹世界坐标
  4. let enemyBulletPos = this._enemyNode.enemyBulletWorldPos();
  5. //我方英雄世界坐标
  6. let myHeroPos = this.myHeroImg.parent.convertToWorldSpaceAR(cc.v2(this.myHeroImg.position.x, this.myHeroImg.position.y + 30));

  7. //计算夹角
  8. let lenX = Math.abs(enemyBulletPos.x - myHeroPos .x);
  9. let lenY = Math.abs(enemyBulletPos.y - myHeroPos .y);
  10. let angle = Math.atan2(lenY, lenX) * 180 / Math.PI;

  11. //设置敌方小火炮的角度
  12. this._enemyNode.setGunAngle(angle);

  13. //计算炮运行的距离
  14. let len = Math.sqrt(Math.pow(lenX, 2) + Math.pow(lenY, 2));
  15. this._enemyNode.gunAni(len);
  16. this.playSound("sound/enemyBullet", false);
  17. },

7. 更换纹理方法:

  1. //更换纹理
  2. setImgTexture : function(str, node){
  3. cc.loader.loadRes(str, cc.SpriteFrame, function (err, spriteFrame) {
  4. if (err) {
  5. cc.error(err.message || err);
  6. return;
  7. }
  8. node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
  9. }.bind(this));
  10. },

创建敌人脚本

敌人脚本包含敌人,柱子,敌方炮弹等信息,脚本中的主要方法有:

1. 随机设置柱子的高度:

  1. //调整敌方柱子高度
  2. setColumnHight : function(){
  3. //随机获取高度
  4. let y = Math.floor(Math.random() * -250) - 100;
  5. this.cloumn.position = cc.v2(this._winSize.width / 2 + 100, y);
  6. },

2. 敌人进出场的动作:

  1. //敌人进场动作
  2. comeOnAni : function(){
  3. this.setColumnHight();
  4. let w = Math.floor(Math.random() * (this._winSize.width / 4));
  5. this.cloumn.runAction(cc.sequence(cc.moveTo(1.0, cc.v2(w, this.cloumn.position.y)), cc.callFunc(() =>{
  6. this.enemyHeroImg.active = true;
  7. this.enemyGunImg.active = true;
  8. this.enemyAni();
  9. }, this)));
  10. },

  1. //敌方柱子运动
  2. enemyMove : function(){
  3. this.enemyHeroImg.active = false;
  4. this.enemyGunImg.active = false;
  5. this.cloumn.runAction(cc.sequence(cc.moveTo(1.0, cc.v2(-this._winSize.width / 2 - 100, this.cloumn.position.y)), cc.callFunc(() =>{
  6. if(this.callBack){
  7. this.callBack();
  8. }
  9. })));
  10. },

3. 敌人开炮:

  1. //炮运动
  2. gunAni : function(len){
  3. let bulletPos = this.enemyBulletImg.position;
  4. this.enemyBulletImg.runAction(cc.sequence(cc.moveTo(0.3, cc.v2(len, 0)), cc.callFunc(() =>{
  5. if(this.hitHeroCallBack){
  6. this.hitHeroCallBack();
  7. }
  8. this.enemyBulletImg.position = bulletPos;
  9. })));
  10. },

创建碰撞脚本

碰撞脚本是给需要做碰撞检测的刚体用的,在碰撞脚本中做碰撞监听,当触发监听后,再调用相应的回调。比如我方子弹需要监听与墙壁,敌人,柱子等物体的碰撞,那么我们先给子弹绑定好碰撞组件,如下图:

再在代码中实现碰撞的回调并保存下来,方法如下:

  1. //碰撞监听
  2. contactFunction (selfCollider, otherCollider){
  3. if(this.callBack){
  4. this.callBack(selfCollider, otherCollider);
  5. }
  6. },

  7. contactCallBack (callBack){
  8. this.callBack = callBack;
  9. },

最后在碰撞开始的监听中调用回调,方法如下:

  1. onBeginContact ( contact, selfCollider, otherCollider){
  2. if(selfCollider.tag == 0 && otherCollider.tag == 0){
  3. cc.log("onBeginContact..."); //碰撞开始
  4. this.contactFunction(selfCollider, otherCollider);
  5. }
  6. },

创建动画脚本

游戏中有英雄角色的等待和走路动作,敌人等待动作,如果在编辑器做动画,编辑的个数比较多,所以我的做法是通过修改纹理达到动画效果,用法是将这个脚本绑定到需要播放动画的节点上,并设置一张大图,方法如下:

使用方法:

  1. playAni(nameStr, count, dt, isLoop){
  2. this.stopAni();
  3. this.node.getComponent(cc.Sprite).spriteFrame = this.bigImg.getSpriteFrame(nameStr + 0);
  4. let array = [];
  5. for(let i = 0; i < count; i++){
  6. array.push(cc.delayTime(dt));
  7. array.push(cc.callFunc(() =>{
  8. this.node.getComponent(cc.Sprite).spriteFrame = this.bigImg.getSpriteFrame(nameStr + i);
  9. }));
  10. }

  11. if(isLoop){
  12. this.node.runAction(cc.repeatForever(cc.sequence(array)));
  13. }
  14. else{
  15. this.node.runAction(cc.sequence(array));
  16. }
  17. },

参数分别是图片名称,图片张数,间隔时间,是否循环,调用方法:

  1. this.shieldImg.getComponent("spriteFrameAni").playAni("shield", 4, 0.1, true);

获取代码

关注公众号,发送【大炮英雄】,获取代码。

Cocos Creator实现大炮英雄,附代码!的更多相关文章

  1. Cocos Creator与VS Code整合代码提示问题

    Cocos Creator与VS Code整合开发配置 在Cocos Creator中依次点击下面框中的菜单 VS Code工作流 配置Cocos Creator的默认编辑器 Cocos Creato ...

  2. 新编辑器Cocos Creator发布:对不起我来晚了!

    1月19日,由Cocos创始人王哲亲手撰写的一篇Cocos Creator新品发布稿件在朋友圈被行业人士疯狂转载,短短数小时阅读量突破五位数.Cocos Creator被誉为“注定将揭开Cocos开发 ...

  3. Cocos Creator JS web平台复制粘贴代码(亲测可用)

    Cocos Creator JS web平台复制粘贴代码(亲测可用) 1 webCopyString: function(str){ var input = str; const el = docum ...

  4. Cocos Creator代码编辑环境配置

    1,可以使用较为适合js的webstorm,亦可以采用VS: 2,若需要webstorm,在下载之后,在文件,设置内外部编辑器选用webstorm.exe,即可: 3,Visual Studio Co ...

  5. 关于Cocos Creator用js脚本代码播放骨骼动画的步骤和注意事项

    步骤: 1.用cc.find()方法找到相应的骨骼动画节点,并把这个对象赋值给一个var出来的新对象. 具体代码:var spineboy_anim = cc.find("UI_Root/a ...

  6. 教你使用Cocos Creator制作国旗头像生成器,附源码!

    关注「编程小王子」公众号回复[头像生成器]获得源码! 下面我重点介绍一下Cocos Creator H5头像生成的实现方法: 获取手机相册图片 在 Cocos Creator 中加载相册图片 Coco ...

  7. Cocos Creator - 入门教程项目 - 博客频道 - CSDN.NET

    3457 教程司令部 [20160418] | Cocos Creator - CocoaChina CocoaChina_让移动开发更简单cocoachina.com 2033 Cocos Crea ...

  8. 触控的手牌—Cocos Creator

    科普 Cocos Creator是触控最新一代游戏工具链的名称.如果不太清楚的,可以先看一些新闻.   新编辑器Cocos Creator发布: 对不起我来晚了! http://ol.tgbus.co ...

  9. cocos creator实现棋牌游戏滑动选牌的功能

    最近在玩cocos creator,打算学着做一款类似双扣游戏的棋牌,名字叫文成三星,比双扣还要多一扣,因为需要三幅牌,在我们老家比较流行这种玩法. 目前实现了绝大部分的逻辑效果如下: 有一点不好的体 ...

随机推荐

  1. open的正确使用

    open一个对象的时候,不确定他是图片还是文本啊 #----------------------- import io   with open('photo.jpg', 'rb') as inf:   ...

  2. 设置普通用户输入sudo,免密进入root账户

    满足给开发用户开权限,赋予sudo权限.又不让其输入密码的方式: 方式一: 开始系统内部的wheel用户组, 在/etc/suoers 中编辑配置文件如下: %wheel ALL=(ALL) NOPA ...

  3. Python中流程控制语句之IF语句

    生活中经常遇到的各种选择和判断在程序中也会遇到,比如玩色子,猜大小,比如选择哪条路回家?Python程序中同样也会遇到.IF语句就是用作条件判断的控制语句. 语法一: if 条件: # 引号是将条件与 ...

  4. Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表     MyIS ...

  5. 前后端分类状态下SpringSecurity的玩法

    前后端分离状态下,后端SpringSecurity该如何变动呢? 如何变动取决于前后端分离状态下,前后端交互的特点,纯json交互,闲言少叙,上干货 主配置类 @Configuration @Enab ...

  6. Java验证手机号

    在实际开发中我们需要对手机号格式校验,以下是对中国手机号校验的实现. public class PhoneUtils { /** * 中国手机号码 */ private static Pattern ...

  7. android 滚动时间选择器

    一.概述 滚动时间选择现在貌似很常用,所以就总结一下,显示效果一般般 , 做个参考吧! 以上就是效果图,可以滚动选择 日期时间, 由于是在 5.0系统运行的,貌似5.0系统做了什么变动,下面的 &qu ...

  8. JDBC连接时出现的问题总结

    java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more tha ...

  9. .NetCore 网站DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法

    .netCore网站Delete请求405错误 解决方案 1:在启用或关闭Windows功能 –> Internet Information Services 关闭WebDAV发布(这种方式可能 ...

  10. Java匹马行天下之 Java国出了个Java——举国欢庆

    Java帝国的崛起 前言: 看庭前花开花落,宠辱不惊, 望天上云卷云舒,去留无意. 闹心的事儿,选择释怀: 纠缠的人儿,试着放下, 生活其实很美. 心若向阳,就无惧悲伤. 愿你明朗坦荡纵情豁达,有得有 ...