c/c++语言开发共享C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

C++ 与cocos2d-x-4.0完成太空飞机大战 (二)动画演示飞机精灵编码:AircraftSprite.cpp飞机精灵编码:AircraftSprite.h飞机动画编码:Aircraft.cpp飞机动画编码:Aircraft.h动画演示飞机精灵编码:AircraftSprite.cpp#include “AircraftSprite.h”#include “ActionBase.h”namespace SpaceWar {AircraftSprite::AircraftSprit

C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

  • 动画演示
  • 飞机精灵编码:AircraftSprite.cpp
  • 飞机精灵编码:AircraftSprite.h
  • 飞机动画编码:Aircraft.cpp
  • 飞机动画编码:Aircraft.h

动画演示

C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

飞机精灵编码:AircraftSprite.cpp

#include "AircraftSprite.h" #include "ActionBase.h"  namespace SpaceWar {  	AircraftSprite::AircraftSprite() 	{ 	}  	AircraftSprite::~AircraftSprite() 	{ 	} }   

飞机精灵编码:AircraftSprite.h

#pragma once #include "cocos2d.h" #include "SpriteBase.h"  using namespace std; using namespace cocos2d;  namespace SpaceWar { 	class ActionBase;  	class AircraftSprite : public SpriteBase 	{ 	public: 		AircraftSprite(); 		virtual ~AircraftSprite();  		ActionBase* actBase = nullptr;  		/*玩家标识,0:玩家1,1:玩家2*/ 		int playerTag = 0;  		/*飞机类型*/ 		int airType = 0;  		/*飞行速度*/ 		int airSpeed = 0;  		/*武器威力*/ 		int armPower = 1;  		/*武器类型*/ 		int armType = 0;  		/*武器上次发射时间*/ 		long armTime = 0;  		/*导弹威力*/ 		int missilePower = 1;  		/*导弹类型*/ 		int missileType = -1;  		/*导弹上次发射时间*/ 		long missileTime = 0;  		/*炸弹数量*/ 		int bombCount = 3;  		/*炸弹类型*/ 		int bombType = 0;  		/*炸弹上次发射时间*/ 		long bombTime = 0;  		/*碰撞次数*/ 		int collisionCount = 0;  		/*最大碰撞次数*/ 		int maxCollisionCount = 0;  		/*碰撞类型掩码*/ 		int category = 0b111;  		/*碰撞掩码*/ 		int collision = 0b000;  		/*碰撞事件掩码*/ 		int contact = 0b110;  		/*是否允许重力*/ 		bool gravityEnable = false;  		/*是否允许碰撞*/ 		bool collisionEnable = false;  		/*是否允许控制*/ 		bool controlEnable = false; 	}; }   

飞机动画编码:Aircraft.cpp

