目的:用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 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);//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 instance
bool 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
}
运行结果如下: