cocos2dx连连看
2014-01-16 17:05
344 查看
算法么,网上的基本上都看了下,
我也是新手来着,代码很乱,如果你写连连看遇到难处了,就下下来看看!
下下来的文件 一个资源文件一个 class 覆盖下自己的就可以了,记得把 class文件夹里的main.cpp 拷贝到win.32文件夹里去覆盖下 要不自己改成 800*480的分辨率也行!
上代码!
cpp文件
网盘下载地址
http://pan.baidu.com/s/1qWwHDcK
我也是新手来着,代码很乱,如果你写连连看遇到难处了,就下下来看看!
下下来的文件 一个资源文件一个 class 覆盖下自己的就可以了,记得把 class文件夹里的main.cpp 拷贝到win.32文件夹里去覆盖下 要不自己改成 800*480的分辨率也行!
上代码!
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_NS_CC; using namespace std; class HelloWorld : public cocos2d::CCLayer { public: HelloWorld(); ~HelloWorld(); virtual bool init(); static cocos2d::CCScene* scene(); void menuCloseCallback(CCObject* pSender); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); virtual void registerWithTouchDispatcher(); //初始化界面 bool initInterface(int bar,int num); void setPos(CCSprite* sprite); void callbackND(CCNode* sender, void* data); CREATE_FUNC(HelloWorld); //void showLine(CCScale9Sprite* lineSprite); //直接连接 bool match_direct(cocos2d::CCPoint a, cocos2d::CCPoint b); //一个转折点 bool match_one_corner(cocos2d::CCPoint a, cocos2d::CCPoint b); //两个转折点 bool match_two_corner(cocos2d::CCPoint a, cocos2d::CCPoint b); //连接判断 bool match(cocos2d::CCPoint a,cocos2d::CCPoint b); //是否为可见的点 bool isValiableNode(CCPoint a); //是否是空的点(没有精灵就是空的点) bool isEmptyNode(CCPoint a); private: CCPoint m_point1;//精灵的第一个点 CCPoint m_point2;//精灵的第二个点 CCPoint m_point3; int m_count;//计数 int m_array[18][10];//标记位置是否有精灵(0为没有精灵,1为有精灵) int m_tag1;//精灵标记1 int m_tag2;//精灵标记2 int m_tag3; list<CCSprite*> m_spriteList;//精灵列表 CCSprite* m_sprite1;//过渡精灵1 CCSprite* m_sprite2;//过渡精灵2 CCSprite* m_sprite3; CCSprite* m_frameSprite;//框框精灵 bool m_oneLine;//一条直接连接 bool m_twoLine;//二条直线连接 bool m_threeLine;//三条直线连接 CCPoint m_crisis1;//转折点1 CCPoint m_crisis2;//转折点2 }; #endif // __HELLOWORLD_SCENE_H__
cpp文件
#include "HelloWorldScene.h" HelloWorld::HelloWorld():m_point1(ccp(0,0)),m_point2(ccp(0,0)),m_count(0){ for (int i = 0;i < 18;i++) { for (int j = 0;j < 10;j++) { m_array[i][j] = 0; } } m_oneLine = false; m_twoLine = false; m_threeLine = false; } HelloWorld::~HelloWorld(){ } CCScene* HelloWorld::scene() { CCScene *scene = CCScene::create(); HelloWorld *layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } //随机种子 srand(time(NULL)); CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite* sprite = CCSprite::create("black.jpg"); sprite->setPosition(ccp(size.width/2,size.height/2)); addChild(sprite,-1); CCMenuItemImage *closeItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); closeItem->setAnchorPoint(ccp(1,1)); closeItem->setPosition(ccp(size.width,size.height)); CCMenu* pMenu = CCMenu::create(closeItem, NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu, 1); initInterface(1,20); this->setTouchEnabled(true); return true; } bool HelloWorld::initInterface(int bar,int num){ bool bRet = false; do { char str[20] ={0}; for (int i = 0;i < 90;i++) { int num = rand()%20; sprintf(str,"touxiang/%d.png",num); CCSprite* sprite = CCSprite::create(str); CCSprite* sprite1 = CCSprite::create(str); this->setPos(sprite); this->setPos(sprite1); sprite->setTag(num); sprite1->setTag(num); m_spriteList.push_back(sprite); m_spriteList.push_back(sprite1); addChild(sprite,1); addChild(sprite1,1); } m_frameSprite = CCSprite::create("frame.png"); addChild(m_frameSprite,1); m_frameSprite->setVisible(false); bRet = true; } while (0); return bRet; } void HelloWorld::setPos(CCSprite* sprite){ do { int x = rand()%18; int y = rand()%10; if (m_array[x][y] == 1) { continue; }else{ m_array[x][y] = 1; sprite->setPosition(ccp((x+1)*40+20,(y+1)*40 +20)); break; } } while (1); } void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){ CCPoint loction = pTouch->getLocationInView(); loction = CCDirector::sharedDirector()->convertToGL(loction); list<CCSprite*>::iterator it = m_spriteList.begin(); for (int i = 0;i < 180,it != m_spriteList.end();++i,++it) { if(*it){ if ((*it)->boundingBox().containsPoint(loction)) { m_count++; if (m_count==1) { m_tag1 = (*it)->getTag(); m_point1 = (*it)->getPosition(); m_sprite1 = *it; m_frameSprite->setPosition(m_point1); m_frameSprite->setVisible(true); }else if(m_count ==2){ m_point2 = (*it)->getPosition(); m_sprite2 = *it; m_tag2 = (*it)->getTag(); m_frameSprite->setPosition(m_point2); m_frameSprite->setVisible(true); }else{ m_tag3 = (*it)->getTag(); m_point3 = (*it)->getPosition(); m_sprite3 = *it; m_frameSprite->setPosition(m_point3); m_frameSprite->setVisible(true); m_point1 = m_point2; m_point2 = m_point3; m_tag1 = m_tag2; m_tag2 = m_tag3; m_sprite1 = m_sprite2; m_sprite2 = m_sprite3; } break; } } } ccColor4F cc; cc.a = 1.0f; cc.b = 1.0f; cc.g = 0.0f; cc.r = 0.0f; if(m_count >= 2 && !isEmptyNode(loction)){ if(m_tag1 == m_tag2 && match(m_point1,m_point2)){ if (m_oneLine == true) { CCDrawNode* lineOne = CCDrawNode::create(); lineOne->drawSegment(m_point1,m_point2,5.0f,cc); addChild(lineOne,11); CCCallFuncND * funcall= CCCallFuncND::create( this, callfuncND_selector(HelloWorld::callbackND) ,(void*)lineOne); CCSequence* seq = CCSequence::create(CCDelayTime::create(0.4f),funcall,NULL); lineOne->runAction(seq); m_oneLine = false; }else if (m_twoLine == true) { CCDrawNode* lineOne = CCDrawNode::create(); lineOne->drawSegment(m_point1,m_crisis1,5.0f,cc); lineOne->drawSegment(m_crisis1,m_point2,5.0f,cc); addChild(lineOne,11); CCCallFuncND * funcall= CCCallFuncND::create( this, callfuncND_selector(HelloWorld::callbackND) ,(void*)lineOne); CCSequence* seq = CCSequence::create(CCDelayTime::create(0.4f),funcall,NULL); lineOne->runAction(seq); m_twoLine = false; }else if(m_threeLine == true){ CCDrawNode* lineOne = CCDrawNode::create(); lineOne->drawSegment(m_point1,m_crisis2,5.0f,cc); lineOne->drawSegment(m_crisis2,m_crisis1,5.0f,cc); lineOne->drawSegment(m_crisis1,m_point2,5.0f,cc); addChild(lineOne,11); CCCallFuncND * funcall= CCCallFuncND::create( this, callfuncND_selector(HelloWorld::callbackND) ,(void*)lineOne); CCSequence* seq = CCSequence::create(CCDelayTime::create(0.4f),funcall,NULL); lineOne->runAction(seq); m_threeLine = false; } it = m_spriteList.begin(); for (;it != m_spriteList.end();++it) { if(*it == m_sprite1){ removeChild(m_sprite1,true); m_spriteList.erase(it); break; } } it = m_spriteList.begin(); for (;it != m_spriteList.end();++it) { if(*it == m_sprite2){ removeChild(m_sprite2,true); m_spriteList.erase(it); break; } } m_tag2 = -1; m_tag1 = -1; m_frameSprite->setVisible(false); } } } void HelloWorld::callbackND(CCNode* sender, void* data){ CCDrawNode* line = (CCDrawNode*)data; removeChild(line,true); } bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){ return true; } void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){} void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent){} void HelloWorld::registerWithTouchDispatcher(){ CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true); } //一直线 bool HelloWorld::match_direct(cocos2d::CCPoint a, cocos2d::CCPoint b) { if (a.x == b.x && a.y == b.y) { return false; } int i; bool match_x = false; if(a.x == b.x) { match_x = true; if(a.y > b.y) { if (a.y - 40 != b.y) { for (int i = a.y - 40 ; i >= b.y + 40; i -= 40) { CCPoint point = CCPointMake(a.x , i ); if(!this->isValiableNode(point) || !this->isEmptyNode(point)){ match_x = false; } } } } if(b.y > a.y) { if(b.y - 40 != a.y){ for (int i = b.y - 40; i >= a.y + 40; i -= 40) { CCPoint point = CCPointMake(b.x , i ); if(!this->isValiableNode(point) || !this->isEmptyNode(point)){ match_x = false; } } } } } bool match_y = false; if(a.y == b.y) { match_y = true; if(a.x > b.x) { if(a.x - 40 != b.x){ for(i = a.x - 40 ; i >= b.x + 40; i -= 40) { CCPoint point = CCPointMake(i , a.y ); if(!this->isValiableNode(point) || !this->isEmptyNode(point)) { match_y = false; } } } } if(b.x > a.x) { if(b.x -40 != a.x){ for(i = b.x - 40 ; i >= a.x + 40 ; i-=40) { CCPoint point = CCPointMake(i , b.y ); if(!this->isValiableNode(point) || !this->isEmptyNode(point)) { match_y = false; } } } } } return match_x || match_y; } //一个拐点的 bool HelloWorld::match_one_corner(cocos2d::CCPoint a, cocos2d::CCPoint b) { CCPoint point = CCPointMake(b.x, a.y); if( this->isValiableNode(point) && this->isEmptyNode(point) && this->match_direct(a, point) && this->match_direct(b, point)){ m_crisis1 = point; return true; } point = CCPointMake(a.x , b.y); if( this->isValiableNode(point) && this->isEmptyNode(point) && this->match_direct(a, point) && this->match_direct(b, point)){ m_crisis1 = point; return true; } return false; } //两个拐点的 bool HelloWorld::match_two_corner(cocos2d::CCPoint a, cocos2d::CCPoint b) { for(int i = a.x - 40; i >= 0; i -=40) { CCPoint point = CCPointMake(i , a.y); if (this->isValiableNode(point) && this->isEmptyNode(point)) { if (this->match_one_corner(point, b)) { m_crisis2 = point; return true; } } else { break; } } for(int i = a.x + 40 ; i < 800; i += 40) { CCPoint point = CCPointMake(i , a.y); if (this->isValiableNode(point) && this->isEmptyNode(point)) { if (this->match_one_corner(point, b)) { m_crisis2 = point; return true; } }else { break; } } for(int i = a.y - 40 ; i >= 0; i -= 40) { CCPoint point = CCPointMake(a.x ,i); if (this->isValiableNode(point) && this->isEmptyNode(point)) { if (this->match_one_corner(point, b)) { m_crisis2 = point; return true; } } else { break; } } for(int i = a.y + 40 ; i < 480; i+=40) { CCPoint point = CCPointMake(a.x ,i ); if (this->isValiableNode(point) && this->isEmptyNode(point)) { if (this->match_one_corner(point, b)) { m_crisis2 = point; return true; } } else { break; } } return false; } bool HelloWorld::match(cocos2d::CCPoint a,cocos2d::CCPoint b) { if (this->match_direct(a, b)) { m_oneLine = true; return true; } if (this->match_one_corner(a, b)) { m_twoLine = true; return true; } if (this->match_two_corner(a, b)) { m_threeLine = true; return true; } return false; } bool HelloWorld::isValiableNode(CCPoint a){ if (a.x > 800 || a.y > 480) { return false; } return true; } bool HelloWorld::isEmptyNode(CCPoint a){ list<CCSprite*>::iterator it = m_spriteList.begin(); for (int i = 0;i < 180,it != m_spriteList.end();++i,++it) { if(*it){ if ((*it)->boundingBox().containsPoint(a)) { return false; } } } return true; } void HelloWorld::menuCloseCallback(CCObject* pSender) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); #else CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif #endif }
网盘下载地址
http://pan.baidu.com/s/1qWwHDcK
相关文章推荐
- cocos2d-x 内存管理简单谈
- 【COCOS2DX-游戏开发之二七】 坐标系(上)
- [cocos2dx]COCOS2D-X 关于 fatal error C1083: 无法打开包括文件:“CCStdC.h” 的问题
- [cocos2dx]COCOS2D-X 关于 fatal error C1083: 无法打开包括文件:“CCStdC.h” 的问题
- cocos2d-x之闹钟篇
- [cocos2dx]地球人已经无法阻止人们学习cocos2dx了
- cocos2dx 命令创建各平台工程,并自动打包Android apk的方法
- cocos2d-x坐标系
- cocos2dx加快游戏速度
- 从零开始学习cocoStudio(2)--GUI学习
- cocos2d-x避免手动修改android.mk文件来编译
- Android和iOS中Cocos2dx的横屏竖屏设置
- 在 cocos2d-x 3.0 中中文显示为乱码的问题
- cocos2dx之弧度和角度的互换
- quick-cocos2d-x基于源码加密打包功能的更新策略(3)
- cocos2d-x中的碰撞检测
- Cocos2d-x 创建精灵的五种方法
- Win7下Cocos2d-x跨平台游戏开发-开发环境搭建
- cocos2dx之CCActionEase,CCEaseExponentialIn等变速Action
- 错误 1 error C2440:“类型转换”: 无法从“void (__thiscall GameLayer::* )(cocos2d::CCObject *)”转换为“cocos2d::SEL_C