#include "Aircraft.h" #include "ActionBase.h"  namespace SpaceWar {  	Aircraft::Aircraft() 	{ 	}  	Aircraft::~Aircraft() 	{ 	}  	bool Aircraft::init(int pTag, int aType) 	{ 		Size vsize = Director::getInstance()->getVisibleSize(); 		this->playerTag = pTag; 		string airImg = "fj.png"; 		if (aType == 1) { 			airImg = "fj1.png"; 		} 		auto pinfo = AutoPolygon::generatePolygon(airImg); 		sprite = new AircraftSprite(); 		sprite->actBase = this->actBase; 		sprite->airType = aType; 		sprite->playerTag = pTag; 		int tag = 100; 		AircraftSprite::create(sprite, pinfo); 		if (sprite != nullptr) 		{ 			auto size = sprite->getContentSize(); 			auto body = Util::getPhysicsBody(pinfo, size, tag, sprite->category, sprite->collision, sprite->contact, sprite->gravityEnable); 			sprite->setPhysicsBody(body); 			sprite->setTag(tag); 			float w2 = (vsize.width / 2) / 2; 			if (pTag == 1) 			{ 				w2 = (vsize.width / 2) + w2; 			} 			sprite->collisionEnable = false; 			sprite->setPosition(Vec2(w2, -sprite->getContentSize().height)); 			auto moveTo = MoveTo::create(1.0f, Vec2(w2, vsize.height / 2 / 2)); 			auto moveTo1 = MoveTo::create(1.0f, Vec2(w2, sprite->getContentSize().height * 3)); 			auto sequence = Sequence::create(moveTo, moveTo1, NULL); 			sprite->runAction(sequence); 			auto blink = Blink::create(4.0f, 20); 			auto actCollEnable = CallFunc::create(std::bind(&Aircraft::setCollisionEnable, this, true)); 			auto sequence1 = Sequence::create(blink, actCollEnable, NULL); 			sprite->runAction(sequence1); 			SpriteFrameCache::getInstance()->addSpriteFramesWithFile("zd01.plist"); 			auto frames = Util::getAnimation("%d.png", 3); 			auto w_sprite = Sprite::createWithSpriteFrame(frames.front()); 			w_sprite->setScale(0.5f); 			w_sprite->setScale(0.5f, 0.2f); 			w_sprite->setPosition(Vec2(sprite->getContentSize().width / 2, -20.0f)); 			auto animation = Animation::createWithSpriteFrames(frames, 0.1f / 3); 			auto animate = Animate::create(animation); 			auto repeat = RepeatForever::create(animate); 			w_sprite->runAction(repeat); 			sprite->addChild(w_sprite); 			return true; 		} 		return false; 	}  	void Aircraft::setCollisionEnable(bool isEnable) 	{ 		sprite->collisionEnable = isEnable; 	}  	/*飞机控制*/ 	void Aircraft::controlAction(int player) 	{ 		int *cact = actBase->colAct.controlAct; 		if (sprite == nullptr) 		{ 			return; 		} 		Size ssize = sprite->getContentSize(); 		Vec2 position = sprite->getPosition(); 		float speed = 1.5; 		if (sprite->airSpeed == 1) 		{ 			speed = 2.0; 		} 		else if (sprite->airSpeed == 2) 		{ 			speed = 2.5; 		} 		else if (sprite->airSpeed == 3) 		{ 			speed = 3.0; 		} 		else if (sprite->airSpeed > 3) 		{ 			speed = 3.5; 		} 		if (player == 1) 		{ 			if (cact[100] == 1) 			{ 				Util::spriteSceneMove(0, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[101] == 1) 			{ 				Util::spriteSceneMove(1, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[102] == 1) 			{ 				Util::spriteSceneMove(2, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[103] == 1) 			{ 				Util::spriteSceneMove(3, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[104] == 1) 			{ 				launchBullet(); 				launchMissile(); 			} 			if (cact[105] == 1) 			{ 				launchBomb(); 			} 		} 		else 		{ 			if (cact[0] == 1) 			{ 				Util::spriteSceneMove(0, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[1] == 1) 			{ 				Util::spriteSceneMove(1, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[2] == 1) 			{ 				Util::spriteSceneMove(2, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[3] == 1) 			{ 				Util::spriteSceneMove(3, sprite, actBase->vSize, ssize, position, speed); 			} 			if (cact[4] == 1) 			{ 				launchBullet(); 				launchMissile(); 			} 			if (cact[5] == 1) 			{ 				launchBomb(); 			} 		} 	}  	/*发射子弹*/ 	void Aircraft::launchBullet() 	{ 		if (sprite->armType == 1) 		{ 			launchBullet2(); 		} 		else 		{ 			launchBullet1(); 		} 	}  	/*发射子弹1*/ 	void Aircraft::launchBullet1() 	{ 		int bspeed = 250; 		if (sprite->armPower > 5) 		{ 			bspeed = 100; 		} 		else if (sprite->armPower > 3) 		{ 			bspeed = 150; 		} 		else if (sprite->armPower > 2) 		{ 			bspeed = 200; 		} 		if (!Util::isIntervalTime(bspeed, &sprite->armTime)) 		{ 			return; 		} 		AudioEngine::play2d("zd1.ogg", false, 0.2f); 		auto pinfo = AutoPolygon::generatePolygon("fgzd.png"); 		int tag = 5; 		float bulletSpeed = 2.0f; 		if (sprite->armPower == 2) 		{ 			bulletSpeed = 1.8f; 		} 		else if (sprite->armPower == 3) 		{ 			bulletSpeed = 1.6f; 		} 		else if (sprite->armPower == 4) 		{ 			bulletSpeed = 1.4f; 		} 		else if (sprite->armPower == 5) 		{ 			bulletSpeed = 1.2f; 		} 		else if (sprite->armPower > 5) 		{ 			bulletSpeed = 1.0f; 		} 		createBullet1(&pinfo, tag, bulletSpeed, 0); 		if (sprite->armPower > 2) 		{ 			createBullet1(&pinfo, tag, bulletSpeed, 10); 			createBullet1(&pinfo, tag, bulletSpeed, -10); 		} 		if (sprite->armPower > 4) 		{ 			createBullet1(&pinfo, tag, bulletSpeed, 20); 			createBullet1(&pinfo, tag, bulletSpeed, -20); 		} 		if (sprite->armPower > 5) 		{ 			createBullet1(&pinfo, tag, bulletSpeed, 30); 			createBullet1(&pinfo, tag, bulletSpeed, -30); 		} 	}  	void Aircraft::createBullet1(PolygonInfo* pinfo, int tag, float speed, float startX) 	{ 		Vec2 svec = sprite->getPosition(); 		auto b_sprite = new BulletSprite(); 		b_sprite->actBase = this->actBase; 		BulletSprite::create(b_sprite, *pinfo); 		auto size = b_sprite->getContentSize(); 		auto b_body = Util::getPhysicsBody(*pinfo, size, tag, b_sprite->category, b_sprite->collision, b_sprite->contact, b_sprite->gravityEnable); 		b_sprite->setPhysicsBody(b_body); 		b_sprite->setTag(tag); 		b_sprite->playerTag = sprite->playerTag; 		b_sprite->setPosition(Vec2(svec.x + startX, svec.y + size.height * 2)); 		auto moveBy = MoveBy::create(speed, Vec2(0, actBase->vSize.height + size.height)); 		auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, b_sprite)); 		auto sequence = Sequence::create(moveBy, actRuin, NULL); 		b_sprite->runAction(sequence); 		actBase->addChild(b_sprite, 0); 	}  	/*发射子弹2*/ 	void Aircraft::launchBullet2() 	{ 		int bspeed = 400; 		if (sprite->armPower > 5) 		{ 			bspeed = 250; 		} 		else if (sprite->armPower > 3) 		{ 			bspeed = 300; 		} 		else if (sprite->armPower > 2) 		{ 			bspeed = 350; 		} 		if (!Util::isIntervalTime(bspeed, &sprite->armTime)) 		{ 			return; 		} 		AudioEngine::play2d("zd1.ogg", false, 0.2f); 		auto pinfo = AutoPolygon::generatePolygon("fgzd.png"); 		int tag = 5; 		float bulletSpeed = 2.0f; 		if (sprite->armPower == 2) 		{ 			bulletSpeed = 1.8f; 		} 		else if (sprite->armPower == 3) 		{ 			bulletSpeed = 1.6f; 		} 		else if (sprite->armPower == 4) 		{ 			bulletSpeed = 1.4f; 		} 		else if (sprite->armPower == 5) 		{ 			bulletSpeed = 1.2f; 		} 		else if (sprite->armPower > 5) 		{ 			bulletSpeed = 1.0f; 		} 		createBullet2(&pinfo, tag, bulletSpeed, 0, 0); 		if (sprite->armPower > -1) 		{ 			createBullet2(&pinfo, tag, bulletSpeed, 10, 150); 			createBullet2(&pinfo, tag, bulletSpeed, -10, -150); 		} 		if (sprite->armPower > 3) 		{ 			createBullet2(&pinfo, tag, bulletSpeed, 20, 250); 			createBullet2(&pinfo, tag, bulletSpeed, -20, -250); 		} 		if (sprite->armPower > 5) 		{ 			createBullet2(&pinfo, tag, bulletSpeed, 30, 350); 			createBullet2(&pinfo, tag, bulletSpeed, -30, -350); 		} 	}  	void Aircraft::createBullet2(PolygonInfo* pinfo, int tag, float speed, float startX, float endX) 	{ 		Vec2 svec = sprite->getPosition(); 		auto b_sprite = new BulletSprite(); 		b_sprite->actBase = this->actBase; 		BulletSprite::create(b_sprite, *pinfo); 		auto size = b_sprite->getContentSize(); 		auto b_body = Util::getPhysicsBody(*pinfo, size, tag, b_sprite->category, b_sprite->collision, b_sprite->contact, b_sprite->gravityEnable); 		b_sprite->setPhysicsBody(b_body); 		b_sprite->setTag(tag); 		b_sprite->playerTag = sprite->playerTag; 		b_sprite->setPosition(Vec2(svec.x + startX, svec.y + size.height * 2)); 		auto moveBy = MoveBy::create(speed, Vec2(endX, actBase->vSize.height + size.height)); 		auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, b_sprite)); 		auto sequence = Sequence::create(moveBy, actRuin, NULL); 		b_sprite->runAction(sequence); 		actBase->addChild(b_sprite, 0); 	}  	/*发射导弹*/ 	void Aircraft::launchMissile() 	{ 		if (sprite->missileType < 0) 		{ 			return; 		} 		if (sprite->missileType == 1) 		{ 			launchMissile2(); 		} 		else 		{ 			launchMissile1(); 		} 	}  	/*发射导弹1*/ 	void Aircraft::launchMissile1() 	{ 		int bspeed = 850; 		if (sprite->missilePower > 5) 		{ 			bspeed = 700; 		} 		else if (sprite->missilePower > 3) 		{ 			bspeed = 750; 		} 		else if (sprite->missilePower > 2) 		{ 			bspeed = 800; 		} 		if (!Util::isIntervalTime(bspeed, &sprite->missileTime)) 		{ 			return; 		} 		float bulletSpeed = 6.0f; 		float bulletScale = 0.5f; 		int bulletPower = 10; 		if (sprite->missilePower == 2) 		{ 			bulletSpeed = 6.5f; 			bulletScale = 0.55f; 			bulletPower = 12; 		} 		else if (sprite->missilePower == 3) 		{ 			bulletSpeed = 7.0f; 			bulletScale = 0.60f; 			bulletPower = 14; 		} 		else if (sprite->missilePower == 4) 		{ 			bulletSpeed = 7.5f; 			bulletScale = 0.65f; 			bulletPower = 16; 		} 		else if (sprite->missilePower == 5) 		{ 			bulletSpeed = 8.0f; 			bulletScale = 0.70f; 			bulletPower = 18; 		} 		else if (sprite->missilePower > 5) 		{ 			bulletSpeed = 8.5f; 			bulletScale = 0.75f; 			bulletPower = 20; 		} 		Size vsize = Director::getInstance()->getVisibleSize(); 		Vec2 svec = sprite->getPosition(); 		auto pinfo = AutoPolygon::generatePolygon("air_Missile.png"); 		Size size; 		Size size1; 		int tag = 5; 		if (sprite->missilePower > -1) 		{ 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 10, 0); 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -10, 0); 		} 		if (sprite->missilePower > 3) 		{ 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 20, 40); 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -20, 40); 		} 		if (sprite->missilePower > 5) 		{ 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 30, 80); 			createMissile1(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -30, 80); 		} 	}  	void Aircraft::createMissile1(PolygonInfo* pinfo, int tag, float scale, int power, float speed, float startX, float startY) 	{ 		Vec2 svec = sprite->getPosition(); 		auto b_sprite = new BulletSprite(); 		b_sprite->actBase = this->actBase; 		BulletSprite::create(b_sprite, *pinfo); 		Size size = b_sprite->getBoundingBox().size; 		auto b_body = Util::getPhysicsBody(*pinfo, size, tag, b_sprite->category, b_sprite->collision, b_sprite->contact, b_sprite->gravityEnable); 		b_sprite->setPhysicsBody(b_body); 		b_sprite->setScale(scale); 		b_sprite->bulletSpeed = speed; 		size = b_sprite->getBoundingBox().size; 		b_sprite->setTag(tag); 		b_sprite->bulletPower = power; 		b_sprite->playerTag = sprite->playerTag; 		b_sprite->setPosition(Vec2(svec.x + startX, svec.y + startY)); 		Vec2 v2 = Vec2(0, actBase->vSize.height + size.height); 		float mTime = Util::getMoveTime(b_sprite->bulletSpeed, v2.y); 		auto moveBy = MoveBy::create(mTime, v2); 		auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, b_sprite)); 		auto sequence = Sequence::create(moveBy, actRuin, NULL); 		b_sprite->runAction(sequence); 		actBase->addChild(b_sprite, 0); 	}  	/*发射导弹2*/ 	void Aircraft::launchMissile2() 	{ 		int bspeed = 850; 		if (sprite->missilePower > 5) 		{ 			bspeed = 700; 		} 		else if (sprite->missilePower > 3) 		{ 			bspeed = 750; 		} 		else if (sprite->missilePower > 2) 		{ 			bspeed = 800; 		} 		if (!Util::isIntervalTime(bspeed, &sprite->missileTime)) 		{ 			return; 		} 		float bulletSpeed = 5.0f; 		float bulletScale = 0.3f; 		int bulletPower = 4; 		if (sprite->missilePower == 2) 		{ 			bulletSpeed = 5.5f; 			bulletScale = 0.35f; 			bulletPower = 5; 		} 		else if (sprite->missilePower == 3) 		{ 			bulletSpeed = 6.0f; 			bulletScale = 0.40f; 			bulletPower = 6; 		} 		else if (sprite->missilePower == 4) 		{ 			bulletSpeed = 6.5f; 			bulletScale = 0.45f; 			bulletPower = 7; 		} 		else if (sprite->missilePower == 5) 		{ 			bulletSpeed = 7.0f; 			bulletScale = 0.50f; 			bulletPower = 8; 		} 		else if (sprite->missilePower > 5) 		{ 			bulletSpeed = 7.5f; 			bulletScale = 0.55f; 			bulletPower = 10; 		} 		auto pinfo = AutoPolygon::generatePolygon("air_Missile1.png"); 		int tag = 5; 		if (sprite->missilePower > -1) 		{ 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 10, 50, 10); 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -10, -50, -10); 		} 		if (sprite->missilePower > 3) 		{ 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 20, 200, 20); 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -20, -200, -20); 		} 		if (sprite->missilePower > 5) 		{ 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, 30, 300, 30); 			createMissile2(&pinfo, tag, bulletScale, bulletPower, bulletSpeed, -30, -300, -30); 		} 	}  	void Aircraft::createMissile2(PolygonInfo* pinfo, int tag, float scale, int power, float speed, float startX, float endX, float rotation) 	{ 		Vec2 svec = sprite->getPosition(); 		auto b_sprite = new BulletSprite(); 		b_sprite->actBase = this->actBase; 		BulletSprite::create(b_sprite, *pinfo); 		Size size = b_sprite->getBoundingBox().size; 		auto b_body = Util::getPhysicsBody(*pinfo, size, tag, b_sprite->category, b_sprite->collision, b_sprite->contact, b_sprite->gravityEnable); 		b_sprite->setPhysicsBody(b_body); 		b_sprite->setScale(scale); 		size = b_sprite->getBoundingBox().size; 		b_sprite->setTag(tag); 		b_sprite->bulletPower = power; 		b_sprite->playerTag = sprite->playerTag; 		b_sprite->setPosition(Vec2(svec.x + startX, svec.y)); 		b_sprite->bulletSpeed = speed; 		Node* eNode = Util::getRandomNode(&actBase->enemyNodes, 50, 400, b_sprite->getPosition()); 		if (eNode != nullptr) 		{ 			b_sprite->trackKey = eNode->getName(); 			b_sprite->trackPoint = eNode->getPosition(); 			b_sprite->moveSpeed = Util::getTrackPosition(b_sprite->bulletSpeed, b_sprite->getPosition(), eNode->getPosition()); 			b_sprite->isTrack = true; 		} 		if (!b_sprite->isTrack) 		{ 			Vec2 endPoint = Vec2(endX, actBase->vSize.height + size.height); 			float mTime = Util::getMoveTime(b_sprite->bulletSpeed, endPoint.y); 			auto moveBy = MoveBy::create(mTime, endPoint); 			b_sprite->runAction(moveBy); 			b_sprite->setRotation(rotation); 		} 		actBase->addChild(b_sprite, 0); 	}  	/*发射炸弹*/ 	void Aircraft::launchBomb() 	{ 		if (sprite->bombCount < 1) 		{ 			return; 		} 		if (!Util::isIntervalTime(1000, &sprite->bombTime)) 		{ 			return; 		} 		--sprite->bombCount; 		if (sprite->bombType == 1) 		{ 			launchBomb2(); 		} 		else 		{ 			launchBomb1(); 		} 	}  	/*发射炸弹类型1*/ 	void Aircraft::launchBomb1() 	{ 		int playerTag = sprite->playerTag; 		Vec2 svec = sprite->getPosition(); 		Size size = sprite->getBoundingBox().size; 		float sw = 20; 		float ew = actBase->vSize.width - 20; 		float sh = svec.y - actBase->vSize.height / 2; 		float eh = svec.y + actBase->vSize.height / 2; 		SpriteFrameCache::getInstance()->addSpriteFramesWithFile("fjbz.plist"); 		auto frames = Util::getAnimation("fjbz(%d).png", 16); 		int tag = 6; 		for (int i = 0; i < 50; ++i) 		{ 			auto delayAnimate = CallFunc::create(std::bind(&Aircraft::createBombAnimate, this, frames, tag, playerTag, sw, ew, sh, eh)); 			auto dtime = DelayTime::create(random(0.0f, 1.0f)); 			auto sequence = Sequence::create(dtime, delayAnimate, NULL); 			actBase->runAction(sequence); 		} 	}  	void Aircraft::createBombAnimate(Vector<SpriteFrame*> frames, int tag, int playerTag, float sw, float ew, float sh, float eh) 	{ 		auto bsprite = new BombSprite(); 		BombSprite::createWithSpriteFrame(bsprite, frames.front()); 		bsprite->setScale(random(1.0f, 5.0f)); 		bsprite->setPosition(Vec2(random(sw, ew), random(sh, eh))); 		auto body = Util::getPhysicsBody(bsprite->getBoundingBox().size, tag, bsprite->category, bsprite->collision, bsprite->contact, bsprite->gravityEnable); 		bsprite->setPhysicsBody(body); 		bsprite->setTag(tag); 		bsprite->playerTag = playerTag; 		auto animation = Animation::createWithSpriteFrames(frames, 1.0f / 16); 		auto animate = Animate::create(animation); 		auto repeat = Repeat::create(animate, 1); 		auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, bsprite)); 		auto sequence = Sequence::create(repeat, actRuin, NULL); 		bsprite->runAction(sequence); 		float mtime = random(0.2f, 1.0f); 		Vec2 move = Vec2(0.0f, random(-100.0f, -50.0f)); 		auto moveBy = MoveBy::create(mtime, move); 		bsprite->runAction(moveBy); 		actBase->addChild(bsprite, 3); 		AudioEngine::play2d("BOMB1.ogg", false, 0.5f); 	}  	/*发射炸弹类型2*/ 	void Aircraft::launchBomb2() 	{ 		Vec2 svec = sprite->getPosition(); 		Size size = sprite->getBoundingBox().size; 		float sw = 20; 		float ew = actBase->vSize.width - 20; 		SpriteFrameCache::getInstance()->addSpriteFramesWithFile("zd02.plist"); 		auto frames = Util::getAnimation("zd02(%d).png", 4); 		int tag = 6; 		for (int i = 0; i < 20; ++i) 		{ 			auto bsprite = new BombSprite(); 			BombSprite::createWithSpriteFrame(bsprite, frames.front()); 			bsprite->setScale(random(2.0f, 3.0f)); 			auto bsize = bsprite->getBoundingBox().size; 			float fx = random(sw, ew); 			float fy = random(-bsize.height * 4, -bsize.height * 3); 			bsprite->setPosition(Vec2(fx, fy)); 			auto body = Util::getPhysicsBody(bsprite->getBoundingBox().size, tag, bsprite->category, bsprite->collision, bsprite->contact, bsprite->gravityEnable); 			bsprite->setPhysicsBody(body); 			bsprite->setTag(tag); 			bsprite->playerTag = sprite->playerTag; 			auto animation = Animation::createWithSpriteFrames(frames, 1.0f / 30); 			auto animate = Animate::create(animation); 			auto repeat = RepeatForever::create(animate); 			bsprite->runAction(repeat); 			auto moveTo = MoveTo::create(random(1.0f, 2.0f), Vec2(fx, actBase->vSize.height + size.height)); 			auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, bsprite)); 			auto sequence = Sequence::create(moveTo, actRuin, NULL); 			bsprite->runAction(sequence); 			actBase->addChild(bsprite, 3); 			AudioEngine::play2d("fg.ogg", false, 0.5f); 		} 	}  	void Aircraft::createRuinAnimate(Node* node) 	{ 		AircraftSprite* aSprite = dynamic_cast<AircraftSprite*>(node); 		auto size = aSprite->getBoundingBox().size; 		auto position = node->getPosition(); 		SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ysbz.plist"); 		auto frames = Util::getAnimation("ysbz-%d.png", 16); 		auto sprite = Sprite::createWithSpriteFrame(frames.front()); 		auto ssize = sprite->getContentSize(); 		auto wf = size.width / ssize.width; 		auto hf = size.height / ssize.height; 		sprite->setScale(wf, hf); 		sprite->setPosition(position.x, position.y); 		auto animation = Animation::createWithSpriteFrames(frames, 1.0f / 16); 		auto animate = Animate::create(animation); 		auto repeat = Repeat::create(animate, 1); 		auto actRuin = CallFunc::create(std::bind(&Aircraft::removeRuin, this, sprite)); 		auto sequence = Sequence::create(repeat, actRuin, NULL); 		playBOMB(aSprite); 		sprite->runAction(sequence); 		actBase->addChild(sprite); 	}  	void Aircraft::playBOMB(AircraftSprite* aSprite) 	{ 		auto size = aSprite->getBoundingBox().size; 		float sz = size.height; 		if (size.width > size.height) 		{ 			sz = size.width; 		} 		if (aSprite->airType == 0) 		{ 			if (sz > 300) 			{ 				AudioEngine::play2d("BOMB6.ogg", false, 1.0f); 			} 			else if (sz > 250) 			{ 				AudioEngine::play2d("BOMB5.ogg", false, 1.0f); 			} 			else if (sz > 200) 			{ 				AudioEngine::play2d("BOMB4.ogg", false, 1.0f); 			} 			else if (sz > 100) 			{ 				AudioEngine::play2d("BOMB3.ogg", false, 1.0f); 			} 			else if (sz > 50) 			{ 				AudioEngine::play2d("BOMB2.ogg", false, 1.0f); 			} 			else 			{ 				AudioEngine::play2d("BOMB1.ogg", false, 1.0f); 			} 		} 	}  	void Aircraft::removeRuin(Sprite* sprite) 	{ 		sprite->removeFromParentAndCleanup(true); 	} }   

