序言

通过一个阶段的cocos2d-iphone的学习,对Objective-C(以下简称oc)做到基本了解,也有一个游戏小demo。但在摸索的过程中,发现这门语言稍让人感觉不爽的是oc里实例变量的绑定,除此之外oc基本上是一门比较优雅的语言。试水已经告捷,考虑到市面上大多采用cocos2d-x,还有cocostudio这一套的东西,应该是时候投入该框架的学习。

本文参考

http://www.raywenderlich.com/33752/cocos2d-x-tutorial-for-ios-and-android-space-game

我这里不同的是在windows环境下编译win32项目,使用vc2010+cocos2d-x2.2.2开发,然后动手术加载一个飞船。

加载精灵

准备工作

首先需要把精灵对应的资源文件,也就是图片ccz和plist文件,这里是Sprites.plist和Sprites.pvr.ccz 然后创建出一个HelloWorld项目,然后进入vc2010后,双击HelloWorldScene.h进入加一个精灵。 可以看到有pvr.ccz文件,这是texturepacker产生的文件,这个先了解一下,就目前来说,只要知道是pvr.ccz是打包后的图片资源就可以了。 然后把资源拷贝到Resources文件夹里去,如果项目里没有,可以右键,新建筛选器,然后制定其名字为Resources。 (但是在项目管理器里无法看到,如何添加?TODO)

添加代码

在头文件中添加

HelloWorldScene.h
1
2
3
private:
	cocos2d::CCSpriteBatchNode * _batchNode;
	cocos2d::CCSprite * _ship;

为什么需要2行代码?因为一个是批渲染对象,用来涵盖全部用到的资源,以及对应的区块坐标关系(补一句:具体的坐标可以通过用vim等文本编辑器查看plist文件得知,当然更专业的方式是采用接下来会提到的texturepacker这个工具直接查看和编辑);另外一个是实际我们需要的精灵。

然后切换到源文件HelloWorldScene.cpp在init方法中添加如下代码:

HelloWorldScene.cpp
1
2
3
4
5
6
7
8
9
_batchNode = CCSpriteBatchNode::create("Sprites.pvr.ccz");
this->addChild(_batchNode);
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Sprites.plist");

_ship = CCSprite::createWithSpriteFrameName("SpaceFlier_sm_1.png");
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
_ship->setPosition(ccp(winSize.width * 0.1, winSize.height * 0.5));
_batchNode->addChild(_ship, 1);
return true;

简单的分析

按流程分析下吧,内存稍微提一下。 首先是获得一个CCSpriteBatchNode的批节点的指针,这一步其实已经把资源加载到了内存中了。 addChild把批节点加载到了类所指代的CCLayer层,需要注意this指针,在oc里就是self,指向的类是HelloWorld,继承自CCLayer。 接着,确定帧和帧缓冲的关系,通过用addSpriteFramesWithFile函数读取plist文件来实现。 然后调用CCSprite::createWithSpriteFrameName方法,通过阅读其方法的源代码,其实是在CCSpriteFrameCache中寻找FrameName,如果找到了就返回那个CCSprite,而在实际上精灵已经加载到了内存中了,方法的最后返回CCSprite指针,就是飞船精灵了。 只差一步,就可以显示飞船了,使用getWinSize获取屏幕分辨率。然后用setPosition设置飞船精灵的位置,最后用批节点的addChild把它显示出来,后面的参数1代表的是Z深度,数字越大显示在遮挡关系的越上部分。

编译看结果

可以看到,除了cocos2d-x默认GUI一个椰子头背景和右下角的关闭按钮之外,画面上还多了一艘太空飞船,目的达成。下篇学习如何移动和发射子弹。

Alt text

参考阅读

http://www.cocos2d-x.org/wiki/Chapter2-_How_to_Add_a_sprite

发表评论