这章基本都是代码,如果要源码的朋友。请及时联系我。
QQ:1663888959
邮箱:1663888959@qq.com
CCAction核心类
做一个类似与类似cocos2d中的运动小Demo
创建一个程序。命名为CCActionInterval
删除HelloWorld.h和.cpp文件
新建一个类CCActionIntervalDemo
在CCActionIntervalDemo.h
声明下面方法和变量
在init()方法中添加如下代码
//创建三个按钮
CCSize size =CCDirector::sharedDirector()->getWinSize();
CCMenuItemImage *leftItem = CCMenuItemImage::create("b1.png","b2.png", this, menu_selector(CCActionIntervalDemo::onClick));
leftItem->setTag(1);
CCMenuItemImage *rightItem = CCMenuItemImage::create("r1.png","r2.png", this, menu_selector(CCActionIntervalDemo::onClick));
rightItem->setTag(2);
CCMenuItemImage *playItem = CCMenuItemImage::create("f1.png","f2.png", this, menu_selector(CCActionIntervalDemo::onClick));
playItem->setTag(3);
CCMenu *menu =CCMenu::create(leftItem, rightItem, playItem, NULL);
//定义位置
menu->setPosition(ccp(size.width / 2,size.height / 5));
//定义排列顺序
menu->alignItemsHorizontally(); //水平排列
this->addChild(menu);
//添加两个精灵
sprite =CCSprite::create("gg.png");
sprite->setPosition(ccp(0, 0));
point = sprite->getPosition();
this->addChild(sprite);
sprite2 = CCSprite::create("kk.png");
sprite2->setPosition(ccp(size.width / 2, size.height / 2));
point = sprite2->getPosition();
this->addChild(sprite2);
//创建label
titlelabel = CCLabelTTF::create("动作","AppleGothic", 20);
titlelabel->setPosition(ccp(size.width /2, size.height - 50));
this->addChild(titlelabel);
array_Actions = CCArray::create();
array_Titles = CCArray::create();
array_Actions->retain();
array_Titles->retain();//这里必须retain 因为是autorelease
下面是精灵各个动作的代码,基本都很类似,代码都是封装好的,只需要我们稍加理解就可以熟悉他们的使用了。下面是代码,在这里我就不详细讲了。
以后结合项目代码在给大家详细讲解。
//移动
CCMoveTo *moveTo = CCMoveTo::create(1, ccp(size.width- 20, size.height / 2));
// sprite->runAction(moveTo);
CCDelayTime *time = CCDelayTime::create(3);
CCMoveBy *moveBy = CCMoveBy::create(1, ccp(-size.width+ 100, size.height/ 2 - 50));
// sprite->runAction(moveBy);
CCString *move = CCString::create("moveTo/moveBy");
array_Titles->addObject(move);
//组合动作
CCSequence *sequence = CCSequence::create(moveTo,time, moveBy, NULL);
//sprite->runAction(sequence);
array_Actions->addObject(sequence);
CCRotateTo *rotateTo = CCRotateTo::create(1,720);
CCRotateBy *rotateBy = CCRotateBy::create(1,360);
CCSequence *rotateSequence = CCSequence::create(rotateTo,rotateBy, NULL);
CCString *rotate = CCString::create("rotateTo/rotateBy");
array_Titles->addObject(rotate);
array_Actions->addObject(rotateSequence);
//缩放
CCScaleTo *scaleTo = CCScaleTo::create(1, 0.5);
CCScaleBy *scaleBy = CCScaleBy::create(1, 2);
CCSequence *scaleSequence = CCSequence::create(scaleTo,scaleBy, NULL);
CCString *scale = CCString::create("scaleTo/scaleBy");
array_Titles->addObject(scale);
array_Actions->addObject(scaleSequence);
//跳跃
CCJumpTo *jumpTo = CCJumpTo::create(2, ccp(size.width/ 2, size.height), 20, 5);
CCJumpBy *jumpBy = CCJumpBy::create(2, ccp(0 ,- size.height/ 2), 20, 5);
CCSequence *jumpSequence = CCSequence::create(jumpTo,jumpBy,NULL);
CCString *jump = CCString::create("jump");
array_Actions->addObject(jumpSequence);
array_Titles->addObject(jump);
//reverse()函数 相反的动作 To没有反动作
CCString *reverse = CCString::create("reverse翻动作");
CCActionInterval *reverseAction =scaleBy->reverse();
array_Titles->addObject(reverse);
array_Actions->addObject(reverseAction);
//闪烁动作
CCString *blinkStr = CCString::create("Blink");
CCBlink *blink = CCBlink::create(1, 10000);
array_Actions->addObject(blink);
array_Titles->addObject(blinkStr);
//贝塞尔曲线动作
CCString *bezierStr = CCString::create("贝塞尔曲线");
ccBezierConfig bezierConfig;
bezierConfig.controlPoint_1 = ccp(320, 320);
bezierConfig.controlPoint_2 = ccp(400, 0);
bezierConfig.endPosition = ccp(480, 160);
CCBezierTo *bezierTo = CCBezierTo::create(1,bezierConfig);
array_Actions->addObject(bezierTo);
array_Titles->addObject(bezierStr);
//CCsquence动作组合 同时的动作
CCString *sqawnStr = CCString::create("同时的动作");
CCSpawn *sqawn = CCSpawn::create(moveTo,blink, NULL);
array_Titles->addObject(sqawnStr);
array_Actions->addObject(sqawn);
//有限次数的重复动作
CCString *repeatStr = CCString::create("Repeat");
CCRepeat *repeat = CCRepeat::create(CCRotateBy::create(1,60), 6);
array_Titles->addObject(repeatStr);
array_Actions->addObject(repeat);
//无限重复动作
CCString *ForeverStr = CCString::create("RepeatForever");
CCRepeatForever *repeatForever = CCRepeatForever::create(blink);
array_Actions->addObject(repeatForever);
array_Titles->addObject(ForeverStr);
//改变动作的执行目标
CCString *Target = CCString::create("Target");
CCMoveTo *to = CCMoveTo::create(1, ccp(480,160));
CCTargetedAction* targetAction = CCTargetedAction::create(sprite2,to);
CCSequence *TargetSequence = CCSequence::create(to,targetAction, NULL);
array_Titles->addObject(Target);
array_Actions->addObject(TargetSequence);
void CCActionIntervalDemo::onClick(CCObject *sender)
{
static int index;
//下次点击时,结束上一次动画
sprite->stopAllActions();
sprite->setPosition(point); //让精灵回到初始位置
sprite->setRotation(0); //会到原来旋转角度
sprite->setScale(1);//回到初始大小
sprite2->setPosition(ccp(0, 0));
CCMenuItemImage *item = (CCMenuItemImage *)sender;
int tag = item->getTag();
switch (tag) {
case 1:
{
if (--index < 0) {
index = array_Actions->count() - 1;
}
}
break;
case 2:
break;
case 3:
{
if (++index >= array_Actions->count())
{
index = 0;
}
}
break;
}
CCString *str = (CCString *)array_Titles->objectAtIndex(index);
titlelabel->setString(str->getCString());
CCAction *action = (CCAction *)array_Actions->objectAtIndex(index);
sprite->runAction(action);
}
CCActionIntervalDemo::~CCActionIntervalDemo()
{
array_Titles->release();
array_Actions->release();
}