CCTouch的单点触摸与精灵拖动(1)
来源:互联网 发布:qq群等级积分算法 编辑:程序博客网 时间:2024/04/29 03:31
目的:用CCTouch实现单点触摸和精灵拖拽
过程:1、在.h头文件中定义
CCSprite *selSprite; CCArray *movableSprite; bool ccTouchBegan(CCTouch *touch,CCEvent *event); void selectSpriteForTouch(CCPoint touchLocation);
2、.m文件中重写 init( ) 方法如下:
bool HelloWorld::init(){//////////////////////////////// 1. super init firstif ( !CCLayer::init() ){return false;}CCSprite *background = CCSprite::create("background.png");background->setAnchorPoint(CCPointZero);background->setPosition(CCPointZero);background->setScale(3);//背景图片放大3倍this->addChild(background);movableSprite = CCArray::create();CCSprite *Player = CCSprite::create("Player.png");CCSprite *Projectile = CCSprite::create("Projectile.png");CCSprite *Target = CCSprite::create("Target.png");movableSprite->addObject(Player);movableSprite->addObject(Projectile);movableSprite->addObject(Target);for (int i = 0; i < movableSprite->count(); i++) {CCSprite *sprite = (CCSprite *)movableSprite->objectAtIndex(i);sprite->setPosition(ccp(300 + 200*i, 300));sprite->setScale(2.0);this->addChild(sprite);}movableSprite->retain();CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);//Dont forget this!!!return true;}
3、实现头文件定义的两个方法
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){CCPoint touchLocation = this->convertTouchToNodeSpace(touch);this ->selectSpriteForTouch(touchLocation); return true;}void HelloWorld::selectSpriteForTouch(cocos2d::CCPoint touchLocation){CCSprite *newSprite = NULL;for (int i = 0; movableSprite->count(); i++) {CCSprite *sprite = (CCSprite *)movableSprite->objectAtIndex(i);if (sprite->boundingBox().containsPoint(touchLocation)) {newSprite = sprite;break;}}if (newSprite != selSprite) {if (selSprite != NULL) {selSprite->stopAllActions();}CCRotateBy *rotLeft = CCRotateBy::create(0.1, -50);CCRotateBy *center = CCRotateBy::create(0.1, 0);CCRotateBy *rotRight = CCRotateBy::create(0.1, 50);CCFiniteTimeAction *rotSeq = CCSequence::create(rotLeft,center,rotRight,center,NULL);newSprite->runAction(CCRepeatForever::create((CCActionInterval *)rotSeq));selSprite = newSprite;}}
运行结果如下:(单你点击精灵的时候精灵会在0.1秒内左右来回50角晃动)
note:该程序有一个bug,单你多次来回点击精灵的时候,,精灵晃动停止后会旋转一定的角度,,我也不知道为什么,刚学习有很多不懂,先留着,以后再回来看!
精灵拖动:
代码如下:
#include "HelloWorldScene.h"#include "SimpleAudioEngine.h"using namespace cocos2d;using namespace CocosDenshion;CCScene* HelloWorld::scene(){ // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSprite *background = CCSprite::create("background.png"); background->setAnchorPoint(CCPointZero); background->setPosition(CCPointZero); background->setScale(3);//背景图片放大3倍 this->addChild(background); movableSprite = CCArray::create(); CCSprite *Player = CCSprite::create("Player.png"); CCSprite *Projectile = CCSprite::create("Projectile.png"); CCSprite *Target = CCSprite::create("Target.png"); movableSprite->addObject(Player); movableSprite->addObject(Projectile); movableSprite->addObject(Target); for (int i = 0; i < movableSprite->count(); i++) { CCSprite *sprite = (CCSprite *)movableSprite->objectAtIndex(i); sprite->setPosition(ccp(300 + 200*i, 300)); sprite->setScale(2.0); this->addChild(sprite); } movableSprite->retain(); CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); return true;}bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ CCPoint touchLocation = this->convertTouchToNodeSpace(touch); this ->selectSpriteForTouch(touchLocation); return true;}void HelloWorld::ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ CCPoint touchLocation = this->convertTouchToNodeSpace(touch); CCPoint oldTouchLocation = touch->getPreviousLocationInView(); oldTouchLocation = CCDirector::sharedDirector()->convertToGL(oldTouchLocation);//转换成openGL的坐标 oldTouchLocation = this->convertToNodeSpace(oldTouchLocation);//转换成屏幕坐标 CCPoint tranlation = ccpSub(touchLocation, oldTouchLocation);//相对坐标(相对位移 ),计算两者之差 this->panForTranslation(tranlation);}void HelloWorld::panForTranslation(cocos2d::CCPoint translation){ CCPoint newPos = ccpAdd(selSprite->getPosition(), translation);//原有位置+相对位移 selSprite->setPosition(newPos);}void HelloWorld::selectSpriteForTouch(cocos2d::CCPoint touchLocation){ CCSprite *newSprite = NULL; for (int i = 0; movableSprite->count(); i++) { CCSprite *sprite = (CCSprite *)movableSprite->objectAtIndex(i); if (sprite->boundingBox().containsPoint(touchLocation)) { newSprite = sprite; break; } } if (newSprite != selSprite) { if (selSprite != NULL) { selSprite->stopAllActions(); } CCRotateBy *rotLeft = CCRotateBy::create(0.1, -50); CCRotateBy *center = CCRotateBy::create(0.1, 0); CCRotateBy *rotRight = CCRotateBy::create(0.1, 50); CCFiniteTimeAction *rotSeq = CCSequence::create(rotLeft,center,rotRight,center,NULL); newSprite->runAction(CCRepeatForever::create((CCActionInterval *)rotSeq)); selSprite = newSprite; }}void HelloWorld::menuCloseCallback(CCObject* pSender){ CCDirector::sharedDirector()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif}
运行结果如下:
- CCTouch的单点触摸与精灵拖动(1)
- cclayer的触摸处理(ccTouch)
- cclayer的触摸处理(ccTouch)
- CCTouch触摸事件
- Android游戏开发之单点触摸与多点触摸的响应方式(二十三)
- Android游戏开发之单点触摸与多点触摸的响应方式(二十三)
- 让精灵也响应cctouch
- 像素级的检测触摸点与精灵是否相交
- Android单点触摸与多点触摸
- Cocos2d-x 单点触摸--让精灵随手指移动起来
- [手势与触摸]创建可以拖动的视图
- 单点触摸和多点触摸的使用方法
- Cocos2d—X游戏开发之CCTouch屏幕触摸事件获取(九)
- 1.处理屏幕触摸(单点触摸)
- CCTouch
- 如何获取触摸精灵的版本号??
- 19.实现多点触摸画圆(拖动+检测手机多点触摸的点数+随机颜色)
- 5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬
- 子makefile怎么向总控makefile传递变量
- mysql的调整
- 对数组的数进行排序
- mysql导入导出问题
- MySQL my.cnf参数配置优化详解
- CCTouch的单点触摸与精灵拖动(1)
- JAXB--@XmlType注解标注xml生成顺序(四)
- XMPP协议的原理介绍
- JAXB注解
- mybatis-generator介绍
- php通过thrift开发hive
- java代码动态网布局里面添加控件
- java 线程池详解
- 数组数组你好