棋牌游戏之 触摸滑动-选牌(和欢乐斗地主效果一样)
来源:互联网 发布:淘宝客如何赚佣金 编辑:程序博客网 时间:2024/04/28 05:10
<1>成员变量
public: CCPoint _touchBegan; CCPoint _touchMoved; CCPoint _touchEnd; virtual void onEnter(); virtual void onExit(); virtual bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent); virtual void ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent); virtual void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent);private: CCArray* _card; void checkSelCard(CCPoint beganPoint, CCPoint endPoint, bool isBegan = false); //正向选牌 void checkSelCardEnd(); //选牌结束 void checkSelCardReserve(CCPoint touchBegan, CCPoint touchMoved); //处理逆向选牌
<2>实现方法
bool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } _card = CCArray::create(); CC_SAFE_RETAIN(_card); CCSize size = CCDirector::sharedDirector()->getWinSize(); float dur = PaiJianJu; //牌的间距 int num = 17; //牌的数量 const float cardWidth = 144; //牌的宽高 float beganX = size.width/2 - num/2 * dur - (cardWidth - dur)/2; float beganY = 0; CCPoint beganPoint = ccp(beganX, beganY); //第一张牌的起始位置 for(int i = 0; i < num; i++) { CCSprite* card = CCSprite::create("Icon-144.png"); CCLog("====%f", card->getContentSize().width); card->setAnchorPoint(CCPointZero); card->setPosition(ccpAdd(beganPoint, ccp(i * dur, 0))); addChild(card); _card->addObject(card); } return true;}void HelloWorld::checkSelCard(CCPoint beganPoint, CCPoint endPoint, bool isBegan /*=false*/){ CCObject* obj = NULL; if(isBegan) { CCARRAY_FOREACH_REVERSE(_card, obj) { CCSprite* card = dynamic_cast<CCSprite*>(obj); if(card->boundingBox().containsPoint(beganPoint)) { card->setColor(ccc3(150, 150, 150)); card->setTag(1); return; } } } else { float x, y, w, h; x = MIN(beganPoint.x, endPoint.x); y = MIN(beganPoint.y, endPoint.y); w = MAX(1, fabsf(beganPoint.x - endPoint.x)); h = MAX(1, fabsf(beganPoint.y - endPoint.y)); CCRect touchRect = CCRectMake(x, y, w, h); CCARRAY_FOREACH_REVERSE(_card, obj) { CCSprite* card = dynamic_cast<CCSprite*>(obj); if(card->boundingBox().intersectsRect(touchRect)) { card->setColor(ccc3(150, 150, 150)); //变暗 card->setTag(1); return; } } }}void HelloWorld::checkSelCardReserve(CCPoint touchBegan, CCPoint touchMoved){ CCPoint p1 = touchBegan.x < touchMoved.x ? touchBegan : touchMoved; float width = fabsf(touchBegan.x - touchMoved.x); float height = fabsf(touchBegan.y - touchMoved.y) > 5 ? fabsf(touchBegan.y - touchMoved.y) : 5; CCRect rect = CCRectMake(p1.x, p1.y, width, height); CCObject* obj = NULL; CCARRAY_FOREACH_REVERSE(_card, obj) { CCSprite* card = dynamic_cast<CCSprite*>(obj); if(!card->boundingBox().intersectsRect(rect)) { card->setColor(ccc3(255, 255, 255)); // card->setTag(0); } } CCARRAY_FOREACH(_card, obj) { CCSprite* card = dynamic_cast<CCSprite*>(obj); if(p1.x - card->getPositionX() >= PaiJianJu) { card->setColor(ccc3(255, 255, 255)); // card->setTag(0); } }}void HelloWorld::checkSelCardEnd(){ CCObject* obj = NULL; CCARRAY_FOREACH_REVERSE(_card, obj) { CCSprite* card = dynamic_cast<CCSprite*>(obj); if(card->getPositionY() == 0 && card->getTag() == 1) card->setPosition(ccp(card->getPositionX(), card->getPositionY() + 35)); else if(card->getPositionY() > 0 && card->getTag() == 1) card->setPosition(ccp(card->getPositionX(), card->getPositionY() - 35)); card->setColor(ccc3(255, 255, 255)); //变亮 card->setTag(0); }}void HelloWorld::onEnter(){ CCLayer::onEnter(); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -125, true);}void HelloWorld::onExit(){ CCLayer::onExit(); CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}bool HelloWorld::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){ _touchBegan = convertTouchToNodeSpace(pTouch); checkSelCard(_touchBegan, _touchBegan, true); return true;}void HelloWorld::ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent){ _touchMoved = convertTouchToNodeSpace(pTouch); checkSelCard(_touchMoved, _touchMoved); checkSelCardReserve(_touchBegan, _touchMoved);}void HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent){ _touchEnd = convertTouchToNodeSpace(pTouch); checkSelCardEnd();}
<3>截图.
总结:可见牌的滑动是不能单张注册触摸的,其实想一下就应该知道不能这么干,因为你是要拖动出来一个矩形区域,从而根据矩形区域来判断应该选中的牌的.如果单张注册了触摸,那么是得不到这个矩形区域的,况且牌位于GameLayer之上,它会首先处理掉触摸事件.
0 0
- 棋牌游戏之 触摸滑动-选牌(和欢乐斗地主效果一样)
- 棋牌斗地主游戏开发
- 棋牌游戏开发之斗地主算法点选牌
- 棋牌游戏开发之斗地主算法点选牌
- 棋牌游戏开发之斗地主算法点选牌
- java——棋牌类游戏斗地主(webddz1.0)之二
- IOS游戏辅助--QQ欢乐斗地主记牌器的实现
- 欢乐斗地主玩法规则
- 棋牌AI思路--斗地主
- 【JJ斗地主官网下载】在线斗地主比赛赢大奖,中文棋牌游戏
- QQ欢乐斗地主的心得体会
- 《QQ欢乐斗地主》山寨版
- 九度题目1363:欢乐斗地主
- 玩欢乐斗地主后的启发
- HTML5版QQ游戏大厅将携欢乐斗地主亮相
- Testin实验室发布中国安卓游戏指数(8月报):欢乐斗地主夺冠
- 来玩欢乐斗地主!纸牌游戏例子的ObserverPattern----观察者模式
- 斗地主游戏源码
- 给定一个文本,求文本中包含某个字符串的句子,并按照句子中包含字符串的个数输出该句子
- 的繁华的风格的风格
- Android之system_server与zygote之作用
- MTD驱动代码--有关mtd设备读写标志的分析
- HDU 2894 DeBruijin 兹鼓欧拉回路
- 棋牌游戏之 触摸滑动-选牌(和欢乐斗地主效果一样)
- LLVM (8) 11.7 回顾和未来方向
- 圆与未旋转矩形的碰撞检测(上篇)
- 鼠标从一个元素四周哪边进入 定位的子元素跟着从这边进来 离开也是一样的(强推荐)
- python中初始化一个数组用来存储多张图片
- android 中自定义Dialog的位置和大小的方法
- xmanager的使用
- poj 2142 The Balance
- Undefined symbols for architecture armv7s: