void FightingLayer::update(float dt) {
    
    _playDuration += dt;
    
    Rect rect = Rect(0, 0, _ground->getContentSize().width, _ground->getContentSize().height);
    // Update bullets
    for (std::vector<Bullet *>::size_type i = 0; i != _bullets->size(); i++) {
        Bullet *bullet = _bullets->at(i);
        bullet->update(dt);
        
        if (!rect.containsPoint(bullet->getPosition())) {
            bullet->kill();
            _bullets->erase(_bullets->begin() + i);
            i--;
            continue;
        }
        
        for (std::vector<Enemy *>::size_type j = 0; j != _enemies->size(); j++) {
            Enemy *enemy = _enemies->at(j);
            
            // Check if bullet hits
            if (enemy->getBoundingBox().containsPoint(bullet->getPosition())) {
                _score += 10;
                // Remove enemy
                //enemy->removeFromParent();
                enemy->kill();
                _enemies->erase(_enemies->begin() + j);
                j--;
                
                // REmove bullet
                bullet->kill();
                _bullets->erase(_bullets->begin() + i);
                i--;
                
                updateScore();
                
                break;
            }
        }
    }
    
    
    for (std::vector<Smoke *>::size_type i = 0; i != _smokes->size(); i++) {
        Smoke *smoke = _smokes->at(i);
        Point position = smoke->getPosition();
        if (position.x < 0) {
            position.x = 0;
            smoke->reverse();
        }
        else if (position.x > rect.size.width) {
            position.x = rect.size.width;
            smoke->reverse();
        }
    }
    
    
    for (std::vector<Enemy *>::size_type i = 0; i != _enemies->size(); i++) {
        Enemy *enemy = _enemies->at(i);
        
        // Check if outside
        bool isOutside = (enemy->getDirection() == -1 && enemy->getPosition().x < 0) || (enemy->getDirection() == 1 && enemy->getPosition().x > _ground->getContentSize().width);
        if (isOutside) {
            enemy->removeFromParent();
            _enemies->erase(_enemies->begin() + i);
            i--;
            continue;
        }
        
        // Check if hits player
        
        if (_player->getBoundingBox().intersectsRect(enemy->getBoundingBox()) && _player->isAlive()) {
            _player->kill();
            CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("die_sound.wav");
            this->gameDidEnd();
            break;
        }
    }
    if (_player->isAlive()) {
        Point playerPosition = _player->getPosition();
        if (playerPosition.x < _player->getContentSize().width) {
            playerPosition.x = _player->getContentSize().width;
            _player->setPosition(playerPosition);
        }
        else if (playerPosition.x > _ground->getContentSize().width -_player->getContentSize().width) {
            _player->setPositionX(_ground->getContentSize().width -_player->getContentSize().width);
        }
    }
}
示例#2
0
/**
 * Handles a numerous amount of collisions that happen in this game.
 * Will detect if the player is colliding with an enemy or a ,
 * or if an enemy is colliding with an enemy or bullet and then respond
 * appropriately
 */
void checkEntityCollision() {
    for(std::vector<Enemy*>::iterator iter  = enemies.begin(); iter != enemies.end(); ++iter) {
        Enemy * eni = *iter;

        // Check if bullets are colliding with enemies
        for(std::vector<Bullet*>::iterator checkAgainst = bullets.begin(); checkAgainst != bullets.end(); ++checkAgainst) {
            Bullet * b = *checkAgainst;
            if(eni->isColliding(*b)) {
                eni->damage(*b);
                b->damage(*eni);
                score += 50;
            }
        }
        
        // Check if player is colliding with enemies
        if(p.isColliding(*eni)) {
            Direction moveTo = eni->getDirection();
            p.move(moveTo);
            eni->move(eni->flipDirection(moveTo));
            p.damage(*eni);
            eni->damage(p);
            p.setBlinking(true);
            sf::SoundBuffer buffer;
            buffer.loadFromFile("hit.wav");

            sf::Sound sound;
            sound.setBuffer(buffer);
            sound.play();
        }

        // Check if sword is colliding with enemies
        Sword * s = p.getSword();
        if(s->swordColliding(*eni) && s->isSwung()) {
            Direction moveTo = eni->getDirection();

            eni->move(eni->flipDirection(moveTo), 200);
            s->damage(*eni);
            eni->damage(*s);
        }

        // Check if enemies are colliding with each other
        for(std::vector<Enemy*>::iterator checkAgainst = enemies.begin(); checkAgainst != enemies.end(); ++checkAgainst) {
            Enemy * next = *checkAgainst;
            Enemy nexter = *next;

            Direction moveTo = eni->flipDirection(eni->getDirection());
            if(eni->isColliding(nexter) && (eni != next)) {
                bool checkOverlap = true;
                    while(checkOverlap) {
                        eni->move(moveTo);
                        if(eni->isColliding(nexter) && (eni != next)) {
                            checkOverlap = true;
                        } else {
                            checkOverlap = false;
                        }
                    }

            }
        }

    }
}