cocos2d-x之道~制作第⼀款⽂字游戏(⼀)
前⾔
回想去年,也是在三、四⽉时开发出⾃⼰的第⼀款游戏,正是这款游戏,令我决定踏上独⽴开发者之路。⼀年过去了,第⼀款游戏达到它应有的盈利⽔平。然⽽这款游戏开发后的时间⾥,都没再取得另⼀款令⾃⼰满意的作品。直到今年的三、四⽉,我使⽤cocos2d-x开发出我的第⼀款⽂字游戏。
⾃从使⽤cocos2d-x后,发现⾃⼰爱上了这个引擎。它或许还不够强⼤和完善,但是使⽤它,可以体验编码的乐趣,还可以为我重拾C++这门技术(到底对C++有多么的执着啊),还能增进NDK和JNI的学习。恰恰满⾜我各种各样的追求。
这个第⼀款⽂字游戏,名字我取作Anagram Puzzle,其实这款游戏是参照RayWenderlich上的这篇来改写的,教程⾥使⽤的是iOS的UIKit编写,虽说原理相通,但是在改写过程中还是遇到不少折腾的地⽅。由于初次编写cocos2d-x游戏,所以错误难免百出,希望阅读者们⾼抬贵⼿,点到即⽌……废话不多说,马上开始coco2d-x之道~如何制作第⼀款⽂字游戏!小学家长会班主任发言
Anagram简介
Anagram是⼀种把单词或短语的字母顺序打乱,重新排列后变成⼀个新单词或短语的游戏。例如,单词c
inema可以重新排列成iceman。游戏中就要求玩家进⾏你所提供单词或短语的重新排列。完成游戏的画⾯会如图所⽰:
在开发这个游戏过程中,会接触到以下这些知识:
MVC型的游戏结构
如何从⽂件配置加载级别
加载第三⽅字体
简单使⽤⾳乐⾳效
分离HUD层与游戏层
⼿势拖动及动画
Particle的效果
还有其他的⼀些cocos2d-x的基础知识,都会在开发过程中接触到。当你孤单你会想起谁 歌词
初始化⼯程
⾸先最重要的当然是使⽤命令⾏来创建cocos2d-x⼯程,当然也有其他⽅法也可以创建⼯程,但是我
认为掌握命令⾏来创建是必须的基本功。创建⽅法可以在到。创建完成后各个平台的⼯程⽂件夹都有了。我们的主要⼯程⽂件夹是proj.android和proj.ios两个。整个开发过程,我使⽤Mac OS来开发,所以编码是在XCode上进⾏,⽽Android⼯程的编译则使⽤命令⾏,详细教程可以参考。
建⽴好⼯程后,先把所需的拷贝到Resource⽂件夹中。打开Xcode⼯程,⽬前Resource⽂件夹下还是原来的资源⽂件,通过右击Resource⽂件夹 -> Add Files to ...,把资源⽂件都加到⼯程⾥。编辑后⼯程会如图
1)加载级别配置⽂件
打开level1.plist,可以看到⾥⾯内容
有三个最顶端的key,分别是:
pointsPerTile: 每个单词填对后获得的分数。
timeToSolve: 解决这⼀关的时间(秒)。
anagrams: 是题⽬的列表,包含两个item,分别是原始的短语以及最后要拼出的短语。
level⽂件的介绍就到此为⽌,下⾯开始编写Level类,在Level.h中添加以下内容
class Level:public CCObject{
public:
static Level * levelWithNum(int levelNum);
public:
int mPointPerTile;
int mTimeToSovle;
CCArray * pAnagrams;
};
其中,三个变量对应level⽂件⾥的三个最顶端的item。还有⼀个初始化函数,是给外部调⽤初始化level⽂件。现在,打开Level.cpp,实现levelWithNum函数
Level * Level::levelWithNum(int levelNum){
char fileName[50];
char fullPath[150];
sprintf(fileName,"level%d.plist",levelNum);
CCFileUtils::sharedFileUtils()->fullPathFromRelativeFile(fileName,fullPath);
CCDictionary * pListDict = CCDictionary::createWithContentsOfFile(fileName);
if(pListDict == NULL){
CCLog("level config not found");
}
Level * l = new Level();
CCString * tempStr;
tempStr = dynamic_cast<CCString*>(pListDict->objectForKey("pointsPerTile"));
l->mPointPerTile = tempStr->intValue();
tempStr = dynamic_cast<CCString*>(pListDict->objectForKey("timeToSolve"));
l->mTimeToSovle = tempStr->intValue();
l->pAnagrams = dynamic_cast<CCArray*>(pListDict->objectForKey("anagrams"));
美国VS威尔士比分预测
l->pAnagrams->retain();
return l;
}
这⾥⾸先⽤CCDictionary读出level⽂件中数值,然后就是读取出对应key⾥的值,并存储起来。
现在,打开主界⾯⽂件,默认是HelloWorldScene类,但是我改写成MainScene,其中MainScene.h是这样的
class MainScene : public cocos2d::CCLayer
{
public:
~MainScene();
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone    virtual bool init();
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene();
// implement the "static node()" method manually
CREATE_FUNC(MainScene);
private:
Level * pLevel;
};
可见,增加了Level变量。在MainScene.cpp中的init函数,编写
pLevel = Level::levelWithNum(1);
当然,这⾥可以通过CCLog来打印出pLevel⾥的内容来看看,会得到如图所⽰
在MainScene⾥添加个新的函数
void dealRandomAnagram();
具体实现要这样
void MainScene::dealRandomAnagram(){
Common::random(0, pLevel->pAnagrams->count() - 1);
int randomIndex =  Common::random(0, pLevel->pAnagrams->count() - 1);
CCAssert((randomIndex >= 0 && randomIndex < pLevel->pAnagrams->count()),"error random index!");
CCArray * anagram = (CCArray*)pLevel->pAnagrams->objectAtIndex(randomIndex);
CCString * ana1 = (CCString*)anagram->objectAtIndex(0);
CCString * ana2 = (CCString*)anagram->objectAtIndex(1);
int ana1len = ana1->length();
int ana2len = ana2->length();
}
Common::random是我⾃⼰编写的,⽣成两个数值之间的随机数
int Common::random(int s,int e){
float i = CCRANDOM_0_1()*(e-s+1)+s;
return (int)i;感恩遇见的简短句子
}
这样就把初始状态的短语和最终状态的短语获取到了,把dealRandomAnagram函数添加到MainScene的init函数⾥,
pLevel = Level::levelWithNum(1);
dealRandomAnagram();
2)创建单词的View
在⼯程中新增⼀个继承于CCNode的类,名字叫做TileView,在TileView.h中添加以下代码
public:
static TileView * initWithLetter(const char * l,float sideLen);
刘亦菲裸
private:
CCSprite * pSprite;
少数民族风俗
char mLetter;
bool mIsMatch;
其中initWithLetter是初始化函数,pSprite是显⽰的精灵,mLetter是对应的字母,mIsMatch表⽰结果是否已经配对上(就是到字母所应该在的位置)。
在TileView.cpp⾥,添加以下代码