系统主菜单如下图所示:

首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景。

下面看下这个界面的源码:

/**
* Power by html5中文网(html5china.com)
* author: jackyWHJ
*/ cc.dumpConfig();
var winSize;
var SysMenu = cc.Layer.extend({
_hero:null,
_logo:null,
_logoFrameCache:null,
imagesArrLen:0,
bigImgLen:0,
init:function () {
var bRet = false;
if (this._super()) {
this._logoFrameCache = cc.SpriteFrameCache.getInstance();
this._logoFrameCache.addSpriteFrames(s_textureBigImage_plist); winSize = cc.Director.getInstance().getWinSize();
var sp = cc.Sprite.create(s_b01);
sp.setAnchorPoint(cc.p(0,0));//设置锚点左下角
this.addChild(sp, 0, 1);//addChild(cocos2d::CCNode *child, int zOrder, int tag);
// 其中child参数为将要添加的节点。对于场景而言。添加的节点就是层,先添加的层会被置于后添加的层之下。
// 如果想要指定先后次顺,可以使用不同的zOrder,zOrder代表该节点下元素的先后次序,值越大显示越靠上。
// 默认值是0.tag是元素的标识号码,如果子节点设置了tag值,就可以在它的父节点中利用tag值找到它 var newGameNormal = cc.Sprite.create(s_menu, cc.rect(0, 0, 126, 33));
var newGameSelected = cc.Sprite.create(s_menu, cc.rect(0, 33, 126, 33));
var newGameDisabled = cc.Sprite.create(s_menu, cc.rect(0, 33 * 2, 126, 33)); var gameSettingsNormal = cc.Sprite.create(s_menu, cc.rect(126, 0, 126, 33));
var gameSettingsSelected = cc.Sprite.create(s_menu, cc.rect(126, 33, 126, 33));
var gameSettingsDisabled = cc.Sprite.create(s_menu, cc.rect(126, 33 * 2, 126, 33)); var aboutNormal = cc.Sprite.create(s_menu, cc.rect(252, 0, 126, 33));
var aboutSelected = cc.Sprite.create(s_menu, cc.rect(252, 33, 126, 33));
var aboutDisabled = cc.Sprite.create(s_menu, cc.rect(252, 33 * 2, 126, 33)); var newGame = cc.MenuItemSprite.create(newGameNormal, newGameSelected, newGameDisabled, function () {
this.onButtonEffect();
flareEffect(this, this, this.onNewGame);
}.bind(this)); var gameSettings = cc.MenuItemSprite.create(gameSettingsNormal, gameSettingsSelected, gameSettingsDisabled, this.onSettings, this);
var about = cc.MenuItemSprite.create(aboutNormal, aboutSelected, aboutDisabled, this.onAbout, this); //系统菜单
var menu = cc.Menu.create(newGame, gameSettings, about);
menu.alignItemsVerticallyWithPadding(10);
this.addChild(menu, 1, 2);
menu.setPosition(winSize.width / 2 , winSize.height / 2 - 80); //logo动画
this.bigImgLen = LLK.CONTAINER.BIGIMAGES.length;
this._logo = cc.Sprite.createWithSpriteFrameName(LLK.CONTAINER.BIGIMAGES[Math.floor( Math.random()*this.bigImgLen)]);
this._logo.setAnchorPoint(cc.p(0, 0));
this._logo.setPosition(winSize.width/2 -100, 300);
this.addChild(this._logo, 10, 1); var animFrames = []; // 将所有帧存入一个数组
for (var i=0;i<this.bigImgLen;i++) {
//采用循环添加动画的每一帧
var frame =this._logoFrameCache.getSpriteFrame(LLK.CONTAINER.BIGIMAGES[i]);
if (frame) {
animFrames.push(frame);
}
}
// 创建动画,设置播放间隔
var animation = cc.Animation.create(animFrames, 1);
// animation.setDelayPerUnit(0.1);
//设置动画播放完成是否保持在第一帧,true为保持在第一帧,false为保持在最后一帧
//animation.setRestoreOriginalFrame(false);
this._logo.runAction(cc.RepeatForever.create(cc.Animate.create(animation)));
if (LLK.SOUND) {
cc.AudioEngine.getInstance().setMusicVolume(0.7);
cc.AudioEngine.getInstance().playMusic(s_mainMainMusic_mp3, true);
} // this.schedule(this.update, 0.05);//schedule(callback_fn, interval, repeat, delay)
// 里面四个参数对应的含义是:
// callback_fn:调用的方法名
// interval:间隔多久再进行调用 单位是秒
// repeat:重复的次数
// delay:延迟多久再进行调用
bRet = true;
}
return bRet;
}, onNewGame:function (pSender) {
//load resources
cc.Loader.preload(g_maingame, function () {
var scene = cc.Scene.create();
scene.addChild(GameLayer.create());
scene.addChild(GameControlMenu.create());
cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene));
}, this);
}, onSettings:function (pSender) {
this.onButtonEffect();
var scene = cc.Scene.create();
scene.addChild(SettingsLayer.create());
cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.0, scene));
}, onAbout:function (pSender) {
this.onButtonEffect();
var scene = cc.Scene.create();
scene.addChild(AboutLayer.create());
cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.0, scene));
}, onButtonEffect:function(){
if (LLK.SOUND) {
var s = cc.AudioEngine.getInstance().playEffect(s_buttonEffect_mp3);
}
}
}); SysMenu.create = function () {
var sg = new SysMenu();
if (sg && sg.init()) {
return sg;
}
return null;
}; SysMenu.scene = function () {
var scene = cc.Scene.create();
var layer = SysMenu.create();
scene.addChild(layer);
return scene;
};
首先,在初始化方法里,我们把页面需要的元素添加进去。在这里,我们是先加载了页面动画logo所需要的纹理集:
 this._logoFrameCache = cc.SpriteFrameCache.getInstance();
