bool EnemyTest::init() { if (!Sprite::init()) { return false; } instance = GameManager::getInstance(); sprite = Sprite::create("monster/monster1/right1.png"); //怪物本身的图片,初始化显示 addChild(sprite); iceSprite = Sprite::create("ice.png"); //冰块图片 iceSprite->setPosition(sprite->getPosition()); addChild(iceSprite, 2); iceSprite->setVisible(false); setType(1);//这是第一种敌人 setIsVisible(true); setRunSpeed(3); setHpPercentage(100); setMoney(2);//只值2元钱 animationRight = createAnimation("monster/monster1/right", 4, 0.1f,95,84); AnimationCache::getInstance()->addAnimation(animationRight, "monster1_right"); //这个cache里存有各种做好的动画,重要,以便后来取出用动画 animationLeft = createAnimation("monster/monster1/left", 4, 0.1f,95,84); AnimationCache::getInstance()->addAnimation(animationLeft, "monster1_left"); createAndSetHpBar(); schedule(schedule_selector(EnemyTest::changeDirection), 0.4f); schedule(schedule_selector(EnemyTest::deFroze), 0.2f); //每隔0.2秒执行一次检测是否减速函数 ////设置schduler来减缓敌人速度 //CCScheduler *defaultScheduler = CCDirector::sharedDirector()->getScheduler(); //// Create a new scheduler, and link it to the main scheduler //sched1 = new CCScheduler(); //defaultScheduler->scheduleUpdateForTarget(sched1, 0, false); //// Create a new ActionManager, and link it to the new scheudler //actionManager1 = new CCActionManager(); //sched1->scheduleUpdateForTarget(actionManager1, 0, false); //// Replace the default ActionManager with the new one. //this->setActionManager(actionManager1); return true; }
bool EnemyDisableTower::init() /*override*/ { if (!Sprite::init()) { return false; } instance = GameManager::getInstance(); sprite = Sprite::create("monster/monster_disable_tower/right1.png"); //怪物本身的图片,初始化显 addChild(sprite); iceSprite = Sprite::create("ice.png"); //冰块图片 iceSprite->setPosition(sprite->getPosition()); addChild(iceSprite, 2); iceSprite->setVisible(false); disableRing = Sprite::create("disableRing.png"); disableRing->setScale(2); addChild(disableRing, 10); auto fo = FadeOut::create(1); disableRing->runAction(RepeatForever::create(Sequence::create(fo, fo->reverse(), NULL))); setType(3);//这是第3种敌人 setIsVisible(true);//不是隐形单位 setRunSpeed(4); setHpPercentage(100); setMoney(8);//只值4元钱 animationRight = createAnimation("monster/monster_disable_tower/right", 4, 0.1f, 100, 100); AnimationCache::getInstance()->addAnimation(animationRight, "monster_disable_right"); //这个cache里存有各种做好的动画,重要,以便后来取出用动画 animationLeft = createAnimation("monster/monster_disable_tower/left", 4, 0.1f, 100, 100); AnimationCache::getInstance()->addAnimation(animationLeft, "monster_disable_left"); createAndSetHpBar(); schedule(schedule_selector(EnemyDisableTower::changeDirection), 0.4f); schedule(schedule_selector(EnemyDisableTower::deFroze), 0.2f); //每隔0.2秒执行一次检测是否减速函数 //schedule(schedule_selector(EnemyDisableTower::disableNearbyTower), 0.2f);//每隔0.2秒沉默敌人一次,有问题:不能在敌人这判断,要在炮塔那判断才行,否则会图片会闪烁 return true; }
void PlayLayer::update(float dt) { GameManager *instance = GameManager::getInstance(); auto bulletVector = instance->bulletVector; auto enemyVector = instance->enemyVector; auto towerVector = instance->towerVector; if(chooseTowerpanle != NULL ) { auto type = chooseTowerpanle->getChooseTowerType(); if( type == TowerType::ARROW_TOWER) { TowerBase* tower = ArrowTower::create(); tower->setPosition(towerPos); this->addChild(tower); instance->towerVector.pushBack(tower); type = TowerType::ANOTHER; chooseTowerpanle->setChooseTowerType(type); } } Vector<EnemyBase*> enemyNeedToDelete; Vector<Sprite*> bulletNeedToDelete; // 碰撞检测 for (int i = 0; i < bulletVector.size(); i++) { auto bullet = bulletVector.at(i); bullet->boundingBox(); auto bulletRect = Rect(bullet->getPositionX()+bullet->getParent()->getPositionX() - bullet->getContentSize().width / 2, bullet->getPositionY() +bullet->getParent()->getPositionY() - bullet->getContentSize().height / 2, bullet->getContentSize().width, bullet->getContentSize().height ); for (int j = 0; j < enemyVector.size(); j++) { auto enemy = enemyVector.at(j); auto enemyRect = enemy->sprite->boundingBox(); if (bulletRect.intersectsRect(enemyRect)) { auto currHp = enemy->getCurrHp(); currHp--; enemy->setCurrHp( currHp ); auto currHpPercentage = enemy->getHpPercentage(); auto offHp = 100 / enemy->getMaxHp(); currHpPercentage -= offHp; if(currHpPercentage < 0){ currHpPercentage = 0; } enemy->setHpPercentage(currHpPercentage); enemy->getHpBar()->setPercentage(currHpPercentage); if(currHp <= 0) { enemyNeedToDelete.pushBack(enemy); } bulletNeedToDelete.pushBack( bullet); } } for (EnemyBase* enemyTemp : enemyNeedToDelete) { enemyTemp->enemyExpload(); instance->enemyVector.eraseObject(enemyTemp); } enemyNeedToDelete.clear(); } for (const auto& bulletTemp : bulletNeedToDelete) { instance->bulletVector.eraseObject(bulletTemp); bulletTemp->removeFromParent(); } bulletNeedToDelete.clear(); }