Cocos 2 D-X学習ノート4 action動作


何も言わないで、直接コードを見てみましょう.
GameLayer.h
#pragma once
#include "cocos2d.h"
USING_NS_CC;
class GameLayer : public CCLayer
{
private:
void createOneFish();
void createFishTick(float dt);
void turnFishBack(CCObject *sender);
void movefinish(CCObject *sender);
void bulletMovefinish(CCObject *sender);
void scaleDone(CCObject * sender);

protected:
void ccTouchesEnded(CCSet * pTouch,CCEvent * pEvent);

public:
GameLayer(void);
~GameLayer(void);
bool init();
static GameLayer* create();
static CCScene* scene();
};

GameLayer.cpp
#include "GameLayer.h"
#include<stdlib.h>
GameLayer::GameLayer(void)
{
}
GameLayer::~GameLayer(void)
{
}


bool GameLayer::init()
{
if(!CCLayer::init())
{
return false;
}

//      
setTouchEnabled(true);

//      
CCSprite *sprite = CCSprite::create("game.png");
sprite->setAnchorPoint(ccp(0,0));
sprite->setPosition(ccp(0,0));
addChild(sprite);

createOneFish();
//          
schedule(schedule_selector(GameLayer::createFishTick),1.0f);

return true;
}


void GameLayer::createFishTick(float dt)
{
createOneFish();
}
void GameLayer::createOneFish()
{
CCSprite *fish = CCSprite::create("fish.png");
//          
float x = 400 + rand()%80;
float y = 20  + rand()%300;
fish->setPosition(ccp(x,y));
//        
float scale = 1 + rand()%5;
fish->setScale(1/scale);
addChild(fish);

//  
float t = 1 + rand()%3;
CCMoveTo *move = CCMoveTo::create(t,ccp(200,y));

//  
float t2 = 2 + rand()%2;
CCJumpTo *jump = CCJumpTo::create(t2,ccp(50,y),50,1);

//  
CCMoveTo *move3 = CCMoveTo::create(t,ccp(400,y));

//X    
CCCallFuncO* turnBack = CCCallFuncO::create(this,callfuncO_selector(GameLayer::turnFishBack),fish);
//   
CCCallFuncO* movefish = CCCallFuncO::create(this,callfuncO_selector(GameLayer::movefinish),fish);
//      
CCFiniteTimeAction *allActions = CCSequence::create(move,jump,turnBack,move3,movefish,NULL);
fish->runAction(allActions);
}


void GameLayer::turnFishBack(CCObject *sender)
{
CCSprite *sprite = (CCSprite *)sender;
sprite->setFlipX(true);
}


void GameLayer::movefinish(CCObject *sender)
{
CCSprite *sprite = (CCSprite *)sender;
sprite->removeFromParentAndCleanup(true);
}

//      ,   CCLayer
void GameLayer::ccTouchesEnded(CCSet * pTouch,CCEvent * pEvent)
{
CCLog("touch");
CCTouch *oneTouch = (CCTouch *)pTouch->anyObject();
CCPoint glPoint   = oneTouch->getLocation();
CCPoint layerPoint = convertToNodeSpace(glPoint);

//  
CCSprite * bulletsprite = CCSprite::create("bullet.png");
bulletsprite->setPosition(ccp(20,-20));
bulletsprite->setScale(1/1.6);
addChild(bulletsprite);

//      
bulletsprite->setRotation(20);

//    
CCMoveTo *move = CCMoveTo::create(0.5,layerPoint);
CCCallFuncO *bulletFinish = CCCallFuncO::create(this,callfuncO_selector(GameLayer::bulletMovefinish),bulletsprite);
CCFiniteTimeAction *allAction = CCSequence::create(move,bulletFinish,NULL);
bulletsprite->runAction(allAction);
}


void GameLayer::bulletMovefinish(CCObject *sender)
{
CCLog("bulletMovefinish");
CCSprite * sprite = (CCSprite *)sender;
CCPoint current = sprite->getPosition();

//   
CCSprite *netsprite = CCSprite::create("wang.png");
netsprite->setPosition(current);
netsprite->setScale(0.8);
addChild(netsprite);

//       
CCScaleTo * scale1 = CCScaleTo::create(0.5,0.6);
CCScaleTo * scale2 = CCScaleTo::create(0.5,0.2);
CCScaleTo * scale3 = CCScaleTo::create(0.5,0.6);
CCScaleTo * scale4 = CCScaleTo::create(0.5,0.7);
CCScaleTo * scale5 = CCScaleTo::create(0.5,0.0);

//    
CCCallFuncO* scaleDone = CCCallFuncO::create(this,callfuncO_selector(GameLayer::scaleDone),netsprite);


CCFiniteTimeAction *allaction = CCSequence::create(scale1,scale2,scale3,scale4,scale5,scaleDone,NULL);
netsprite->runAction(allaction);


sprite->removeFromParentAndCleanup(true);
}


void GameLayer::scaleDone(CCObject * sender)
{
CCSprite *netsprite = (CCSprite *)sender;
CCPoint p = netsprite->getPosition();


CCSprite *boom = CCSprite::create("boom.png");
boom->setPosition(p);
addChild(boom);

//      
CCScaleTo * scale = CCScaleTo::create(0.5,0.6);
CCDelayTime * dt = CCDelayTime::create(1.0f);
CCScaleTo * scale2 = CCScaleTo::create(0.5,0.0);
CCFiniteTimeAction *allaction = CCSequence::create(scale,dt,scale2,NULL);
boom->runAction(allaction);

netsprite->removeFromParentAndCleanup(true);
}

GameLayer * GameLayer::create()
{
GameLayer *layer = new GameLayer();
layer->init();
layer->autorelease();
return layer;
}

CCScene * GameLayer::scene()
{
GameLayer * layer = GameLayer::create();
CCScene * s = CCScene::create();
s->addChild(layer);
return s;
}