this._logoFrameCache.addSpriteFrames(s_textureBigImage_plist);

再次是添加背景图片,使用cc.Sprite.create(s_b01);来创建背景的sprite,然后设置锚点并把它添加到Layer:

var sp = cc.Sprite.create(s_b01);
sp.setAnchorPoint(cc.p(0,0));//设置锚点左下角
this.addChild(sp, 0, 1);//addChild(cocos2d::CCNode *child, int zOrder, int tag);
// 其中child参数为将要添加的节点。对于场景而言。添加的节点就是层,先添加的层会被置于后添加的层之下。
// 如果想要指定先后次顺,可以使用不同的zOrder,zOrder代表该节点下元素的先后次序,值越大显示越靠上。
// 默认值是0.tag是元素的标识号码,如果子节点设置了tag值,就可以在它的父节点中利用tag值找到它

接着是添加菜单按钮组,使用cc.MenuItemSprite.create创建各个菜单,这里需要添加他们各自的监听方法,

//newGame菜单
var newGame = cc.MenuItemSprite.create(newGameNormal, newGameSelected, newGameDisabled, function () {
this.onButtonEffect();
flareEffect(this, this, this.onNewGame);
}.bind(this));

使用cc.Menu.create创建菜单组把它们添加进去,之后添加到Layer,设置布局位置。

 //系统菜单
var menu = cc.Menu.create(newGame, gameSettings, about);
menu.alignItemsVerticallyWithPadding(10);
this.addChild(menu, 1, 2);
menu.setPosition(winSize.width / 2 , winSize.height / 2 - 80);

最后一个点就是logo动画了,先创建logo,把它添加到Layer,之后创建动画,并让logo执行动画。

