(一)Cocos2d-JS制作一个微信报名宣传页——基本设置

发表于2015-08-21
评论0 1.6k浏览

前言

Cocos 2014秋季开发者大会,微信报名页面上线后,大家一片惊呼声,都觉得Cocos2d-JS非常适合这种报名页和宣传页面的制作,可以以一个比较简单、快速的形式,构建出我们需要的漂亮页面。下面我们就来介绍一下,Cocos 2014秋季开发者大会的微信报名页面,是如何实现的。在这篇教程里,我会教大家如何用Cocos2d-JS来实现一个微信宣传页面,最终结果如下几个页面。

1414042829174295.png 1414042837242704.png

1414042848732882.png  1414042853432121.png  1414042869482468.png

需求分析

五个界面基本上就是整个宣传页的全部内容,通过滑动这几个页面可以看出,我们要实现这个页面,大致需要完成下面几项内容:

  • 实现上述五个页面的切换。

  • 实现5个页面的入场和出场动画。

  • 添加背景音乐

  • 屏幕适配

  • 添加微信分享的API


接下来,我们一项一项给大家介绍,完整的代码可以在这里进行下载:register.zip


开发环境与新建项目

如果没用过Cocos2d-JS的朋友们,可以到cocos官网上去下载,此处我们用的是3.0final,或者,我们可以下载Lite版本的Cocos2d-JS,lite版本可以很方便的根据需求去下载所需要的模块,可以很大的减少代码的体积,下载地址?此处,我们需要用到的模块有core?actions?menuprogress-timer,在该页面中选择Customized Version然后勾选上述几个模块,并点击下载。

此处我们使用cocos 命令行来创建新的工程

1
2
3
4
$cd cocos2d-js/tools/cocos2d-console/bin
$./cocos new weChat -l js --no-native
$cd weChat/
$../cocos run -p web

环境搭建并不是这篇文章的重点,更详细的信息可以参考:《搭建 Cocos2d-JS 开发环境》。


主界面及其页面切换框架的实现

程序的入口代码在main.js中,用编辑器打开并修改为下面的代码。

1
2
3
4
5
6
7
8
9
cc.game.onStart = function () {
    cc.view.adjustViewPort(true);
    cc.view.enableAutoFullScreen(false);
    var mode = cc.sys.isMobile && window.navigator.userAgent.indexOf("MicroMessenger") != -1 ? cc.ResolutionPolicy.FIXED_HEIGHT : cc.sys.isMobile ? cc.ResolutionPolicy.FIXED_WIDTH : cc.ResolutionPolicy.SHOW_ALL;
    cc.view.setDesignResolutionSize(640, 831, mode);
    //load resources
    cc.LoaderScene.preload(g_resources, function () {
    cc.director.runScene(new MainScene());
    }, this);};cc.game.run();

关键点解析如下:

  • 设置浏览器meta来适配屏幕,引擎内部会根据屏幕大小来设置meta的viewport值,会达到更好的屏幕适配效果。

  • 针对手机浏览器和PC浏览器启用不同的分辨率适配策略。

  • 预加载图片声音等资源。 cc.LoaderScene.preload会生成一个“加载中 x%”的界面,等待资源加载结束后,调用第二个参数传入的匿名函数。 对于基于html的游戏,页面是放在服务器端供浏览器下载的,为了获得流畅的用户体验,cc.LoaderScene.preload让浏览器先把远程服务器的资源缓存到本地。需要预加载的资源定义在src/Resources.js文件中。

  • 启动游戏的第一个场景。


主界面分为2个部分,第一个部分是不随着屏幕移动而移动的向上箭头和音乐按钮,第二个部分是根据用户滑动屏幕而改变的场景。

我们先根据需要,构建出需要的函数,并一一实现他,这里我们使用cc.Scene.extend()来扩展出一个scene,并在这个scene中构建出我们需要功能,并一一实现他。

由引擎提供的cc.Scene.extend方法,让js能实现高级面向对象语言的继承特性。 onEnter方法是场景初始化完成即将展示的消息回调,在onEnter中必须调用this._super();来确保Scene被正确的初始化。

  • 用于初始化UI的函数 initUI()

  • 用于初始化touch事件的函数 initTouch()。

  • 用于切换页面的函数changePage()和记录当前页面的参数currentIndex

  • 用于控制箭头显示隐藏的函数toggleArrow()

  • 用于控制音乐按钮回调的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var MainScene = cc.Scene.extend({
    listener: null,
    accelListener: null,
    currentIndex: 0,
    sceneList: [],
    ctor: function () {
        this._super();
        cc.spriteFrameCache.addSpriteFrames(res.firstPage_plist);
    },
    onEnter: function () {
        this._super();
        this.initUI();
        this.addTouch();
    },
    initUI: function () {
    },
    toggleMusicCallback: function (sender) {
    },
    togleArrow: function (status) {
    },
    addTouch: function () {
    },
    changePage: function (index, next) {
    }
});

