日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

仿《雷霆战机》飞行射击手游开发--子弹、跟踪导弹和激光

發(fā)布時間:2023/12/29 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿《雷霆战机》飞行射击手游开发--子弹、跟踪导弹和激光 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載請注明:https://my.oschina.net/u/1986600/blog/863445
試玩版下載:https://pan.baidu.com/s/1mhLBNVa (Windows版)
源代碼下載:https://git.oschina.net/thorqq/RaidenFree

飛機(jī)的武器類型眾多,大致可分為子彈、跟蹤導(dǎo)彈和激光。子彈是直線飛行的;導(dǎo)彈會自動跟蹤目標(biāo),可曲線飛行;而激光是一道光束,可持續(xù)地對照射到的敵機(jī)產(chǎn)生傷害。子彈根據(jù)一次性發(fā)射的數(shù)量,可分為單發(fā)和多發(fā),根據(jù)子彈發(fā)射的方向可分為:自動瞄準(zhǔn)、平行、散射。本文將結(jié)合代碼講述有關(guān)飛機(jī)武器的程序設(shè)計。

程序設(shè)計

先看一下本游戲中有關(guān)武器的類的設(shè)計 其中,BulletGroup可理解為彈匣,Bullet就是其中一顆一顆的子彈,每顆子彈都有相同的屬性,包括外觀、傷害值以及飛行屬性。而繼承自Bullet的五個子類分別為:

  • ScatterBullet 散彈。含單發(fā)和多發(fā),平行和散射。
  • AimScatterBullet 自動瞄準(zhǔn)子彈。繼承自ScatterBullet,但是初始發(fā)射角度指向距離最近的敵機(jī)(飛行軌跡是直線,發(fā)射后不會改變方向)。
  • CustomBullet 可自定義每顆子彈初始的方向、速度。
  • Missile 跟蹤導(dǎo)彈。顧名思義,在飛行過程中會自動改變方向,始終對準(zhǔn)敵機(jī),但受限于飛行速度、角速度等參數(shù),也可能無法射中目標(biāo)。
  • Laser 激光。一道光束,傷害值依賴于接觸的時間。

參數(shù)

下面是Bullet的所有參數(shù),包含在結(jié)構(gòu)體TBulletData中:

std::string name; //名稱 std::string type; //類型:散彈、導(dǎo)彈、激光std::vector<std::string> styleArray; //幀動畫圖片資源 float aniDura;//幀動畫時間間隔std::string armatureName; //骨骼動畫名稱int topOfAircraft;//出現(xiàn)在飛機(jī)的上層還是下層 int musicId;//音效int attack; //攻擊值 int speed; //飛行速度。單位:像素/秒int count;//每次發(fā)射的子彈的顆數(shù)int max_count;//最多發(fā)射多少顆子彈。當(dāng)達(dá)到最大值時,停止發(fā)射或自動降檔 float timeLimit; //時間限制。當(dāng)達(dá)到這個時間時,停止發(fā)射或自動降檔float angle_of_center;//中心法線的角度。 float angle_interval;//多顆子彈同時發(fā)射時,這個角度就是相鄰子彈間的夾角float x_interval;//多顆子彈同時發(fā)射時,兩兩間的橫向間距float delay;//發(fā)射第一顆子彈時的延遲時間//假設(shè)發(fā)射的順序為:1.1.1...1.1.1...1.1.1... 其中“1”表示發(fā)射子彈,“.”表示間隔時間 //我們稱“1.1.1...”是一個大周期,“1.1.1”是三個小周期 float interval;//大周期之間的時間間隔,這里是“...”代表的時間 float interval_2;//小周期之間的時間間隔,這里是“.”代表的時間 int interval_2_cnt;//小周期里子彈數(shù)量,這里是3float rotate_angle; //連續(xù)發(fā)射時,每次發(fā)射偏轉(zhuǎn)的角度 float rotate_max_angle;//最大累計偏轉(zhuǎn)角度 int rotate_flag;//累計偏轉(zhuǎn)角度達(dá)到最大值時的處理方法,0:逐漸減小偏轉(zhuǎn)角度;1:立刻還原到零float bodyCenterX;//碰撞體相對子彈中心點的坐標(biāo)偏移 float bodyCenterY; float bodySizeW;//碰撞體的大小 float bodySizeH;//發(fā)射原點相對飛機(jī)中心點的坐標(biāo)偏移 float origin_offset_x; float origin_offset_y;std::vector<std::string> fireFameNameArray; //尾部火焰動畫,圖片列表 float fireAniDura; //動畫幀時長 int fireOnTop; //尾部火焰顯示在子彈的上層還是下層 float fireOffsetX;//火焰中心點相對于飛機(jī)底部中心點的偏移。如果等于0,則只有一個火焰;否則是兩個火焰 float fireOffsetY;std::vector<std::string> blastStyleArray;//子彈打到目標(biāo)后產(chǎn)生的爆炸的幀動畫資源列表

基類設(shè)計

Bullet類

Bullet類很簡單,僅僅用于維護(hù)子彈的外觀,所以重要的只有bool Bullet::init(BulletGroup* pBulletGroup)這一個方法。詳見如下代碼:

