在上一篇的基础上增加了一点内容,必要的注释都写在代码里了,,就直接贴代码吧,我也懒得写详细的过程。
HelloWorldSence.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
using namespace cocos2d;
class HelloWorld : public cocos2d::CCLayerColor
{
public:
// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
virtual bool init();
// there's no 'id' in cpp, so we recommend to return the class instance pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// preprocessor macro for "static create()" constructor ( node() deprecated )
CREATE_FUNC(HelloWorld);
void addTarget();
void spriteMoveFinished(CCNode *sender);
void gameLogic(cocos2d::CCTime dt);
void ccTouchesEnded(CCSet *touches, CCEvent *event);
CCArray *aarayTarget;//敌人
CCArray *arrayProjectile;//飞镖
void update(CCTime dt);
};
#endif // __HELLOWORLD_SCENE_H__
HelloWorldScence.cpp
#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 ( CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)) )
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();//获取屏幕大小
arrayProjectile = CCArray::create();
aarayTarget = CCArray::create();
float sprite_scale = 2.0;
CCSprite *Player = CCSprite::create("Player.png");
Player->setScale(sprite_scale);
Player->setPosition(ccp(Player->getContentSize().width*sprite_scale/2.0, winSize.height/2.0));
this->addChild(Player);
aarayTarget->retain();
arrayProjectile->retain();
this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
this->schedule(schedule_selector(HelloWorld::update));
this->setTouchEnabled(true);
return true;
}
else{
return false;
}
}
void HelloWorld::gameLogic(cocos2d::CCTime dt){
this->addTarget();
}
void HelloWorld::addTarget(){
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *target = CCSprite::create("Target.png");
//随机位置
int minY = target->getContentSize().height/2.0;
int maxY = winSize.height - target->getContentSize().height/2.0;
int rangeY = maxY - minY;
int actualY = rand()%rangeY + minY;
target->setPosition(ccp(winSize.width - target->getContentSize().width/2.0, actualY));
target->setTag(1);
this->addChild(target);
aarayTarget->addObject(target);
//随机速度
float minDuration = 2.0;
float maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
float actualDuration = rand()%rangeDuration + minDuration;
CCFiniteTimeAction *actionMove = CCMoveTo::create(actualDuration, ccp(0 - target->getContentSize().width/2.0, actualY));//0代表屏幕外,这句表示在3秒内从初始位置移动到屏幕外
//增加一个回调函数,回收移动到屏幕外的精灵
CCFiniteTimeAction *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished));
target->runAction(CCSequence::create(actionMove,actionMoveDone,NULL));
}
void HelloWorld::spriteMoveFinished(cocos2d::CCNode *sender){
CCSprite *sprite = (CCSprite *)sender;
// this->removeChild(sprite, true);
if (sprite->getTag() == 1) {
aarayTarget->removeObject(sprite);//清除敌人
}else if(sprite->getTag() == 2){
arrayProjectile->removeObject(sprite);//清除飞镖
}
}
//发射飞镖
void HelloWorld::ccTouchesEnded(cocos2d::CCSet *touches, cocos2d::CCEvent *event){
CCTouch *touch = (CCTouch *)touches->anyObject();
CCPoint location = touch->getLocationInView();
location = this->convertTouchToNodeSpace(touch);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *projectile = CCSprite::create("Projectile.png");
projectile->setPosition(ccp(20, winSize.height/2));
float offX = location.x - projectile->getPositionX();
float offY = location.y - projectile->getPositionY();
if (offX <= 0) {
return;
}
projectile->setTag(2);
this->addChild(projectile);
arrayProjectile->addObject(projectile);
float angle = offY/offX;
float realX= winSize.width + projectile->getContentSize().width/2;
float realY = realX * angle + projectile->getPositionY();
CCPoint finalPosition = ccp(realX, realY);
//获取飞镖飞行时间
float length = sqrtf(realX *realX + realY*realY);
float velocity = 480;
float realMoveDuration = length/velocity;
projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, finalPosition),CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)),NULL));
}
//碰撞检测,消除飞镖和敌人
void HelloWorld::update(cocos2d::CCTime dt){
for (int i = 0; i < aarayTarget->count(); i++) {
CCSprite *target = (CCSprite *)aarayTarget->objectAtIndex(i);
for (int j = 0; j < arrayProjectile->count(); j++) {
CCSprite *projectile = (CCSprite *)arrayProjectile->objectAtIndex(j);
if (target->boundingBox().intersectsRect(projectile->boundingBox())) {
aarayTarget->removeObjectAtIndex(i);
arrayProjectile->removeObjectAtIndex(j);
this->removeChild(target);
this->removeChild(projectile);
break;
}
}
}
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
运行结果截图: