关闭

cocos2dx 精灵的碰撞检测和消灭(3)

标签: cocos2d-x
17694人阅读 评论(0) 收藏 举报
分类:

在上一篇的基础上增加了一点内容,必要的注释都写在代码里了,,就直接贴代码吧,我也懒得写详细的过程。

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
}

运行结果截图:


1
4

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1197915次
    • 积分:12295
    • 等级:
    • 排名:第1231名
    • 原创:169篇
    • 转载:153篇
    • 译文:4篇
    • 评论:111条