飞机动画编码:Aircraft.h

#pragma once #include <list> #include <vector> #include "cocos2d.h" #include "audio/include/AudioEngine.h" #include "Util.h" #include "Control.h" #include "AircraftSprite.h" #include "BulletSprite.h" #include "BombSprite.h"   using namespace std; using namespace cocos2d;  namespace SpaceWar { 	class ActionBase;  	class Aircraft 	{ 	public: 		Aircraft(); 		virtual ~Aircraft();  		ActionBase* actBase = nullptr;  		/*飞机精灵*/ 		AircraftSprite* sprite = nullptr;  		/*玩家标识,0:玩家1,1:玩家2*/ 		int playerTag = 0;  		/*游戏次数*/ 		int playerCount = 5;  		/*得分*/ 		int playerScore = 0;  		/*奖励游戏次数*/ 		int rewardPlayerCount = 0;  		long baseTime = 0;  		/*初始化飞机*/ 		virtual bool init(int pTag, int aType);  		void setCollisionEnable(bool isEnable);  		void controlAction(int player);  		void launchBullet();  		void launchBullet1();  		void createBullet1(PolygonInfo * pinfo, int tag, float speed, float startX);  		void launchBullet2();  		void createBullet2(PolygonInfo * pinfo, int tag, float speed, float startX, float endY);  		void launchMissile();  		void launchMissile1();  		void createMissile1(PolygonInfo * pinfo, int tag, float scale, int power, float speed, float startX, float startY);  		void launchMissile2();  		void createMissile2(PolygonInfo * pinfo, int tag, float scale, int power, float speed, float startX, float endX, float rotation);  		void launchBomb();  		void launchBomb1();  		void createBombAnimate(Vector<SpriteFrame*> frames, int tag, int playerTag, float sw, float ew, float sh, float eh);  		void launchBomb2();  		void createRuinAnimate(Node * node);  		void playBOMB(AircraftSprite * aSprite);  		void removeRuin(Sprite * sprite);  	}; }   

C++ 与cocos2d-x-4.0完成太空飞机大战 (三)

c/c++开发分享C++ 与cocos2d-x-4.0完成太空飞机大战 (二)地址:https://blog.csdn.net/zhyzcl/article/details/107343012

www.ctvol.com true Article c/c++语言开发共享C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/599041.html

(0)
上一篇 2021年5月8日 下午11:29
下一篇 2021年5月8日 下午11:32

精彩推荐