//logo动画
this.bigImgLen = LLK.CONTAINER.BIGIMAGES.length;
this._logo = cc.Sprite.createWithSpriteFrameName(LLK.CONTAINER.BIGIMAGES[Math.floor( Math.random()*this.bigImgLen)]);
this._logo.setAnchorPoint(cc.p(0, 0));
this._logo.setPosition(winSize.width/2 -100, 300);
this.addChild(this._logo, 10, 1);
var animFrames = []; // 将所有帧存入一个数组
for (var i=0;i<this.bigImgLen;i++) {
//采用循环添加动画的每一帧
  var frame =this._logoFrameCache.getSpriteFrame(LLK.CONTAINER.BIGIMAGES[i]);
  if (frame) {
     animFrames.push(frame);
  }
}
// 创建动画,设置播放间隔
var animation = cc.Animation.create(animFrames, 1);
// animation.setDelayPerUnit(0.1);
//设置动画播放完成是否保持在第一帧,true为保持在第一帧,false为保持在最后一帧
//animation.setRestoreOriginalFrame(false);
this._logo.runAction(cc.RepeatForever.create(cc.Animate.create(animation)));

下面是几个主要功能的教程

用cocos2d-html5做的消除类游戏《英雄爱消除》——概述

用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

用cocos2d-html5做的消除类游戏《英雄爱消除》(4)——游戏结束

ps:概述中有完整源码链接

用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单的更多相关文章

  1. 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

    游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...

  2. 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

    Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...

  3. 用cocos2d-html5做的消除类游戏《英雄爱消除》——概述

    在bbs.html5china.com论坛学习了MV和老马的小熊蘑菇后我也自己模仿他们做了这样子一个游戏,权当技术交流学习,现在附上游戏截图和源码. 游戏截图: 1.系统菜单界面: 2.游戏界面 3. ...

  4. 用cocos2d-html5做的消除类游戏《英雄爱消除》(4)——游戏结束

    游戏结束界面: 在前面几个教程中,这个界面的创作所需要的知识点基本我们都讲过了,这里就说下用户数据的缓存吧,也是先来看下源码 /** * Power by html5中文网(html5china.co ...

  5. 消除类游戏(js版)

    最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 ...

  6. ccf题库中2015年12月2号消除类游戏

    题目如下: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这 ...

  7. CCF2015122消除类游戏(C语言版)

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  8. ccf消除类游戏

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  9. CCF CSP 201512-2 消除类游戏

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...

随机推荐

  1. 用二十秒记住几个PHP基础知识点

    数组: 索引数组:数组的键是整数的数组,从0開始. 关联数组:数组的键是字符串的数组 //索引数组 $arr=array('I','love','you'); //关联数组 $arr0=array(' ...

  2. 转载(Asp.net Core 中试使用ZKWeb.System.Drawing)

    完美 原文Link: https://www.yanning.wang/archives/644.html 记录下做备份. 很少用Linux服务器. 这下可给整的够呛, 特别是按照官网竟然还不行, 所 ...

  3. Repeater绑定List泛型对象

    后台: public void BindData()        {            List<WeiBo> DataList = new List<WeiBo>(); ...

  4. 工作总结 页面通过ajax 动态绑定 列表页面 列表每一项的事件 事件触发多次

    遇到一个问题 困惑了两天  页面的事件不知道为什么触发多次 试了各种办法 对比了之前的页面 各种测试 不是js css 外部链接 重复加载问题  也不是嵌套的 div 问题 各种都试过 最终发现 是 ...

  5. 动态添加ImageView 设置setPadding不起作用问题

    imageView = new ImageView(NavigationActivity.this); imageView.setLayoutParams(new LayoutParams(12,12 ...

  6. zabbix自动发现监控远程端口

    zabbix监控远程服务器端口,simple checks是zabbix用来监控无agent的主机 脚本和模板地址: https://github.com/mikeluwen/tcpmonitor

  7. Hibernate二次学习一----------Hibernate简单搭建

    因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...

  8. URL重写:Rewirte模块原理详解

    Apache+PHP+MySQL Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_ ...

  9. 初始化map和list的两种写法

    第一种方法(常用方法): //初始化List List list = new ArrayList(); list.add("string1"); list.add("st ...

  10. mapreduce中reduce中的迭代器只能调用一次。其实迭代器就只能调用一次

    亲测,只能调用一次,如果想想在一次reduce重复使用迭代器中的数据,得先取出来放在list中然后在从list中取出来!!多次读取reduce函数中迭代器的数据 public static void ...