0
HelloWorld::~HelloWorld()
    {
        if (_targets) {
            _targets->release();
            _targets = NULL;
        }

        if (_projectiles) {
            _projectiles->release();
            _projectiles = NULL;
        }
    }

    HelloWorld::HelloWorld():_targets(NULL),_projectiles(NULL),_projectilesDestroyed(0)
    {

    }

    CCScene* HelloWorld::scene()
    {
        CCScene *scene = NULL;
        do{
            scene = CCScene::create();
            CC_BREAK_IF(!scene);

            HelloWorld *layer = HelloWorld::create();
            CC_BREAK_IF(!layer);

            scene->addChild(layer);
        } while (0);

        return scene;
    }

    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        bool bRet = false;
        do {
            CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)));

            CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback));
            CC_BREAK_IF(! pCloseItem);

            pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
            CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
            pMenu->setPosition(CCPointZero);

            this->addChild(pMenu, 1);

            CCSize winSize = CCDirector::sharedDirector()->getWinSize();
            CCSprite *player = CCSprite::create("Player.png", CCRectMake(0, 0, 27, 40));
            player->setPosition(ccp(player->getContentSize().width/2, winSize.height/2));
            this->addChild(player);
            this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);
            this->setTouchEnabled(true);
            this->registerWithTouchDispatcher();
            _targets = new CCArray;
            _projectiles = new CCArray;

            this->schedule(schedule_selector(HelloWorld::updateGame) );
            CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true);


            bRet = true;
        } while (0);

        return bRet;
    }

    void HelloWorld::menuCloseCallback(CCObject* pSender)
    {
        CCDirector::sharedDirector()->end();
    }

    void HelloWorld::addTarget()
    {
        CCSprite *target = CCSprite::create("Target.png", CCRectMake(0, 0, 27, 40));
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        float minY = target->getContentSize().height/2;
        float maxY = winSize.height - target->getContentSize().height/2;
        int reangeY = (int)(maxY - minY);
        int actualY = (rand() % reangeY) + (int)minY;

        target->setPosition(ccp(winSize.width + (target->getContentSize().width/2), actualY));
        this->addChild(target);

        int minDuration = (int)2.0;
        int maxDuration = (int)4.0;
        int rangeDuration = maxDuration - minDuration;

        int actualDuration = ( rand() % rangeDuration) + minDuration;

        CCFiniteTimeAction *actionMove = CCMoveTo::create((float)actualDuration, ccp(0 - target->getContentSize().width/2, actualY));
        CCFiniteTimeAction* actionMoveDone =
        CCCallFuncN::create( this,
                                      callfuncN_selector(HelloWorld::spriteMoveFinished));
        target->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));

        target->setTag(1);
        _targets->addObject(target);
    }

    void HelloWorld::spriteMoveFinished(CCNode* sender)
    {
        CCSprite *sprite = (CCSprite *)sender;
        this->removeChild(sprite, true);

        if (sprite ->getTag() == 1) {
            _targets->removeObject(sprite);

            GameOVerScene *gameOverScene = GameOVerScene::create();
            gameOverScene->getLayer()->getLabel()->setString("You Lose :[");
            CCDirector::sharedDirector()->replaceScene(gameOverScene);
        }
        else if (sprite->getTag() == 2)
        {
            _projectiles->removeObject(sprite);
        }
    }

    void HelloWorld::gameLogic(float dt)
    {
        this->addTarget();
    }

    void HelloWorld::ccTouchesEnedd(CCSet* touches, CCEvent* event)
    {
        CCTouch *touch = (CCTouch*)(touches->anyObject());
        CCPoint location = touch->getLocationInView();

        location = CCDirector::sharedDirector()->convertToGL(location);
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        CCSprite *projectile = CCSprite::create("Target.png", CCRectMake(0, 0, 20, 20));

        projectile->setPosition(ccp(20, winSize.height/2));

        float offX = location.x - projectile->getPosition().x;
        float offY = location.y - projectile->getPosition().y;

        if (offX <= 0) {
            return;
        }

        this->addChild(projectile);
        float realX = winSize.width + (projectile->getContentSize().width/2);
        float ratio = offY / offX;
        float realY = (realX *ratio) + projectile->getPosition().y;

        CCPoint realDest = ccp(realX, realY);

        float offRealX = realX - projectile->getPosition().x;
        float offRealY = realY - projectile->getPosition().y;
        float length = sqrtf((offRealX * offRealX) + (offRealY * offRealY));
        float velocity = 480/1;
        float realMoveDuration = length/velocity;

        projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, realDest), CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished))));
        projectile->setTag(2);
        _projectiles->addObject(projectile);

        CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
    }

    void HelloWorld::updateGame(float dt)
    {
        CCArray *projectilesToDelegate = new CCArray;
        CCObject *arrayItem;
        CCARRAY_FOREACH(_projectiles, arrayItem){
            CCSprite *projectile = (CCSprite *)arrayItem;
            CCRect projectileRect = CCRectMake(projectile->getPosition().x - (projectile->getContentSize().width/2), projectile->getPosition().y - (projectile->getContentSize().height/2), projectile->getContentSize().width, projectile->getContentSize().height);

            CCArray *targetsToDelete = new CCArray;

            CCARRAY_FOREACH(_targets, arrayItem){
                CCSprite *target = (CCSprite *)arrayItem;
                CCRect targetRect = CCRectMake(target->getPosition().x - (target->getContentSize().width/2), target->getPosition().y - (target->getContentSize().height/2), target->getContentSize().width, target->getContentSize().height);

                CCRect rect = CCRect(projectileRect);
                if (rect.intersectsRect(targetRect)) {
                    targetsToDelete->addObject(target);
                }
            }

            CCARRAY_FOREACH(targetsToDelete, arrayItem){
                CCSprite *target = (CCSprite *)arrayItem;
                this->removeChild(target, true);

                _projectilesDestroyed++;
                if (_projectilesDestroyed >= 5) {
                    GameOVerScene *gameOverScene = GameOVerScene::create();
                    gameOverScene->getLayer()->getLabel()->setString("You Win!");
                    CCDirector::sharedDirector()->replaceScene(gameOverScene);
                }
            }

            if (targetsToDelete->count() > 0) {
                projectilesToDelegate->addObject(projectile);
            }
            targetsToDelete->release();
        }

        CCARRAY_FOREACH(projectilesToDelegate, arrayItem){
            CCSprite* projectile = (CCSprite *)arrayItem;
            _projectiles->removeObject(projectile);
            this->removeChild(projectile, true);
        }

        projectilesToDelegate->release();
    }

    void HelloWorld::registerWithTouchDispatcher()
    {
        CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0);
    }

这些代码是一个射击游戏。我发现当我点击模拟器的屏幕时,没有调用touchesEnded?为什么 ?我是 cocos2d-x 的初学者。请帮帮我。谢谢你。

4

0 回答 0