接下来我们一一来实现。


首先,我们来实现音乐按钮与箭头,我们在initUI()中添加如下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var bg = new cc.Sprite(res.background_png);
bg.anchorX = 0;
bg.anchorY = 0;
bg.scaleX = cc.winSize.width / bg.width;
bg.scaleY = cc.winSize.height / bg.height;
this.addChild(bg, 0);
this.arrow = new cc.Sprite("#arrow.png");
this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50)));
var posY = this.arrow.y;
var arrowAction = cc.repeatForever(cc.sequence(cc.spawn(cc.moveTo(0.8, cc.p(this.arrow.x, posY + 30)).easing(cc.easeIn(0.5)), cc.fadeOut(1)), cc.delayTime(0.8), cc.callFunc(function () {
    this.arrow.y = this.arrow.y - 30;
    this.arrow.opacity = 255;
}, this)));
this.arrow.runAction(arrowAction);
this.addChild(this.arrow, 1);
this.menuItemToggle = new cc.MenuItemToggle(new cc.MenuItemImage("#music.png"), new cc.MenuItemImage("#music_sel.png"), this.toggleMusicCallback, this);
this.menuItemToggle.setPosition(cc.pAdd(cc.visibleRect.right, cc.p(-this.menuItemToggle.width / 2 - 30, 140)));
var togglemenu = new cc.Menu(this.menuItemToggle);
togglemenu.anchorX = 0;
togglemenu.anchorY = 0;
togglemenu.x = 0;
togglemenu.y = 0;
this.addChild(togglemenu, 1);


我们在屏幕中,添加了一个背景的sprite,并且,将这个背景进行缩放,以让其在各种情况下都布满屏幕,并且我们为箭头设置了一系列动画,让其能够循环播放,Cocos2d-JS,为了方便广大开发者,提供了丰富多彩的动画(actions)。下面,我们先简单的介绍一下几个常用的action的API。

  • cc.repeatForever(action) 无限循环某个action

  • cc.sequence(action1,action2,...)顺序执行括号里面的action

  • cc.spawn(action1,action2,...)同时执行括号里面的action

  • cc.moveTo(duration,targetPoint)从当前位置在duration(秒)时间内移动到点targetPosition的action

  • cc.easeIn(rate) 以rate为ease参数执行easeIn的action,一般是这样使用的action.easing(cc.easeIn(rate))

  • fadeOut(duration) 在duration时间内从屏幕淡出的action

  • cc.delayTime(duration) 延时duration时间的action,通常用于等待一段时间后再播放某个action

  • cc.callFunc(function) 用于执行action的回调,通常在某个action结束后需要执行某段函数的话,可以使用它。

通过上述的简单介绍,是不是对action有了一个初步的了解了呢,我们实际来操作一下:

我们需要一个箭头,往上走并慢慢减速和透明,最终消失,然后在原来的位置出现重复下去,所以我们可以归纳为,移动+淡出-->回到初始位置-->移动+淡出。这样我们很清晰就归纳出如何去写这个action了,我们使用cc.spawn(cc.moveTo(),cc.fadeOut())就构建出了移动+淡出这个效果,然后使用cc.callFunc()设置了这次action播放完毕要修改的位置回到初始位置,接着我们使用cc.sequence()来顺序执行这两个action,这样一来,一次action就编写完成了,最后我们只需要将这个action使用cc.repeatForever()就完成了我们需要的重复播放。

细心的读者可能会问了,代码中的位置设置,为什么是cc.pAdd(cc.visibleRect.right,cc.p())?这是cocos为了让大家更方便的做屏幕适配所定义的9个点,这9个点会根据不同屏幕大小来动态设定,例如cc.visibleRect.center,这个点的位置,无论在什么分辨率的屏幕下,都是在屏幕的正中央,这样我们就可以根据这个点的位置来做相对布局,已达到适配屏幕的目的,例如上面的代码this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50)));就是将arrow这个sprite,放在屏幕的底部的正中央,然后再在y轴上加50个像素,这样,无论屏幕的大小,都能保持在屏幕的底部的正中央向上50个像素。这也是我们做相对布局的基础。后续的布局,我们都会根据这些点的坐标来设置。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引