Cocos2dx制作2048(2.数字方块的创建)

前端之家收集整理的这篇文章主要介绍了Cocos2dx制作2048(2.数字方块的创建)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们今天来完成数字方块的创建以及把方块添加到主场景中,完成4行4列矩阵方块的添加

1.数字方块的创建
1.1新增方块精灵
我们在Classes目录上右键添加新建项,如下图
注意,点击浏览,统一把代码放到Classes目录下,
一次添加文件
如图
1.2分析游戏,编写方块精灵头文件
第一步:首先我们的数字方块其实就是一个一个的精灵,总共是4X4=16个精灵,所以我们的SquareSprite类是继承与CCSprite的
#ifndef_SQUARE_SPRITE_H_
#define_SQUARE_SPRITE_H_
#include"cocos2d.h"
usingnamespacecocos2d;
classSquareSprite:publicCCSprite
{
public:
SquareSprite();
private:
};
#endif//!_SQUARE_SPRITE_H_
第二步:创建的方块需要多大?方块需要摆放在什么位置上?16个方块都是在不同位置的,然后,方块显示的数字是多少?
分析得出,我们需要定义几个变量和方块创建的方法
变量:m_number(方块中的数字)
m_lablenumber(显示数字的标签
m_layercolor(带颜色的层,用于显示方块)
形参:pointx(方块的X轴)
pointy(方块的Y轴)
width(方块的宽度)
height(方块的高度)
方法:createSquareSprite(创建方块精灵的方法
initSquareSprite(初始化方块精灵的方法
getNumber(获得方块中数字)setNumber
staticSquareSprite*createSquareSprite(intnumber,floatpointx,floatpointy,intwidth,intheight);
intgetNumber();
voidsetNumber(intnumber);
CREATE_FUNC(SquareSprite);
intm_number;
CCLabelTTF*m_lablenumber;
CCLayerColor*m_layercolor;
voidinitSquareSprite(intnumber,Simsun; font-size:14px; line-height:30px">1.3编写方块精灵的实现
一个个来实现
第一:实现构造函数,初始化成员变量
#include"SquareSprite.h"
SquareSprite::SquareSprite()
:m_number(0)
,m_lablenumber(NULL)
}
第二
:实现创建方块精灵的函数(creteSquareSprite)
我们可以在基类CCSprite中找到create源码,复制一份,在改成如下:
SquareSprite*SquareSprite::createSquareSprite(intnumber,intheight)
SquareSprite*pSprite=newSquareSprite();
if(pSprite&&pSprite->init())
pSprite->autorelease();
returnpSprite;
CC_SAFE_DELETE(pSprite);
returnNULL;
第三:实现getNumber和setNumber
intSquareSprite::getNumber()
returnm_number;
voidSquareSprite::setNumber(intnumber)
m_number=number;
m_lablenumber->setString("");
if(m_number>0)
{
m_lablenumber->setString(CCString::createWithFormat("%i",m_number)->getCString());
}
第四
:实现initSquareSprite
voidSquareSprite::initSquareSprite(intnumber,Simsun; font-size:14px; line-height:30px"> m_layercolor=CCLayerColor::create(ccc4(200,190,180,255),width,height);
m_layercolor->setPosition(ccp(pointx,pointy));
this->addChild(m_layercolor);
//创建字体
m_lablenumber=CCLabelTTF::create("","arial.ttf",50);
m_lablenumber->setColor(ccc3(0,0));
m_lablenumber->setPosition(ccp(m_layercolor->getContentSize().width/2,m_layercolor->getContentSize().height/2));
m_layercolor->addChild(m_lablenumber);
setNumber(number);
第五:修改createSquareSprite和HelloWorldScene中的init
测试创建的精灵
此时createSquareSprite代码如下:
if(pSprite&&pSprite->init())
pSprite->autorelease();
pSprite->initSquareSprite(number,pointx,pointy,Simsun; font-size:14px; line-height:30px"> returnpSprite;
CC_SAFE_DELETE(pSprite);
returnNULL;
HelloWorld:Scene.cpp中的init如下:
boolHelloWorld::init()
//////////////////////////////
//1.superinitfirst
if(!CCLayer::init())
returnfalse;
CCSizevisibleSize=CCDirector::sharedDirector()->getVisibleSize();
CCPointorigin=CCDirector::sharedDirector()->getVisibleOrigin();
SquareSprite*pSquareSprite=SquareSprite::createSquareSprite(2,50,100,100);
this->addChild(pSquareSprite);
returntrue;
运行看看效果:
还不错,呵呵
我们再来优化优化方块,不同的字体显示不同的颜色
第六:修改setNumber,优化方块颜色
m_layercolor->setColor(ccc3(200,180));
//设置卡片颜色
switch(m_number)
case2:
m_layercolor->setColor(ccc3(255,245,238));
break;
case32:
case4:
case8:
m_layercolor->setColor(ccc3(244,164,96));
case16:
case64:
m_layercolor->setColor(ccc3(250,128,114));
case128:
case256:
m_layercolor->setColor(ccc3(240,230,140));
case512:
case1024:
case2048:
case4096:
case8192:
m_layercolor->setColor(ccc3(188,143,143));
case16384:
m_layercolor->setColor(ccc3(205,92,92));
default:
现在我们改下number的值看看效果
嗯,最终修改完成后,我们的方块代码文件如下:
文件
添加方块到主场景
2.1修改整个窗体的大小,让它更像手机竖屏
main.cpp中的这么一句
eglView->setFrameSize(320,480);
设置FPS隐藏,AppDelagate.cpp中
pDirector->setDisplayStats(false);
有点像了哼
2.2新增方法用来初始化4X4矩阵
首先我们根据下图来分析一下,因为我们的方块得根据手机屏幕来自适应的,所以不能像测试一样给定死咯
我们的窗体是320宽度,其中每个方块之间的间隔是10,故而,我们得出计算方块的算法是什么呢??
很简单:(窗体的宽度-5*间隔)/4
大小计算出来了,然后双重循环遍历,创建方块
在创建的时候,还记得我们有什么参数吗??
现在我们缺少的参数有,方块位置的起点
怎么破呢??
这里需要注意,我们用了Layer作为精灵,CCLayer的锚点不是0.5了而是0即左下角
起点X的算法:
空隙+方块的横向下标*方块的宽度+方块的横向下标*空隙
不理解??上图
起点Y的算法:这个其实和X是一样的,这里最下面一片的这个间隔可以自己调,这个不能居中,因为最后我们还得在顶部增加用了显示总分数的
//on"init"youneedtoinitializeyourinstance
initMatrix(visibleSize);
voidHelloWorld::initMatrix(CCSizesize)
//两个方块之间的空隙
intspace=10;
intSquareSize=(size.width-space*5)/4;
for(intx=0;x<4;x++)
for(inty=0;y<4;y++)
floatpointx=space+x*SquareSize+x*space;
floatpointy=40+y*SquareSize+y*space;
SquareSprite*pSquareSprite=SquareSprite::createSquareSprite(0,SquareSize,SquareSize);
当然,你如果觉得太挤了也可以改成这样:
//2*20 最左边和最右边的空隙
intSquareSize=(size.width-space*3-2*20)/4;
floatpointx=20+x*SquareSize+x*space;
2.3定义数组用了存储每个方块
//二维数组存储方块
SquareSprite*m_squarearray[4][4];
m_squarearray[x][y]=pSquareSprite;
2.4创建随机产生方块的方法(其实就是随机产生数字而已)
//刚开始游戏,创建两个方块
autoSquare();
voidHelloWorld::autoSquare()
intx=CCRANDOM_0_1()*4;
inty=CCRANDOM_0_1()*4;
if(m_squarearray[x][y]->getNumber()>0)
else
m_squarearray[x][y]->setNumber(2);
2.5搞点背景色
//搞点背景
CCLayerColor*layerColorBG=CCLayerColor::create(ccc4(180,170,255));
this->addChild(layerColorBG,0);
最后代码就不传了,反正也没用到任何资源,就直接贴出来算了
SquareSprite.h
SquareSprite.cpp
HelloWorldScene.h
#ifndef__HELLOWORLD_SCENE_H__
#define__HELLOWORLD_SCENE_H__
#include"SimpleAudioEngine.h"
usingnamespaceCocosDenshion;
classHelloWorld:publiccocos2d::CCLayer
HelloWorld();
//Here'sadifference.Method'init'incocos2d-xreturnsbool,insteadofreturning'id'incocos2d-iphone
virtualboolinit();
//there'sno'id'incpp,sowerecommendreturningtheclassinstancepointer
staticcocos2d::CCScene*scene();
//implementthe"staticnode()"methodmanually
CREATE_FUNC(HelloWorld);
virtualvoidonEnter();
virtualboolccTouchBegan(CCTouch*pTouch,CCEvent*pEvent);
virtualvoidccTouchEnded(CCTouch*pTouch,Simsun; font-size:14px; line-height:30px"> //上下左右滑动时调用
booldoTop();
booldoDown();
booldoReight();
booldoLeft();
//初始化矩阵
voidinitMatrix(CCSizesize);
//随机产生方块
voidautoSquare();
//启点的X坐标,Y坐标
//起点到终点X的距离,Y的距离
intm_StartX,m_StartY,m_RangeX,m_RangeY;
//二维数组存储方块
#endif//__HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include"HelloWorldScene.h"
USING_NS_CC;
HelloWorld::HelloWorld()
:m_StartX(0)

CCScene*HelloWorld::scene()
//'scene'isanautoreleaSEObject
CCScene*scene=CCScene::create();
//'layer'isanautoreleaSEObject
HelloWorld*layer=HelloWorld::create();
//addlayerasachildtoscene
scene->addChild(layer);
//returnthescene
returnscene;
//搞点背景
this->addChild(pSquareSprite,1);
voidHelloWorld::onEnter()
CCLayer::onEnter();
this->setTouchMode(kCCTouchesOneByOne);
this->setTouchEnabled(true);
boolHelloWorld::ccTouchBegan(CCTouch*pTouch,CCEvent*pEvent)
m_StartX=pTouch->getLocation().x;
m_StartY=pTouch->getLocation().y;
voidHelloWorld::ccTouchEnded(CCTouch*pTouch,Simsun; font-size:14px; line-height:30px"> CCPointpoint= pTouch->getLocation();
m_RangeX=m_StartX-point.x;
m_RangeY=m_StartY-point.y;
if(abs(m_RangeX)>abs(m_RangeY))
//X大于Y 左右移动
if(m_RangeX>5)
//正数 向左
doLeft();
elseif(m_RangeX<-5)
//负数 向右
doReight();
//否则 上下移动
if(m_RangeY>5)
//正数 向下
doDown();
elseif(m_RangeY<-5)
//负数 向上
doTop();
boolHelloWorld::doTop()
CCLOG("doTopRuning");
boolHelloWorld::doDown()
CCLOG("doDownRuning");
boolHelloWorld::doReight()
CCLOG("doReightRuning");
boolHelloWorld::doLeft()
CCLOG("doLeftRuning");
OK,今天先到这来,写的有点多,其实内容不多,说的比较细而已,
最起码,我认为,认真看完就完全能理解变为自己的东西,就算没有此博文,自己也能写出来代码,这才是硬道理
而不像其他的博文,看完还是不理解,云里雾里的,不看着博文写自己完全无从下手
下一篇就开始写游戏的逻辑了,反正偶觉得这个游戏逻辑不是一般的复杂啊,
上次写了两个下午,最后因为JNI问题,移植了2小时,往Android上一安装,测试一下,居然还有BUG
这次写这个系列的博客,也是为了把自己的思路理一理



FROM:http://www.58player.com/blog-2537-90021.html

猜你在找的Cocos2d-x相关文章