class Bullet : public GameObject { public:friend class BulletGroup;static Bullet* create(BulletGroup* pBulletGroup);//根據(jù)pBulletGroup中的子彈相關(guān)屬性創(chuàng)建子彈virtual bool init(BulletGroup* pBulletGroup);virtual void reset();protected:Bullet();virtual ~Bullet();//添加尾部的左右兩個火焰動畫bool addFire(float offsetX, float offsetY, bool isFlipped);protected:cocostudio::Armature* m_pArmature;BulletGroup* m_pBulletGroup;bool m_bBlast; };Bullet::Bullet() {reset(); }Bullet::~Bullet() { }void Bullet::reset() {GameObject::reset();m_pArmature = nullptr;m_pBulletGroup = NULL;m_bBlast = false; }Bullet* Bullet::create(BulletGroup* pBulletGroup) {Bullet *pRet = new(std::nothrow) Bullet();if (pRet && pRet->init(pBulletGroup)){pRet->autorelease();return pRet;}else{delete pRet;pRet = NULL;return NULL;} }//根據(jù)pBulletGroup中的子彈相關(guān)屬性創(chuàng)建子彈 bool Bullet::init(BulletGroup* pBulletGroup) {m_pBulletGroup = pBulletGroup;bool bRet = false;do{CC_BREAK_IF(!GameObject::init());if (m_pBulletGroup->m_data.topOfAircraft){m_pBulletGroup->getParent()->addChild(this, CONSTANT::ZORDER_BULLET_ONTOP);}else{if (m_pBulletGroup->getPlane()->getAircraftType() == EAircraftType::Type_Enemy){m_pBulletGroup->getParent()->addChild(this, CONSTANT::ZORDER_BULLET_ENEMY);}else{m_pBulletGroup->getParent()->addChild(this, CONSTANT::ZORDER_BULLET_PLAYER);}}setBodyCenter(m_pBulletGroup->getBodyCenter());setBodySize(m_pBulletGroup->getBodySize());GameObject::initSpriteWithFileList(m_pBulletGroup->m_data.styleArray, m_pBulletGroup->m_data.aniDura);if (m_pBulletGroup->m_data.armatureName.length() > 0){m_pArmature = cocostudio::Armature::create(m_pBulletGroup->m_data.armatureName);m_pArmature->setPosition(getContentSize() / 2);m_pArmature->getAnimation()->play(GlobalData::getInstance()->getArmatureData(m_pBulletGroup->m_data.armatureName)->defaultAction);addChild(m_pArmature);}else{if (m_pBulletGroup->m_data.fireFameNameArray.size() > 0){m_pBulletGroup->m_data.fireOffsetX = abs(m_pBulletGroup->m_data.fireOffsetX);if (m_pBulletGroup->m_data.fireOffsetX > 0.01){addFire(+m_pBulletGroup->m_data.fireOffsetX, m_pBulletGroup->m_data.fireOffsetY, false);addFire(-m_pBulletGroup->m_data.fireOffsetX, m_pBulletGroup->m_data.fireOffsetY, true);}else{addFire(0, m_pBulletGroup->m_data.fireOffsetY, false);}}}bRet = true;} while (0);return bRet; }bool Bullet::addFire(float offsetX, float offsetY, bool isFlipped) {Sprite* fire = GameObject::createSpriteWithFileList(m_pBulletGroup->m_data.fireFameNameArray, m_pBulletGroup->m_data.fireAniDura);//子彈的飛行速度比較快,所以火焰不需要動畫//if (m_pBulletGroup->m_data.fireFameNameArray.size() == 1)//{// ScaleTo* pScale1 = ScaleTo::create(m_pBulletGroup->m_data.fireAniDura, 1.0f, 0.9f);// ScaleTo* pScale2 = ScaleTo::create(m_pBulletGroup->m_data.fireAniDura, 1.0f, 1.0f);// Sequence* sequence = Sequence::create(pScale1, pScale2, NULL);// Repeat* repeat = Repeat::create(sequence, CC_REPEAT_FOREVER);// fire->runAction(repeat);//}//添加if (m_pBulletGroup->m_data.fireOnTop){addChild(fire);}else{addChild(fire, CONSTANT::ZORDER_PLAYERPLANE_FIRE);}//鏡像翻轉(zhuǎn)if (isFlipped){fire->setFlippedX(true);}//位置fire->setPosition(Vec2(getContentSize().width / 2 + offsetX, offsetY));return true; }

BulletGroup類

BulletGroup是比較重要的類,包含了子彈的基本參數(shù)(結(jié)構(gòu)體TBulletData,用于”復(fù)制“出一顆一顆的子彈)、發(fā)射動作、與飛機(jī)以及敵機(jī)間的關(guān)系。詳細(xì)代碼如下:

//子彈的基類。內(nèi)部維護(hù)了一個子彈池 class BulletGroup : public GameObjectContainer { public:friend class Bullet;friend class Missile;friend class Laser;BulletGroup();virtual ~BulletGroup();virtual bool init(Node* pParent, Aircraft* pPlane, const TBulletData* pData);virtual void reset();virtual void destory();//開始射擊virtual void startShoot();//發(fā)射指定數(shù)量的子彈virtual void startShoot(int cnt);//停止射擊virtual void stopShoot();//是否正在射擊virtual bool isShooting();//從子彈池中刪除一顆子彈。超出屏幕范圍,或者擊中目標(biāo)virtual void RemoveBullet(Bullet* pBullet);//爆炸virtual void blast(Bullet* pBullet);//當(dāng)對方飛機(jī)增加或者減少時,通知導(dǎo)彈virtual void nodifyTargetRemove(Aircraft* pAircraft) {}//注冊子彈用完監(jiān)聽器void regBulletUseUpListener(IBulletUseUpListener* l);void notifyBulletUseUp();inline bool isUseUp() { return m_bIsUseUp; }public://子彈飛出屏幕后的完成動作(內(nèi)部函數(shù))virtual void bulletMoveFinished(Node* pSender);inline int getAttack(){return m_data.attack;}inline void setAttack(int a){m_data.attack = a;}inline void setPlane(Aircraft* plane){m_plane = plane;}inline Aircraft* getPlane(){return m_plane;}inline void setOtherSidePlane(Vector<Aircraft*>* const planes){m_otherSideArray = planes;}virtual void update(float dt) override;protected://發(fā)射一次子彈(可能會包含多顆子彈)virtual void AddBullet(float dt) {};//從子彈池中獲取一顆子彈virtual Bullet* getOneBullet();float getPara(const char* const param);bool isSameGroup() { return m_bSameGroup; } protected:TBulletData m_data;int m_iCount;int m_iAvailableBullet;bool m_bIsShooting;Aircraft* m_plane;Vector<Aircraft*> * m_otherSideArray;int m_iIntervalCnt; //小間隔子彈發(fā)射次數(shù)float m_iTimeCum; //時間累計float m_iTimeCumThisGrade; //本等級下的時間累計bool m_bFirstShoot; //bool m_bSameGroup; //是否在同一個大間隔內(nèi)IBulletUseUpListener* m_pBulletUseUpListener;bool m_bIsUseUp;float m_timeLimitAdd; };BulletGroup::BulletGroup() {this->reset(); }BulletGroup::~BulletGroup() { }void BulletGroup::reset() {m_data.reset();m_iCount = 0;m_bIsShooting = false;m_plane = NULL;m_otherSideArray = NULL;m_iAvailableBullet = 0;m_iIntervalCnt = 0;m_iTimeCum = 0;m_iTimeCumThisGrade = 0;m_bFirstShoot = false;m_pBulletUseUpListener = NULL;m_bIsUseUp = false;m_timeLimitAdd = 0; }bool BulletGroup::init(Node* pParent, Aircraft* pPlane, const TBulletData* pData) {bool bRet = false;do{CC_BREAK_IF(!GameObjectContainer::init());setPlane(pPlane);m_data.clone(*pData);Node::setName(m_data.type);if (m_data.topOfAircraft){pParent->addChild(this, CONSTANT::ZORDER_BULLET_ONTOP);}else{if (pPlane->getAircraftType() == EAircraftType::Type_Enemy){pParent->addChild(this, CONSTANT::ZORDER_BULLET_ENEMY);}else{pParent->addChild(this, CONSTANT::ZORDER_BULLET_PLAYER);}}//bodyVec2 center(m_data.bodyCenterX, m_data.bodyCenterY);setBodyCenter(center);//如果沒有設(shè)置剛體大小,則默認(rèn)是圖片尺寸的60%Size size(m_data.bodySizeW, m_data.bodySizeH);if (fabs(size.width) < 0.01 || fabs(size.height) < 0.01){size.width = this->getContentSize().width * 0.6f;size.height = this->getContentSize().height * 0.6f;}setBodySize(size);//獲取對方飛機(jī)列表m_otherSideArray = pPlane->getOtherSidePlane();if (pPlane->getAircraftType() == EAircraftType::Type_Enemy){m_timeLimitAdd = GameData::getInstance()->getValueToFloat(GAMEDATA::REINFORCE_VALUE_RAMPAGE_DURA);}bRet = true;} while (0);return bRet; }void BulletGroup::destory() {if (this->m_plane == NULL){int i = 0;for (i = 0; i < getAllObject()->count(); i++){Bullet* p = dynamic_cast<Bullet*>(getAllObject()->getObjectAtIndex(i));if (p != NULL && p->isVisible()){//無需釋放return;}}if (getAllObject()->count() == i){for (i = 0; i < getAllObject()->count(); i++){Bullet* p = dynamic_cast<Bullet*>(getAllObject()->getObjectAtIndex(i));if (p != NULL){p->destory();}}getAllObject()->removeAllObjects();removeFromParent();}} }void BulletGroup::startShoot() {m_bIsShooting = true;this->scheduleUpdate(); }void BulletGroup::startShoot(int cnt) {m_bIsShooting = false;m_iCount = 0;m_iIntervalCnt = 0;m_iTimeCum = 0;m_iTimeCumThisGrade = 0;m_bFirstShoot = 0;m_bSameGroup = false;m_bIsUseUp = false;m_data.max_count = cnt;m_bIsShooting = true;this->scheduleUpdate(); }void BulletGroup::stopShoot() {unscheduleUpdate();unscheduleAllCallbacks();m_bIsShooting = false; }bool BulletGroup::isShooting() {return m_bIsShooting; }void BulletGroup::update(float dt) {m_iTimeCum += dt;m_iTimeCumThisGrade += dt;if (m_data.timeLimit > 0 && m_iTimeCumThisGrade > m_data.timeLimit + m_timeLimitAdd){m_bIsUseUp = true;m_iTimeCumThisGrade = 0;this->notifyBulletUseUp();this->stopShoot();return;}if (!m_bFirstShoot && m_iTimeCum < m_data.delay && m_data.delay >= 0.00001) //還沒進(jìn)行第一次發(fā)射,等待延遲{return;}else if (!m_bFirstShoot && m_iTimeCum >= m_data.delay && m_data.delay >= 0.00001) //第一次發(fā)射,超時了{(lán)m_iTimeCum -= m_data.delay;m_bFirstShoot = true;m_iIntervalCnt++;if (Sound::isBulletSound()){Sound::playSound(m_data.musicId);}m_bSameGroup = true;AddBullet(dt);return;}//小間隔內(nèi)if (m_iIntervalCnt < m_data.interval_2_cnt){if (m_iTimeCum >= m_iIntervalCnt * m_data.interval_2){m_iIntervalCnt++;if (Sound::isBulletSound()){Sound::playSound(m_data.musicId);}m_bSameGroup = true;AddBullet(dt);return;}}else //大間隔{if (m_iTimeCum >= m_data.interval_2_cnt * m_data.interval_2 + m_data.interval){m_iIntervalCnt = 1;m_iTimeCum = 0;if (Sound::isBulletSound()){Sound::playSound(m_data.musicId);}m_bSameGroup = false;AddBullet(dt);return;}} }Bullet* BulletGroup::getOneBullet() {if (!m_bIsShooting){return NULL;}if (m_data.max_count > 0 && m_iCount >= m_data.max_count){m_bIsUseUp = true;this->notifyBulletUseUp();return NULL;}int i = 0;int size = getAllObject()->count();for (; i < size; i++){Bullet* p = dynamic_cast<Bullet*>(m_pAllObject->getObjectAtIndex(i));if (p != NULL && p->isVisible() == false){p->setVisible(true);p->startAnimate();m_iAvailableBullet++;m_iCount++;return p;}}if (m_pAllObject->count() == i){Bullet* pBullet = Bullet::create(this);m_pAllObject->addObject(pBullet);m_iAvailableBullet++;m_iCount++;//CCLOG("Add bullet[%s], size = %d", Node::getName().c_str(), m_pAllObject->count());return pBullet;}return NULL; }//擊中目標(biāo)后爆炸并刪掉 void BulletGroup::blast(Bullet* pBullet) {//在父層中生成爆炸動畫PlaneLayer* pLayer = dynamic_cast<PlaneLayer*>(getParent());if (NULL != pLayer){Rect rect = pBullet->getBodyBox();Vec2 pos(rect.getMidX(), rect.getMidY());//擊中的爆炸動畫pLayer->addBlast(this->getLocalZOrder(), pos, m_data.blastStyleArray, m_data.blastAniDura);//粒子效果。TODO 后續(xù)要使用particle表里讀取粒子配置ParticleSystemQuad *emitter1 = ParticleSystemQuad::create("img/blast/hitEnemy.plist");emitter1->setPosition(pos); // 設(shè)置發(fā)射粒子的位置 emitter1->setAutoRemoveOnFinish(true); // 完成后制動移除 emitter1->setDuration(0.3f); // 設(shè)置粒子系統(tǒng)的持續(xù)時間秒 pLayer->addChild(emitter1, getLocalZOrder() + 1);}RemoveBullet(pBullet); }//子彈飛出屏幕后刪掉 void BulletGroup::bulletMoveFinished(Node* pSender) {RemoveBullet((Bullet*)pSender); }void BulletGroup::RemoveBullet(Bullet* pBullet) {if (pBullet != NULL){pBullet->stopAllActions();pBullet->setVisible(false);Node* parent = getParent();m_iAvailableBullet--;int size = getAllObject()->count();int i = 0;for (; i < size; i++){Bullet* p = dynamic_cast<Bullet*>(m_pAllObject->getObjectAtIndex(i));if (p != NULL && p->isVisible() == true && m_iAvailableBullet <= 0){return;}}}//清除本對象if (m_plane == NULL && m_iAvailableBullet <= 0 && getParent() != NULL && !this->isShooting()){int size = getAllObject()->count();int i = 0;for (; i < size; i++){Bullet* p = dynamic_cast<Bullet*>(m_pAllObject->getObjectAtIndex(i));p->m_pBulletGroup = NULL;p->getParent()->removeChild(p);}PlaneLayer* layer = dynamic_cast<PlaneLayer*>(getParent());getParent()->removeChild(this);if (layer){layer->removeBullet(this);}}}void BulletGroup::regBulletUseUpListener(IBulletUseUpListener* l) {m_pBulletUseUpListener = l; }void BulletGroup::notifyBulletUseUp() {if (m_pBulletUseUpListener != NULL){m_pBulletUseUpListener->bulletUseUp();} }float BulletGroup::getPara(const char* const param) {auto it = m_data.paramMap.find(param);if (it != m_data.paramMap.end()){return it->second;}else{return 0;} }

子彈的每次發(fā)射的時間點控制在update方法中,其中使用到了延時delay、大小周期interval、interval_2、interval_2_cnt等相關(guān)參數(shù)。當(dāng)確定好每次發(fā)射的時間點后,會通過AddBullet來添加一顆子彈,放在某個位置上,并讓其發(fā)射出去,具體的放置位置和發(fā)射的角度速度等參數(shù)留給子類來實現(xiàn),這里僅僅定義一個空方法:virtual void AddBullet(float dt) {};。從方法RemoveBullet可以看到,當(dāng)子彈飛出屏幕或者擊中目標(biāo)時,我們銷毀子彈的方法僅僅是停止其動畫效果,并設(shè)置為不可見,這樣可以減少頻繁創(chuàng)建/銷毀子彈帶來的性能損失。當(dāng)子彈用完時,會通過方法notifyBulletUseUp來通知飛機(jī),這樣,飛機(jī)就會對子彈進(jìn)行降檔,例如從暴走狀態(tài)恢復(fù)到普通狀態(tài)。

下面我們看看散彈、跟蹤導(dǎo)彈、激光等各個子類的具體實現(xiàn)。

散彈

最簡單的散彈就是每次只發(fā)射一顆子彈,并且所有子彈都朝著一個不變的方向飛行,看起來就像一條直線。當(dāng)每次發(fā)射兩顆或多顆子彈時,看起來就是兩條或多條直線,這多條直線或平行,或相鄰之間存在一個固定的夾角。在代碼中是通過angle_interval參數(shù)來控制的。

還有一種偏轉(zhuǎn)角度隨時間變化的散彈,即每發(fā)射一顆子彈,其飛行角度都會向某個方向偏轉(zhuǎn)一個固定的角度,當(dāng)達(dá)到一個最大角度值時,又會逐漸減小偏轉(zhuǎn)角度,看起來就像個“之”字形。如果最大偏轉(zhuǎn)角度不存在時,子彈軌跡看起來就是個螺旋形狀了。在代碼中是通過rotate_angle和rotate_max_angle來控制的。 下面我們看下具體代碼。

//可自定義子彈的個數(shù)、夾角、偏移 class ScatterBullet : public BulletGroup { public:ScatterBullet();virtual bool init(Node* pParent, Aircraft* pPlane, const TBulletData* pData);virtual void reset();protected://發(fā)射一次子彈virtual void AddBullet(float dt) override;//計算發(fā)射中心線的角度virtual float calculateCenterLineDegree(Bullet* pBullet, Vec2& src);//發(fā)射一顆子彈virtual bool AddBulletOne(Vec2& srcOffset, float degree);protected:float m_flyDistance;long m_shootCnt;int m_shootAddFlag; };ScatterBullet::ScatterBullet(): m_flyDistance(0), m_shootCnt(0), m_shootAddFlag(0) {}void ScatterBullet::reset() {BulletGroup::reset();m_flyDistance = 0;m_shootCnt = 0;m_shootAddFlag = 0; }bool ScatterBullet::init(Node* pParent, Aircraft* pPlane, const TBulletData* pData) {bool bRet = false;do{CC_BREAK_IF(!BulletGroup::init(pParent, pPlane, pData));m_flyDistance = CONSTANT::DESIGN_RES_DIAGONAL;m_shootAddFlag = 1;if (m_data.count < 0){m_data.count = 1;}bRet = true;} while (0);return bRet; }void ScatterBullet::AddBullet(float dt) {m_shootCnt += m_shootAddFlag;float angleLeft = 0;float offsetXLeft = 0;if (m_data.count % 2 == 0)//偶數(shù){//計算最左邊的子彈的夾角、偏移angleLeft = m_data.angle_interval / 2 + (m_data.count / 2 - 1) * m_data.angle_interval;offsetXLeft = -1 * (m_data.x_interval / 2 + (m_data.count / 2 - 1)*m_data.x_interval);}else //奇數(shù){angleLeft = (m_data.count - 1) / 2 * m_data.angle_interval;offsetXLeft = -1 * (m_data.count - 1) / 2 * m_data.x_interval;}float offsetAngle = 0;if (m_data.angle_of_center > 0 && m_data.angle_of_center < 180){offsetAngle = m_data.angle_of_center - 90;}else{offsetAngle = m_data.angle_of_center - 270;}for (int i = 0; i < m_data.count; i++){float a = angleLeft - m_data.angle_interval * i;float l = offsetXLeft + m_data.x_interval * i;float x = l * cos(CC_DEGREES_TO_RADIANS(offsetAngle));float y = -l * sin(CC_DEGREES_TO_RADIANS(offsetAngle));Vec2 v(m_data.origin_offset_x + x, m_data.origin_offset_y + y); if (!AddBulletOne(v, a)){break;}} }float ScatterBullet::calculateCenterLineDegree(Bullet* pBullet, Vec2& src) {float angle = (m_shootCnt - 1) * m_data.rotate_angle;if (fabs(angle) > m_data.rotate_max_angle && m_data.rotate_max_angle >= 1){if (m_data.rotate_flag == 0){//m_shootAddFlag = -m_shootAddFlag;if (angle * m_data.rotate_angle > 0){m_shootAddFlag = -1;}else{m_shootAddFlag = 1;}}else{m_shootCnt = 0;m_shootAddFlag = 1;}}return m_data.angle_of_center + angle; }//degree 角度偏移。正數(shù)表示逆時針,負(fù)數(shù)表示順時針 bool ScatterBullet::AddBulletOne(Vec2& srcOffset, float degree) {//添加一個子彈精靈Bullet* pBullet = BulletGroup::getOneBullet();if (!pBullet || !getPlane()){return false;}//子彈的位置Vec2 src;if (getPlane()->getAircraftType() == EAircraftType::Type_Wingman) //僚機(jī){Aircraft* pMainPlane = dynamic_cast<Aircraft*>(getPlane()->getParent());src = pMainPlane->getPosition() + getPlane()->getPosition() - pMainPlane->getContentSize() / 2;}else //非僚機(jī){src = getPlane()->getPosition();}src.y += srcOffset.y;if (m_data.count == 1){if (m_data.angle_of_center > 0 && m_data.angle_of_center < 180){src.x += srcOffset.x;}else{src.x += -srcOffset.x;}}//這一句必須要放在src.x += srcOffset.x之前float centerLineDegree = calculateCenterLineDegree(pBullet, src)/* + offsetDegree*/;if (m_data.count > 1){if (m_data.angle_of_center > 0 && m_data.angle_of_center < 180){src.x += srcOffset.x;src.y += pBullet->getContentSize().height / 2;}else{src.x += -srcOffset.x;src.y -= pBullet->getContentSize().height / 2;}}pBullet->setPosition(src);if (sinf(CC_DEGREES_TO_RADIANS(m_data.angle_of_center)) > 0){pBullet->setRotation(90 - (centerLineDegree + degree));}else{pBullet->setRotation(90 - (centerLineDegree + degree) + 180);}if (degree > 0){pBullet->setFlippedX(true);}//bodyVec2& pos = m_bodyCenter;Vec2 pos2;pos2.x = sqrt(pow(pos.x, 2) + pow(pos.y, 2)) * cos(CC_DEGREES_TO_RADIANS(centerLineDegree + degree));pos2.y = sqrt(pow(pos.x, 2) + pow(pos.y, 2)) * sin(CC_DEGREES_TO_RADIANS(centerLineDegree + degree));pBullet->setBodyCenter(pos2);pBullet->setBodySize(getBodySize());//子彈飛出屏幕所需的距離、飛行速度、飛行時間float realMoveDuration = m_flyDistance / m_data.speed;//在realMoveDuration時間內(nèi),飛到指定位置float deltaX = m_flyDistance * cos(CC_DEGREES_TO_RADIANS(centerLineDegree + degree));float deltaY = m_flyDistance * sin(CC_DEGREES_TO_RADIANS(centerLineDegree + degree));Vec2 dest = Vec2(src.x + deltaX, src.y + deltaY);FiniteTimeAction* actionMove = CCMoveTo::create(realMoveDuration, dest);FiniteTimeAction* actionDone = CallFuncN::create(CC_CALLBACK_0(BulletGroup::bulletMoveFinished, this, pBullet));//開始執(zhí)行動作Sequence* sequenceL = Sequence::create(actionMove, actionDone, NULL);pBullet->runAction(sequenceL);return true; }

跟蹤導(dǎo)彈

跟蹤導(dǎo)彈是一種特殊的子彈,當(dāng)發(fā)射出導(dǎo)彈時,它首先會自動尋找并鎖定距離最近敵機(jī),然后從一個初速度開始,加速飛向目標(biāo)(普通子彈是勻速飛行)。由于目標(biāo)是運動的,所以導(dǎo)彈還具備自動調(diào)整飛行角度的能力。但是,導(dǎo)彈還存在轉(zhuǎn)彎半徑這個限制,即導(dǎo)彈并不能任意轉(zhuǎn)彎,它存在角速度參數(shù),每個單位時間內(nèi)最大只能偏轉(zhuǎn)一個固定的角度。上述所有的邏輯都在Missile類的update方法中,詳見下面的代碼:

void Missile::update(float dt) {if (!this->isVisible() || m_pBulletGroup == NULL){return;}//飛出屏幕const Rect& rect = this->getBoundingBox();const Size& windowSize = Director::getInstance()->getWinSize();if (rect.getMinX() > windowSize.width || rect.getMaxX() < 0|| rect.getMinY() > windowSize.height || rect.getMaxY() < 0){m_pBulletGroup->bulletMoveFinished(this);return;}//尋找距離最近,且夾角小于70度的敵機(jī)if ((!m_pEnemy || !m_pEnemy->isAlive()) && m_pBulletGroup && m_pBulletGroup->m_otherSideArray){((MissileGroup*)m_pBulletGroup)->searchEnemy(this);}float f = 0;if (m_pEnemy && m_pEnemy->isAlive()){//轉(zhuǎn)向目標(biāo)float curRot = getRotation();float angle = -CC_RADIANS_TO_DEGREES((getPosition() - m_pEnemy->getPosition()).getAngle());float tmpAngle = angle;if (angle - 90 - curRot < -90 && angle - 90 - curRot + 360 < 90){angle += 360;}else if (angle - 90 - curRot > 90 && angle - 90 - curRot - 360 > -90){angle -= 360;}else{if (fabsf(m_fLastAngle - angle) > 180){if (m_fLastAngle > 0){angle += 360;}else if (m_fLastAngle < 0){angle -= 360;}}}m_fLastAngle = angle;//最大偏轉(zhuǎn)角度float angleDif = std::min(std::max((angle - 90) - curRot, -m_fTurnRate*dt), m_fTurnRate*dt);f = curRot + angleDif;//DEBUG_LOG("Missile[%p,%.0f,%.0f] aimed emeny[%p,%.0f,%.0f], "// "angle[%.2f, %.2f],max[%.2f], curRot[%.2f],angleDif[%.2f],f[%.2f]",// this, getPosition().x, getPosition().y,// m_pEnemy, m_pEnemy->getPosition().x, m_pEnemy->getPosition().y,// tmpAngle, angle, m_fTurnRate*dt, curRot, angleDif, f);}if (!m_pEnemy || !m_pEnemy->isAlive()){f = getRotation();//DEBUG_LOG("Missile[%p,%.0f,%.0f] aimed emeny[NULL], angle[%f]", // this, getPosition().x, getPosition().y, f);}setRotation(f);setPosition(getPosition() + Vec2(sinf(CC_DEGREES_TO_RADIANS(f))*m_fVelocity, cosf(CC_DEGREES_TO_RADIANS(f))*m_fVelocity)* Director::getInstance()->getScheduler()->getTimeScale());Vec2 pos2;float dd = sqrt(pow(m_bodyCenter.x, 2) + pow(m_bodyCenter.y, 2));pos2.x = dd * cos(CC_DEGREES_TO_RADIANS(90 - f));pos2.y = dd * sin(CC_DEGREES_TO_RADIANS(90 - f));this->setBodyCenter(pos2);//當(dāng)子彈旋轉(zhuǎn)超過45°時,寬高值交換if (fabsf(f) > 45 && fabsf(f) < 135){Size size = getOrignBodySize();float tmp = size.width;size.width = size.height;size.height = tmp;this->setBodySize(size);}m_fVelocity += m_fAccel*dt; }

激光

激光看似與普通子彈或者導(dǎo)彈完全不同,但是仔細(xì)分析下來,也可以看成是一顆特殊的子彈:

  • 激光始終都只是一顆子彈(并沒有多顆子彈)
  • 激光外形是一個長度可變的矩形。最大長度是屏幕的高度,當(dāng)遇到敵機(jī)時,激光的長度是從飛機(jī)到敵機(jī)之間的距離
  • 激光對目標(biāo)產(chǎn)生的傷害依賴于其接觸目標(biāo)的時間,并具有線性關(guān)系。
    通過以上分析,可以得到激光最與眾不同的地方在于其外觀的可變性,下面是具體的代碼
  • bool Laser::init(BulletGroup* pBulletGroup) { if (!GameObject::init()) { return false; } m_pBulletGroup = pBulletGroup;//int planeZOrder = m_pBulletGroup->m_plane->getLocalZOrder();if (m_pBulletGroup->getPlane()->getAircraftType() == EAircraftType::Type_Killer){m_pBulletGroup->getParent()->addChild(this, CONSTANT::ZORDER_BULLET_KILLER);}else if (m_pBulletGroup->getPlane()->getAircraftType() == EAircraftType::Type_Player){m_pBulletGroup->getParent()->addChild(this, CONSTANT::ZORDER_BULLET_PLAYER);}else{int planeZOrder = CONSTANT::ZORDER_BULLET_PLAYER;m_pBulletGroup->getParent()->addChild(this, planeZOrder - 1);}//這里不能用createWithSpriteFrameName,否則激光會變成一段一段的(中間有黑色間隙)Sprite* pLaserNode = Sprite::create(m_pBulletGroup->m_data.styleArray.at(0));m_fWidth = pLaserNode->getContentSize().width;//寬度m_fHeight = CONSTANT::DESIGN_RES_HEIGHT + 50;//初始長度,理論上是無限高,這里只需要大于屏幕的高度即可//設(shè)置剛體的大小setBodySize(Size(pBulletGroup->getBodySize().width, m_fHeight)); setBodyCenter(pBulletGroup->getBodyCenter());setContentSize(Size(pBulletGroup->getBodySize().width, m_fHeight));//計算紋理的個數(shù)int cnt = (int)(m_fHeight / pLaserNode->getContentSize().height + 0.9999);//實際高度float h = cnt * pLaserNode->getContentSize().height;//高度調(diào)整為2的n次方h = toPOT(h);cnt = (int)(h / pLaserNode->getContentSize().height + 0.9999);// 1: Create new CCRenderTextureint potW = toPOT(m_fWidth);RenderTexture *rt = RenderTexture::create(potW, h);// 2: Call CCRenderTexture:beginrt->begin();//開始貼圖pLaserNode->setFlippedY(true);pLaserNode->setPosition(Vec2(m_fWidth / 2, pLaserNode->getContentSize().height / 2));pLaserNode->visit();for (int i = 1; i < cnt; i++){//這里不能用createWithSpriteFrameName,否則激光會變成一段一段的(中間有黑色間隙)Sprite* pLaserNode2 = Sprite::create(m_pBulletGroup->m_data.styleArray.at(0));pLaserNode2->setFlippedY(true);pLaserNode2->setPosition(Vec2(m_fWidth / 2, pLaserNode->getContentSize().height / 2 + pLaserNode->getContentSize().height * i));pLaserNode2->visit();}// 4: Call CCRenderTexture:endrt->end();// 5: Create a new Sprite from the texturem_pLaser = Sprite::createWithTexture(rt->getSprite()->getTexture());m_pLaser->setTextureRect(Rect(0, 0, m_fWidth, m_fHeight));Texture2D::TexParams tp = { GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT };m_pLaser->getTexture()->setTexParameters(tp);m_pLaser->setAnchorPoint(Vec2(0.5, 0));m_pLaser->setPosition(Vec2(getContentSize().width / 2, 0));addChild(m_pLaser);//添加爆炸點m_pBlast = GameObject::createSpriteWithFileList(m_pBulletGroup->m_data.blastStyleArray, m_pBulletGroup->m_data.blastAniDura);if (m_pBlast){m_pBlast->setPosition(Vec2(getBodySize().width / 2, getBodySize().height));addChild(m_pBlast);}scheduleUpdate();return true; }void Laser::rejustHeight(float fMinY) {if (m_pBulletGroup && m_pBulletGroup->m_plane){//根據(jù)敵機(jī)的位置計算激光的高度m_fHeight = fMinY - m_pBulletGroup->m_plane->getPosition().y;if (m_fHeight < 0){m_fHeight = CONSTANT::DESIGN_RES_HEIGHT + 200;}setBodySize(Size(m_pBulletGroup->getBodySize().width, m_fHeight));if (m_pBlast){m_pBlast->setPosition(Vec2(getBodySize().width / 2, getBodySize().height));}} }void Laser::update(float dt) {if (!this->isVisible() || m_pBulletGroup == NULL){return;}//計算當(dāng)前位置setBodySize(Size(getBodySize().width, CONSTANT::DESIGN_RES_HEIGHT));m_fTmpOffset += m_pBulletGroup->m_data.speed * dt;const Size& textureSize = m_pLaser->getTextureRect().size;m_pLaser->setTextureRect(Rect(0, m_fTmpOffset, textureSize.width, m_fHeight));}

    其中,init用于創(chuàng)建激光外觀,這里通過{ GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT }來創(chuàng)建一個重復(fù)的紋理,然后在update中讓紋理不停的向上滾動。在rejustHeight中,我們根據(jù)目標(biāo)的Y軸坐標(biāo)來計算激光的高度,并在激光接觸目標(biāo)的位置增加一個擊中效果的貼圖。

    轉(zhuǎn)載請注明:https://my.oschina.net/u/1986600/blog/863445

    轉(zhuǎn)載于:https://my.oschina.net/u/1986600/blog/863445

    總結(jié)

    以上是生活随笔為你收集整理的仿《雷霆战机》飞行射击手游开发--子弹、跟踪导弹和激光的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    美女网站色免费 | 在线免费观看的av | 狠狠的干狠狠的操 | 97爱爱爱| 国产精品亚洲片在线播放 | 一区二区三区四区五区六区 | 一区二区三区手机在线观看 | 国产一级h | 国产精品三级视频 | 在线成人看片 | 国产99精品 | 日韩免费在线播放 | 最新久久免费视频 | 国产97视频| 日韩精品在线免费观看 | 中文字幕日韩一区二区三区不卡 | 国产亚洲精品久久久久久大师 | 免费观看全黄做爰大片国产 | 97激情影院 | 天天搞夜夜骑 | 极品嫩模被强到高潮呻吟91 | 在线视频免费观看 | 91精品电影| www.久久免费视频 | 久久精品在线视频 | 播五月婷婷 | 午夜骚影| 国产麻豆传媒 | 91在线精品秘密一区二区 | 成年人在线观看视频免费 | 91传媒视频在线观看 | 中文字幕字幕中文 | 欧美激情综合色 | 日韩二三区 | 国产精品岛国久久久久久久久红粉 | 日日爽视频 | 国产a高清| 一区三区视频在线观看 | 国产精品久久久久久久7电影 | 97人人爽| 欧美成人91| 人人干人人干人人干 | 久久久久国产精品午夜一区 | 天天操狠狠操夜夜操 | 天天视频色 | 一本一道波多野毛片中文在线 | 精品久久久久久久久久久久久久久久久久 | 亚洲人精品午夜 | 精品一区在线看 | 亚洲h在线播放在线观看h | 17videosex性欧美| 日本字幕网 | 欧美日韩一级在线 | 欧美va在线观看 | 黄污污网站 | 综合激情av | 日韩精品视频一二三 | 女人18片 | 一本色道久久综合亚洲二区三区 | 福利视频网址 | 免费观看9x视频网站在线观看 | 日韩一区二区三区视频在线 | 二区三区在线视频 | 在线国产片 | 国产99一区二区 | 岛国av在线| 蜜臀久久99静品久久久久久 | 精品影院一区二区久久久 | 国产精品theporn | 亚洲综合最新在线 | 97精品国产97久久久久久免费 | av网站播放 | 中文字幕免费 | 亚洲理论片在线观看 | 成人啪啪18免费游戏链接 | 日本精品视频网站 | 国产91在线观看 | 一区二区三区四区在线 | 久久国产精品久久精品 | 欧美精品做受xxx性少妇 | 日韩一区二区三区免费电影 | 最近高清中文字幕在线国语5 | 日韩在线观看视频中文字幕 | 99热这里只有精品在线观看 | 视频一区二区免费 | av久久在线 | 91最新在线观看 | 正在播放一区 | 亚洲 欧美变态 另类 综合 | www久草| 国产不卡在线 | 91九色网站 | 久久精品79国产精品 | 黄色日本片| 91粉色视频| 涩涩伊人| 色资源二区在线视频 | 在线亚洲观看 | 亚洲精品99久久久久中文字幕 | 中文字幕在线看视频 | 天天天天天天操 | 最新中文字幕在线播放 | 国产999久久久 | 国产99久久久国产精品成人免费 | 日韩av一区二区在线 | free,性欧美 九九交易行官网 | www.国产视频 | 正在播放国产一区 | 欧美大片在线看免费观看 | av电影一区二区三区 | 午夜精品视频在线 | 精品国产一区二区三区蜜臀 | 在线免费观看羞羞视频 | 亚洲永久精品国产 | 色的网站在线观看 | 麻豆视频免费在线观看 | 免费在线播放黄色 | 亚洲精品在线电影 | 日韩欧美精品在线观看视频 | 亚洲不卡av一区二区三区 | 天天操天天干天天摸 | 蜜桃av人人夜夜澡人人爽 | 免费观看成年人视频 | 狠狠狠狠狠狠天天爱 | 91视频久久 | 九九九热精品免费视频观看 | 久久99精品久久久久久久久久久久 | 国产精品综合久久久 | 国产福利91精品一区 | 伊人五月天婷婷 | 亚洲精品视频偷拍 | 亚洲精品中文字幕视频 | 日韩一区精品 | 日日夜夜噜 | 韩日精品视频 | 午夜视频一区二区 | 成人免费观看完整版电影 | 99爱在线观看 | 婷婷久月| 日韩激情三级 | 国产精品国产精品 | 97国产超碰在线 | 精品免费视频. | 亚洲丁香日韩 | 免费亚洲黄色 | 国产精品不卡在线播放 | 成人观看 | 国产免费久久精品 | 中文字幕丝袜美腿 | 亚洲黄色免费网站 | 久久综合欧美精品亚洲一区 | 丁香久久五月 | 免费黄色网址大全 | 摸bbb搡bbb搡bbbb| 免费看国产视频 | www久久精品| 久久躁日日躁aaaaxxxx | 99在线视频网站 | 在线观看国产永久免费视频 | 中文字幕有码在线播放 | 日韩av手机在线看 | 91久久久久久国产精品 | 麻豆 91 在线 | 91视频免费视频 | 久操综合| 日韩在线观看你懂的 | 高清不卡毛片 | 国产一区福利在线 | 成人在线网站观看 | 婷色在线 | 亚洲免费成人av电影 | 国产一区二区三精品久久久无广告 | 日韩精品一区电影 | 国产精品美女毛片真酒店 | 国产成人一区二区啪在线观看 | 91在线资源 | 久久国产精品区 | 国产乱视频 | 99久热在线精品视频观看 | 97超碰精品 | 国产精品麻豆三级一区视频 | 亚洲成人精品在线观看 | 九九久久国产 | 啪啪资源 | 日韩网站在线看片你懂的 | 精品国产123| 中文字幕色在线视频 | 伊人婷婷网 | 韩国av电影网| 亚洲精品乱码久久久久久按摩 | 日本中文在线播放 | 亚洲国产精品久久久久婷婷884 | 香蕉影院在线播放 | 免费在线观看91 | 中文字幕乱码电影 | 免费观看成人网 | 手机成人在线 | 日韩精品中文字幕在线播放 | 男女全黄一级一级高潮免费看 | av在线直接看 | 五月婷婷一级片 | 人成午夜视频 | 美女黄视频免费 | 综合网五月天 | 国产理论一区二区三区 | 天天久久综合 | 安徽妇搡bbbb搡bbbb | 欧美天堂久久 | 国产手机在线视频 | 免费看亚洲毛片 | av福利在线 | 色偷偷av男人天堂 | 国产精品人人做人人爽人人添 | 免费看一级特黄a大片 | 成年一级片| 97天天综合网 | 亚洲精品在线资源 | 久久另类视频 | 日韩精品视频一二三 | av片一区| 国内精品久久久久影院优 | 欧美久久久久久久久中文字幕 | 成人免费一区二区三区在线观看 | 欧美大片www| 在线国产片 | 欧美视频网址 | 91porny九色91啦中文 | 日韩在线视频播放 | av免费片| 在线视频一二区 | 最新免费av在线 | 99精品偷拍视频一区二区三区 | 欧美网站黄色 | 人人干在线| 日本韩国欧美在线观看 | 国产不卡毛片 | 成人黄色电影在线播放 | 精品一区二区三区久久久 | 国产 一区二区三区 在线 | 亚洲传媒在线 | 日韩专区 在线 | 婷婷亚洲最大 | 国产成人精品a | 精品国产一区二区三区日日嗨 | 国产男女免费完整视频 | wwwwww黄| 在线色亚洲 | 免费看一级片 | 免费网站在线观看人 | 在线免费观看视频a | 天天色棕合合合合合合 | 黄色免费视频在线观看 | 免费福利在线播放 | 91视频成人免费 | 国产粉嫩在线 | 人人澡超碰碰97碰碰碰软件 | 国产a级片免费观看 | 欧美一级片在线 | 国产精品一区二区吃奶在线观看 | 日韩大片在线看 | 丁香婷婷成人 | 国产精品日韩在线观看 | 香蕉免费 | 狠狠色狠狠色综合日日小说 | 久久免费中文视频 | 成人黄色小视频 | 日本电影久久 | 国产手机视频在线观看 | 国产精品黄色影片导航在线观看 | 久久激情五月婷婷 | 西西44人体做爰大胆视频 | 婷婷亚洲五月 | 91免费网站在线观看 | 色av网站| 国产精品成人在线观看 | a级国产乱理论片在线观看 伊人宗合网 | 欧美激情综合网 | 日韩午夜精品 | 啪嗒啪嗒免费观看完整版 | 91桃色在线播放 | 国产在线视频资源 | 成人国产精品一区 | 国产91精品高清一区二区三区 | 国产成人精品一区二区在线 | 亚洲精品国偷自产在线91正片 | 免费a级毛片在线看 | 亚洲精品国产精品乱码不99热 | 激情影音 | 欧美综合干 | 国产精品久久久久久久久久ktv | 在线观影网站 | 在线观看免费黄色 | 深爱激情婷婷网 | 久久艹国产视频 | 香蕉视频网站在线观看 | 精品国产免费av | 这里有精品在线视频 | 精品久久久久久亚洲综合网 | 九九久久久久久久久激情 | 久草网站在线观看 | 在线观看你懂的网址 | 麻豆一区在线观看 | 黄色性av | 98超碰在线 | 久久99久久99精品免费看小说 | 国产成人av综合色 | 亚洲人成影院在线 | 人人草网站 | 日韩欧美有码在线 | 国产美女精品人人做人人爽 | 久久精品视频在线 | 久久亚洲私人国产精品va | 国产精品第一页在线观看 | 久久99热精品这里久久精品 | 国产精品久久久久永久免费 | 亚洲成人高清在线 | 国产精品国产自产拍高清av | 久久人人爽av | 精品国产一区二区三区在线 | 天天天色 | 99精品系列 | 国产亚洲精品v | 国产精品福利在线播放 | 看片一区二区三区 | 成年人毛片在线观看 | 9992tv成人免费看片 | 亚洲狠狠婷婷 | 一区二区三区在线免费观看视频 | 奇米影视999 | 久久久久久久久久久久久久免费看 | 亚洲精品免费在线观看 | 日韩欧美国产成人 | 粉嫩高清一区二区三区 | 超碰人人乐 | 日韩免费高清在线 | 成人国产在线 | 中文字幕黄色av | 亚洲一级黄色av | 黄影院 | 国产色秀视频 | 亚洲精品视频在线观看免费视频 | 免费国产在线精品 | 国产最新福利 | 国产欧美综合在线观看 | 免费a视频 | 日韩一级黄色av | 亚洲最大的av网站 | 中文字幕色网站 | 九九热免费在线视频 | 免费在线观看av网址 | 国产特级毛片 | 色婷婷激情综合 | 久久久综合香蕉尹人综合网 | 欧美a影视 | 国产在线色站 | 天天鲁天天干天天射 | 99精品视频一区二区 | 国产亚洲字幕 | 国产精品日韩久久久久 | 久久久视频在线 | av超碰在线| 色射爱| 国内精品国产三级国产aⅴ久 | 一本一道久久a久久精品 | 国产成人亚洲在线观看 | 黄色毛片视频免费 | 又黄又爽又刺激 | 久久激情五月丁香伊人 | 在线观看免费黄色 | 国产中文字幕在线视频 | 一区二区观看 | 国产高清成人在线 | 一区中文字幕 | 337p日本欧洲亚洲大胆裸体艺术 | 日韩欧美在线第一页 | 五月天网页 | 日韩av黄 | 91视频在线| 国产精品久久久久影院日本 | 国产精品1024 | 国产精品久久久久婷婷 | 国产精彩在线视频 | 日韩美女免费线视频 | 国产精品久久久久久婷婷天堂 | 欧美激情操 | 国产精品k频道 | 国产视频一区二区在线播放 | 婷婷综合久久 | 久久在线精品视频 | 成人av影视在线 | 免费在线观看黄网站 | 在线天堂中文www视软件 | 天堂av免费观看 | 青青看片 | 天天干天天干天天射 | 免费看污黄网站 | 亚洲最大的av网站 | 久草网在线观看 | 黄色av影视 | 色网站在线看 | 久久久一本精品99久久精品66 | 国产视频一区二区在线播放 | 日韩色高清 | 亚洲高清av在线 | 国产成人三级在线 | 久久国产精品免费一区二区三区 | 欧美日韩一区二区视频在线观看 | 久久99久久99精品免观看软件 | 日韩午夜视频在线观看 | ,午夜性刺激免费看视频 | 四虎国产精品免费 | 久久久久久久久久久久99 | 日韩在线免费看 | 日日夜夜精品免费 | 国产vs久久 | 午夜精品一区二区三区在线播放 | 免费又黄又爽的视频 | 在线免费视频你懂的 | 国产中文字幕一区二区 | 超碰在线公开免费 | 国产一区二区三区视频在线 | 亚洲aⅴ在线 | 精品一区二区在线看 | 亚洲国产中文字幕在线观看 | 在线日韩中文 | 日韩精品无码一区二区三区 | 在线观看久久久久久 | 在线观看av免费 | 亚洲欧美日韩国产一区二区 | 国产一二三四在线视频 | 91热在线 | 丰满少妇对白在线偷拍 | 国产综合香蕉五月婷在线 | 日韩最新理论电影 | 亚洲区二区 | 国产在线精品福利 | 免费看成人片 | 中文字幕视频一区二区 | www.亚洲精品视频 | 深夜视频久久 | 99久久精品免费看国产免费软件 | 色噜噜狠狠狠狠色综合久不 | 亚洲综合丁香 | 狠狠夜夜 | 9色在线视频 | 亚州精品一二三区 | 国产精久久久 | 日韩在线观看小视频 | 五月婷婷激情网 | 91看片在线看片 | 日韩av一区二区在线影视 | 在线视频免费观看 | 欧美大荫蒂xxx| 国产网站在线免费观看 | www日韩视频 | www.色com| 在线视频精品播放 | 人人爽久久涩噜噜噜网站 | 天天操夜夜摸 | 成 人 黄 色 视频免费播放 | 区一区二在线 | 久久久久综合 | 激情综合六月 | 摸bbb搡bbb搡bbbb| 成人a视频 | 国产中文视 | 久久九九免费 | 在线91视频| 欧美天堂视频在线 | 国产精品激情在线观看 | 日韩高清国产精品 | 久久这里只有精品视频首页 | 国产玖玖在线 | 精品字幕在线 | 亚洲国产三级在线观看 | 精品一区二区久久久久久久网站 | 在线观看视频你懂的 | 亚洲成a人片77777kkkk1在线观看 | 丁香婷婷在线观看 | 久草精品视频在线看网站免费 | 欧美精品二区 | 欧美一区二区日韩一区二区 | 四虎在线观看网址 | www.久久婷婷 | 日一日干一干 | 三级在线国产 | 欧美色图亚洲图片 | 色婷在线 | 日本久久电影 | 一区二区三区在线免费观看视频 | 精品高清视频 | 日韩欧美91| 国产一级片免费播放 | 久久久久久国产精品久久 | 亚洲三级在线免费观看 | 丝袜制服综合网 | 狠狠色噜噜狠狠 | 91人人澡人人爽人人精品 | 97视频一区 | 日韩三级视频在线看 | 久久久人人爽 | 欧美一区中文字幕 | 欧美成年黄网站色视频 | 91麻豆免费看 | 国产精品麻豆一区二区三区 | 成人黄色一级视频 | 国产91aaa| 亚洲第一区在线观看 | 日本公妇在线观看 | 欧美一区二区三区在线视频观看 | 国产日韩欧美自拍 | 激情五月看片 | .国产精品成人自产拍在线观看6 | 黄色影院在线播放 | 亚洲自拍偷拍色图 | 精品国产乱码一区二区三区在线 | 69xx视频 | 97人人模人人爽人人喊中文字 | 一级国产视频 | 国产精品嫩草69影院 | 91人人干| 久久国产三级 | 国产精品成人av久久 | 日韩色在线| 色天天综合网 | 激情电影影院 | 国内毛片毛片 | 韩国在线一区 | 日本精品在线看 | www.天天成人国产电影 | 99精品毛片 | 亚洲国产丝袜在线观看 | 97视频久久久 | 91九色网址 | 在线观看完整版 | 欧美一级免费片 | 成人av在线播放网站 | 亚洲精品久久久久中文字幕二区 | 超碰公开97| 天天操狠狠操 | 91精品一区二区三区久久久久久 | 视频99爱| 精品在线视频一区二区三区 | 狠狠操影视 | 中文在线 | 精品在线视频一区 | 狠狠精品| 亚洲精品影视在线观看 | 亚洲黄色小说网 | 精品国产亚洲在线 | 伊人影院av | 国产免码va在线观看免费 | 天天干天天射天天插 | 日韩理论电影在线 | 天天草天天 | 亚洲国产片色 | 久久综合干| 国产理论一区二区三区 | 91成人精品在线 | 精品亚洲一区二区 | 免费观看v片在线观看 | 丰满少妇在线观看资源站 | 国产糖心vlog在线观看 | 亚洲精品国产精品国自产在线 | 亚洲第一区在线播放 | 又黄又爽又湿又无遮挡的在线视频 | 欧女人精69xxxxxx | 久久免费福利视频 | 亚洲欧美国产视频 | 亚洲另类视频在线观看 | 久久久久免费网 | a成人v在线 | 色妞色视频一区二区三区四区 | 色噜噜日韩精品欧美一区二区 | 超碰在线9 | 国产三级香港三韩国三级 | 亚洲一级国产 | 日韩毛片在线免费观看 | 天天干 天天摸 天天操 | 激情文学综合丁香 | 美女一二三区 | 中文字幕国产一区 | 国产亚洲欧洲 | 久久成人一区二区 | 久久精品视频在线免费观看 | 少妇搡bbbb搡bbb搡aa | 国产成人在线播放 | 天堂av网站 | 在线一二三四区 | av夜夜操| 国产精品免费视频网站 | 久久久美女| 国产精品video | 人人舔人人爱 | av在线电影免费观看 | 国产一区二区久久久久 | 亚洲无毛专区 | 97理论片 | 国产手机在线播放 | 中文字幕高清免费日韩视频在线 | 一区二精品 | 99精品久久久久久久久久综合 | 正在播放一区二区 | av大全在线看 | 色在线免费观看 | 午夜精品久久久久久中宇69 | 久久99这里只有精品 | 国产精品人人做人人爽人人添 | 精品视频久久 | 欧美精品一区二区免费 | 夜色资源网 | 国产成人精品一区二区在线 | 中文字幕在线色 | 国色天香第二季 | 69国产在线观看 | 美女网站在线观看 | 色丁香久久 | 亚洲一区免费在线 | 激情婷婷久久 | 久久久久久久久久伊人 | 色综合久久久久综合99 | 色综合久久久久综合体桃花网 | 久久国产亚洲 | 人人舔人人插 | 91传媒91久久久 | 成人欧美在线 | 国产一区二区三区免费在线 | 毛片永久免费 | 777视频在线观看 | 日韩美女av在线 | 久久久免费观看视频 | 中文字幕最新精品 | 久久伦理 | 特级西西人体444是什么意思 | 伊人色综合网 | 国产精品一区二区电影 | av成人动漫 | 91精品啪在线观看国产81旧版 | av手机在线播放 | 日日久视频 | 日韩av网页 | 狠狠躁夜夜av | 麻豆果冻剧传媒在线播放 | 在线黄色国产 | 日韩午夜电影 | 欧美日韩中文在线 | 国产视频精品免费 | 99久久精品无码一区二区毛片 | 精品国产视频在线观看 | 国产精品成人久久久久久久 | 国产中文字幕视频在线 | 日韩综合一区二区 | 首页av在线 | 狠狠搞,com| 久久精品一区二区三区国产主播 | 99久久99久久综合 | 在线观看你懂的网站 | 国产成人黄色片 | 一区二区精品视频 | 日本久久久久久久久久久 | 成人一区二区在线观看 | 精品色999| 亚洲国产成人在线观看 | 久久欧美在线电影 | 草久在线 | 日韩欧美在线播放 | 国产精品欧美一区二区三区不卡 | 免费成人av在线 | 激情五月婷婷综合网 | 国产视频久久久 | 成人高清在线观看 | 99一级片 | 中文一区在线 | 久久综合久色欧美综合狠狠 | 91在线看免费 | 久久人人爽 | 久久极品 | 探花视频免费观看高清视频 | 色综合在 | 精品久久精品 | 91精品国产欧美一区二区成人 | 精品专区 | 91在线看视频免费 | 精品1区二区 | 日韩午夜视频在线观看 | 91成人网在线观看 | 日韩美在线观看 | 国产中文字幕在线免费观看 | 久久久久久久99 | 日韩中文字幕免费看 | 美女精品在线 | 国内精品一区二区 | 免费高清在线观看成人 | 久久视了| 亚洲作爱 | 91人人揉日日捏人人看 | 中文字幕黄色网址 | 久久久精品日本 | 天天看天天操 | 亚洲一级在线观看 | 国产黄色理论片 | 中文字幕第一页在线vr | 九九九热精品免费视频观看 | 婷婷爱五月天 | 免费在线一区二区三区 | 四虎成人精品永久免费av九九 | 日韩在线三区 | 国产专区在线 | 国偷自产视频一区二区久 | 精品在线二区 | 国产成人一区二区三区在线观看 | 久久久91精品国产 | 亚洲精品黄色片 | 日本中文乱码卡一卡二新区 | 久久婷婷影视 | 亚洲精品九九 | 91视频国产高清 | 欧美国产不卡 | 日韩 在线| 中文字幕av全部资源www中文字幕在线观看 | 在线观看中文字幕网站 | 视频在线观看日韩 | 国产成人一区在线 | 亚洲三级在线播放 | av在线免费不卡 | 人人澡人人添人人爽一区二区 | 欧美中文字幕第一页 | 亚洲午夜精品福利 | 欧美日韩国产区 | 欧美精品一区二区在线播放 | 特级西西444www大精品视频免费看 | 91av久久 | av播放在线| 欧美一二区视频 | 亚洲精品18日本一区app | 午夜视频在线观看一区二区三区 | 日本精品在线视频 | 国产成人在线综合 | 日韩精品免费一区二区三区 | 97在线观视频免费观看 | 人人澡人 | 91精品一区二区三区蜜臀 | 久草在线资源免费 | 国产中文字幕视频在线 | 伊人五月 | 欧美三级在线播放 | 久久精品在线免费观看 | 亚洲网站在线看 | 色停停五月天 | 激情久久网 | a√天堂中文在线 | 午夜国产福利在线 | 国产成人精品av在线 | 高清精品久久 | 国产精品一区免费观看 | 国产又黄又猛又粗 | 久久免费电影网 | 久久99久国产精品黄毛片入口 | 国产精品入口麻豆www | 天天干,夜夜爽 | 精品国产1区2区3区 国产欧美精品在线观看 | 欧美精品亚洲精品 | 91桃色免费观看 | 黄色小网站在线观看 | 三级午夜片 | 色综合天天干 | 午夜av在线免费 | 美女网站黄免费 | 成人av播放 | 精品国产一区二区三区四区vr | 五月婷婷狠狠 | 66av99精品福利视频在线 | 91在线porny国产在线看 | 久久99操| 探花国产在线 | 国产精品com | 99视频在线精品国自产拍免费观看 | 国产成人免费观看 | 草久在线| 正在播放 久久 | 99久久99热这里只有精品 | 亚洲国产精品成人综合 | 91在线视频播放 | 九九热在线免费观看 | 久久婷婷一区二区三区 | 97超碰人人澡人人爱学生 | 久久人人爽人人爽人人片av软件 | 天堂网中文在线 | 在线观看视频免费大全 | 九九久久久久久久久激情 | 又色又爽又黄高潮的免费视频 | 亚洲h色精品 | 成人综合婷婷国产精品久久免费 | 日韩中文字幕免费在线播放 | 在线国产一区二区三区 | 国产精品专区一 | 亚洲日韩中文字幕在线播放 | 在线观看黄色大片 | 美女免费黄网站 | 亚洲精品在线观看不卡 | 国产原创在线 | 在线看v片| 黄色一级在线视频 | www.久久久精品| 91插插插免费视频 | 天堂av观看 | 特黄一级毛片 | 久久神马影院 | 久久久在线免费观看 | 免费a网址| 精品免费在线视频 | 91资源在线免费观看 | 三级黄色片子 | 国产精品国产三级国产不产一地 | 日韩欧美精品在线观看 | av不卡中文 | 国产成人精品免费在线观看 | 日韩免费高清在线 | 国产精品久久久 | 亚洲人成人在线 | 亚洲欧洲精品一区二区精品久久久 | 久草精品视频在线观看 | 激情综合色综合久久综合 | 高清av网 | 久久久久欠精品国产毛片国产毛生 | 天天色天天爱天天射综合 | 亚洲精品综合欧美二区变态 | 九九久久在线看 | 91网址在线观看 | 亚洲精品综合一二三区在线观看 | 九九免费视频 | 玖玖爱在线观看 | 爱av在线网| 亚洲成 人精品 | 91九色综合| 在线观看免费国产小视频 | 午夜精品久久久久久久99婷婷 | 日韩a在线播放 | 奇米网网址| 国产精品999久久久 久产久精国产品 | 激情深爱五月 | 日本电影久久 | 天天爱天天操天天干 | 天天操天天综合网 | 69久久夜色精品国产69 | 最近中文字幕国语免费高清6 | 久久久久久蜜桃一区二区 | 精品久久久久久久 | 亚洲精品在线观看的 | 国产精品少妇 | 国产亚洲视频在线免费观看 | 麻豆视频在线免费 | 毛片激情永久免费 | 亚洲成人精品 | 911久久香蕉国产线看观看 | 香蕉视频网站在线观看 | 日本精品免费看 | 亚洲综合色播 | 国产精品久久久久9999 | 黄色av网站在线免费观看 | 视频一区二区三区视频 | 国产精品青青 | 免费电影一区二区三区 | 狠狠色丁香婷婷综合最新地址 | 玖玖爱国产在线 | 免费福利在线 | 在线观看aa| 五月情婷婷 | 亚洲精品久久久久999中文字幕 | 91黄色视屏 | 久久久久久久影视 | 午夜91视频 | 九九视频免费观看视频精品 | 99热网站| 人人狠狠| 亚洲最大av在线播放 | 国产在线精品二区 | 黄色免费网战 | 国产在线播放一区 | 91精品久久久久久综合乱菊 | 日韩激情av在线 | 国产免费黄色 | 久久久免费观看完整版 | 成人av影视在线 | 久久视频国产 | 808电影免费观看三年 | 中文字幕av电影下载 | 在线观看日韩中文字幕 | 久久高清视频免费 | 免费在线观看国产黄 | 蜜桃视频色 | 色综合在| av永久网址 | 日韩中文字幕网站 | 日韩一级成人av | 91大神视频网站 | 碰超在线| 中文字幕高清有码 | 97色在线观看免费视频 | 日韩视频一区二区三区 | 亚洲成人精品国产 | 一级性av| 在线看岛国av| 综合久久久久久久 | 成人一区二区在线 | 久久精品亚洲综合专区 | 亚洲欧美日韩精品一区二区 | 91在线看 | 中文字幕亚洲精品在线观看 | 精品一区中文字幕 | 国产精品免费在线 | 亚洲精品66 | 成人91在线| 奇米影视999| 国产一区二区手机在线观看 | 亚洲闷骚少妇在线观看网站 | 蜜臀av性久久久久蜜臀av | 99精品电影| 免费福利片 | 久久国产a| 日一日干一干 | 久久99精品久久久久久久久久久久 | 91精品在线免费视频 | 亚洲成人av在线播放 | 伊色综合久久之综合久久 | 久久久三级视频 | 美女视频久久久 | 国产不卡一 | 日韩午夜小视频 | 一级欧美日韩 | 国产精品久久久久毛片大屁完整版 | 在线免费观看黄 | 国产精品久久99综合免费观看尤物 | 久久久久国产精品免费 | 91成人免费看 | 中文字幕亚洲五码 | av激情五月| 天天色天天射天天综合网 | 国产成人1区 | 激情五月看片 | 色综合久久精品 | 日韩激情片在线观看 | 日韩和的一区二在线 | 国产一级精品视频 | 久久99国产综合精品免费 | 人人精品久久 | 一区二区三区精品久久久 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日韩电影久久 | 一区二区三区在线看 | 亚洲专区在线播放 | 91视频免费看网站 | 国产色在线,com | av免费网页| 亚洲成人网在线 | 久久久久久久18 | 中文字幕中文字幕中文字幕 | 一区二区欧美激情 | 国产不卡视频在线播放 | 成人禁用看黄a在线 | 日日激情 | 亚洲一区二区三区91 | 91人人爽人人爽人人精88v | 91精品国自产在线偷拍蜜桃 | 午夜免费电影院 | 国产视频九色蝌蚪 | 中文字幕亚洲欧美 | 国产精品激情偷乱一区二区∴ | 在线播放 亚洲 | a成人v在线| 国产一区成人在线 | 奇米先锋 | 香蕉精品视频在线观看 | 亚洲天天干 | 超碰99人人| 久久综合免费视频影院 | 天天天天色综合 | 欧美日韩在线观看一区二区 | 97精品在线观看 | 国产福利91精品 | 国产中文欧美日韩在线 | 日韩av在线看 | 国产看片免费 | 精品久久网 | 国内视频在线 | 亚洲精品国产精品久久99热 | 中文字幕人成乱码在线观看 | 91新人在线观看 | 91久久丝袜国产露脸动漫 | 久久精品综合 | 国产99一区视频免费 | 免费美女av | 91在线免费视频 | 欧美在线一二区 | 亚洲 欧美 国产 va在线影院 | 免费国产一区二区 | 成全在线视频免费观看 | 天天碰天天操视频 |