我们今天来完成数字方块的创建以及把方块添加到主场景中,完成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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|