标签:
一个例子就够了,单击文本标签,执行动画。我也是小白,写这个demo的时候遇到了问题,单击文本标签游戏就死掉了。今天为了解决这个问题也是一晚没睡,到学习群里问大神,经过大神的指点解决了问题。原来是Animation和Animate的生命周期的关系。先记下。
1 bool HelloWorld::init() 2 { 3 ////////////////////////////// 4 // 1. super init first 5 if ( !Layer::init() ) 6 { 7 return false; 8 } 9 10 SpriteFrameCache *cache = SpriteFrameCache::getInstance(); 11 cache->addSpriteFramesWithFile("a6.plist"); 12 13 Vector<SpriteFrame*> vec; 14 char name[15]; 15 memset(name, 0, 15); 16 17 for (int i = 1; i <=7; i++){ 18 sprintf(name, "a6_%02d.png", i); 19 vec.pushBack(cache->getSpriteFrameByName(name)); 20 } 21 22 Animation *animation = Animation::createWithSpriteFrames(vec, 0.1f, 1); 23 24 Animate *animate = Animate::create(animation); 25 26 auto sprite = Sprite::create(); 27 addChild(sprite); 28 sprite->setPosition(Vec2(200, 200)); 29 //sprite->runAction(RepeatForever::create(animate)); 30 31 auto label = LabelTTF::create("Touch", "Courier", 30); 32 label->setPosition(Vec2(500, 500)); 33 addChild(label); 34 35 int i = 10; 36 37 EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); 38 listener->onTouchBegan = [=](Touch *t, Event *e){ 39 if (label->getBoundingBox().containsPoint(t->getLocation())){ 40 //notification: pay attention to the life cycle of Animation and Animate 41 Animation *animation = Animation::createWithSpriteFrames(vec, 0.1f, 1); 42 Animate *animate = Animate::create(animation); 43 sprite->runAction(animate); 44 log("i=%d", i); 45 return true; 46 } 47 return false; 48 }; 49 //notifation:here is "this" not "label" because if here is "label", Touch *t equals to "label" 50 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this); 51 return true; 52 }
运行效果:
需要源码和素材的请留邮箱。
标签:
原文地址:http://www.cnblogs.com/rainmer/p/4694143.html