我方飞机的子d和敌机子d都在这个类中产生。将子d专门设计成一个类,主要是为了方便扩展。之后如果想更换我方飞机子d或者是敌机子d,都会很方便。
类的功能很直观,就是添加子d、移除子d
voID bindEnemyManager(EnemyManager* enemyManager); voID BeginBulletShoot(float dt = 0.0f); // 开启子d射击 voID StopBulletShoot(); // 停止子d射击 voID addBullet(float dt); // 添加子d voID removeBullet(Node* pNode); // 移除子d voID addEnemyBullet(float dt); // 添加敌机子d voID removeEnemyBullet(Node* pNode); // 移除敌机子d
Vector<Sprite*> vecBullet; Vector<Sprite*> vecEnemyBullet;EnemyManager* m_enemyManager;
我们通过对比敌机类和我方飞机类,可以发现,我方飞机精灵直接嵌入在飞机层中,并通过setTag()设置标识,可以通过标识来调用,也可以通过调用飞机层的实例instancePlane来间接调用。而敌机虽然也设置了标识,但是可以通过getSprite()函数来获取精灵实体。
接下来实现添加子d的功能
bool Bullet::init(){ if (!Layer::init()) { return false; } BeginBulletShoot(); return true;}voID Bullet::bindEnemyManager(EnemyManager* enemyManager){ this->m_enemyManager = enemyManager; m_enemyManager->retain();}voID Bullet::BeginBulletShoot(float dt){ this->schedule(schedule_selector(Bullet::addBullet),0.2f,kRepeatForever,dt); this->schedule(schedule_selector(Bullet::addEnemyBullet),1.0f,dt);}voID Bullet::StopBulletShoot(){ this->unschedule(schedule_selector(Bullet::addBullet)); this->unschedule(schedule_selector(Bullet::addEnemyBullet));}voID Bullet::addBullet(float dt){ // 子d auto bullet = Sprite::createWithSpriteFramename("bullet1.png"); if (NulL == bullet) { return; } this->addChild(bullet); // 加到Layer中去 vecBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞检测等 // 获得飞机的位置 Point planePos = MyPlane::instancePlane->getChildByTag(AIRPLANE)->getposition(); Point bulletPos = Point(planePos.x,planePos.y + MyPlane::instancePlane->getChildByTag(AIRPLANE)->getContentSize().height / 2); bullet->setposition(bulletPos); // 飞行长度 飞行就是超出窗体 float flyLen = Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2 - bulletPos.y; float flyVeLocity = 320 / 1; //飞行速度 float realFlyDuration = flyLen / flyVeLocity; // 飞行时间 auto actionMove = Moveto::create(realFlyDuration,Point(bulletPos.x,Director::getInstance()->getWinSize().height + bullet->getContentSize().height / 2)); auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeBullet,this)); Sequence* sequence = Sequence::create(actionMove,actionDone,NulL); bullet->runAction(sequence); if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) { CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/bullet.wav"); } }voID Bullet::removeBullet(Node* pNode){ if (NulL == pNode) { return; } Sprite* bullet = (Sprite*)pNode; this->removeChild(bullet,true); vecBullet.eraSEObject(bullet);}// 添加敌机子dvoID Bullet::addEnemyBullet(float dt){ for (auto& eEnemy : m_enemyManager->vecEnemy) { Enemy* pEnemySprite = (Enemy*)eEnemy; // 子d auto bullet = Sprite::createWithSpriteFramename("enemyBullet.png"); if (NulL == bullet) { return; } this->addChild(bullet); // 加到Layer中去 vecEnemyBullet.pushBack(bullet); // 加到容器中去,用于以后的碰撞检测等 // 获得敌方飞机的位置 Point enemyPos = pEnemySprite->getposition(); Point bulletPos = Point(enemyPos.x,enemyPos.y - pEnemySprite->getContentSize().height / 2); bullet->setposition(bulletPos); // 飞行长度 飞行就是超出窗体 float flyLen = bulletPos.y - bullet->getContentSize().height / 2; float flyVeLocity = 320 / 1; //飞行速度 float realFlyDuration = flyLen / flyVeLocity; // 飞行时间 auto actionMove = Moveto::create(realFlyDuration,Director::getInstance()->getVisibleOrigin().y - bullet->getContentSize().height / 2)); auto actionDone = CallFuncN::create(CC_CALLBACK_1(Bullet::removeEnemyBullet,this)); Sequence* sequence = Sequence::create(actionMove,NulL); bullet->runAction(sequence); if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) { CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemyBullet.wav"); } }}// 移除敌机子dvoID Bullet::removeEnemyBullet(Node* pNode){ if (NulL == pNode) { return; } Sprite* bullet = (Sprite*)pNode; this->removeChild(bullet,true); vecEnemyBullet.eraSEObject(bullet);}注意不要将添加我方飞机子d和添加敌机子d放在一个函数中,那样不仅使代码混乱,而且不利于扩展。 总结
以上是内存溢出为你收集整理的【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d全部内容,希望文章能够帮你解决【cocos2d-x 3.7 飞机大战】 决战南海I (五) 添加子d所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)