豪华版飞机大战系列(六)–附源代码

豪华版飞机大战系列(六)–附源代码

大家好,又见面了,我是全栈君。

最后一篇讲一下游戏中的主要逻辑推断,在上面的工作都做充分准备后,游戏主要逻辑将变得特别清晰,接下来你会看到全部的逻辑都是那么的清晰自然,由于前面已经做好了充分的准备工作,这里仅仅是整合了前面的工作,略微增加了一些游戏推断元素。

同一时候源代码会在文章最后给出链接地址,源代码托管在github上,全部的东西都是开源免费的,在如今的大环境下。开源才是王道,分享才干双赢,我始终认为这是对的。你有一种思想我有一种思想,交流分享后我们都有了两种思想,何乐而不为呢。

好了,回归正题。游戏主要推断逻辑都在GameScene场景中,当中包含了GameLayer层。在层中进行游戏的逻辑推断。

来看一下GameScene.h的内容:

#include "cocos2d.h"
#include "PlaneLayer.h"
#include "BulletSprite.h"
#include "EnemyLayer.h"

USING_NS_CC;

class GameLayer: public cocos2d::Layer {
public:
	//创建GameLayer层所属的场景
	static cocos2d::Scene* createScene();
	virtual bool init();
	//在onEnter运行完毕之后调用此函数
	virtual void onEnterTransitionDidFinish();
	CREATE_FUNC(GameLayer);

public:
	//依据每帧来更新游戏
	void gameUpdate(float dt);
	//子弹碰撞检測
	bool bulletCollisionEnemy(Sprite* pBullet);
	//飞机碰撞检測
	bool enemyCollisionPlane();
	//menu回调函数
	void menuCloseCallback(cocos2d::Ref* pSender);
public:
	PlaneLayer *planeLayer;//飞机层
	BulletSprite *bulletSprite;//子弹层
	EnemyLayer *enemyLayer;//敌机层

	int getRand(int start, int end);//获取从start到end的随机数
};

不做太多解释,直接看各个函数的详细实现,GameScene.cpp

#include "GameScene.h"

/**
 * 创建场景,并加入GameLayer层
 */
cocos2d::Scene* GameLayer::createScene() {
	auto scene = Scene::create();
	auto layer = GameLayer::create();
	scene->addChild(layer);
	return scene;
}

bool GameLayer::init() {
	if (!Layer::init()) {
		return false;
	}
	this->setTouchEnabled(true);//设置层中可触摸点击
	Size winSize = Director::getInstance()->getWinSize();
	/**
	 * 随即载入背景图片,
	 */
	char buff[15];
	int id = getRand(1, 5);//返回1~5之间的随机数
	sprintf(buff, "img_bg_%d.jpg", id);
	auto over = Sprite::create(buff);
	over->setPosition(Point(winSize.width / 2, winSize.height / 2));
	this->addChild(over);
	return true;
}
/**
 * 返回从start到end的随机整数
 */
int GameLayer::getRand(int start, int end) {
	struct timeval tv;
	gettimeofday(&tv, NULL);
	unsigned long int rand_seed = tv.tv_sec * 1000 + tv.tv_usec / 1000;//随机数种子
	srand(rand_seed);
	float i = CCRANDOM_0_1() * (end - start + 1) + start;
	return (int) i;
}
/**
 * 在onEnter函数之后调用
 * 功能:创建飞机、子弹、敌机并加入到层中
 */
void GameLayer::onEnterTransitionDidFinish() {
	planeLayer = PlaneLayer::create();
	this->addChild(planeLayer);
	bulletSprite = BulletSprite::create();
	this->addChild(bulletSprite);
	enemyLayer = EnemyLayer::create();
	this->addChild(enemyLayer);
	//设置每帧时都调用gameUpdate函数
	this->schedule(schedule_selector(GameLayer::gameUpdate));
	//加入menu,并设置回调函数
	Size visibleSize = Director::getInstance()->getVisibleSize();
	Point origin = Director::getInstance()->getVisibleOrigin();
	auto closeItem = MenuItemImage::create("CloseNormal.png",
			"CloseSelected.png",
			CC_CALLBACK_1(GameLayer::menuCloseCallback, this));
	closeItem->setPosition(
			Point(
					origin.x + visibleSize.width
							- closeItem->getContentSize().width / 2,
					origin.y + closeItem->getContentSize().height / 2));
	auto menu = Menu::create(closeItem, NULL);
	menu->setPosition(Point::ZERO);
	this->addChild(menu, 1);
}
/**
 * menu的回调函数
 */
void GameLayer::menuCloseCallback(Ref* pSender) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
	return;
#endif
	Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	exit(0);
#endif
}

/**
 * 子弹和敌机碰撞检測函数
 */
bool GameLayer::bulletCollisionEnemy(Sprite* pBullet) {
	//遍历场景中的全部敌机,看子弹是否和敌机的包装矩形有重叠
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		//推断矩形是否有重叠
		if (pBullet->boundingBox().intersectsRect(
				pEnemySprite->getBoundingBox())) {
			if (1 == pEnemySprite->getLife()) {
				pEnemySprite->loseLife();
				enemyLayer->blowupEnemy(pEnemySprite);
			} else {
				pEnemySprite->loseLife();
			}
			//有重叠则移除子弹
			bulletSprite->removeBullet(pBullet);
			return true;
		}
	}
	return false;
}

/**
 * 在每帧时都进行游戏逻辑检測,
 * 检測子弹和敌机是否有碰撞
 * 检測主角飞机和敌机是否有碰撞
 */
void GameLayer::gameUpdate(float dt) {
	bool bMoveButt = false;
	for (auto& eButtle : bulletSprite->vecBullet) {
		Sprite* pBullet = (Sprite*) eButtle;
		bMoveButt = bulletCollisionEnemy(pBullet);
		if (bMoveButt) {
			return;
		}
	}
	enemyCollisionPlane();
}
/**
 * 敌机和主角飞机是否有碰撞
 * 遍历全部敌机进行检測
 */
bool GameLayer::enemyCollisionPlane() {
	Sprite* pPlane = (Sprite*) planeLayer->getChildByTag(AIRPLANE);
	for (auto& eEnemy : enemyLayer->vecEnemy) {
		EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;
		if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())
				&& pEnemySprite->getLife() > 0) {
			//TODO,DO WHAT YOU WANT
//			this->unscheduleAllSelectors();
//			this->bulletLayer->StopBulletShoot();
//			this->planeLayer->blowUp();
			return true;
		}
	}

	return false;
}

在各个关键的地方都有详细凝视,了解引擎的都应该能够看明确的。有详细问题的能够留言。

最后附上源代码的下载链接。托管在github上,本人最烦的就是下载个东西还TM的须要积分,比方CSDN上的资源,你分享就分享吧,还得给你个积分来下载,要不你就别上传,既然开源,就不要想为自己谋多少利,可能又要被喷,可是我始终坚信开源才是王道,不喜务喷。

点击打开链接


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116500.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm怎么设置字体和颜色_pycharm背景颜色

    pycharm怎么设置字体和颜色_pycharm背景颜色个人使用记录:1.settings-Appearance–勾选Overridedefaultfonts.设置字体和大小如下:(点击Apply应用)2.Editor-Font-选择主题Shame(需要SaveAs…才可以修改,个人喜欢黑色底,选了个浅黑色),设置字体和大小3.保存,应用后,查看自己面板中显示是否合意(嗯,是我喜欢的样子~)…

    2022年8月29日
    2
  • 腾讯云免费ssl_腾讯云ssl证书申请

    腾讯云免费ssl_腾讯云ssl证书申请1.点此进入SSL证书产品页面2.点击立即选购,进入产品配置界面。3.选择自定义配置–>国际标准–>域名型免费版,点击免费快速申请。4.进入登录界面,用微信扫二维码。5.填写域名相关信息,点击下一步6.选择域名的验证方式,推荐DNS验证,点击下一步。7.打开域名管理后台,根据上一步获得的域名解析信息,增加一条TXT类型的解析记录。8.回到腾讯云SSL证书申请界面,查看域名验证结果,验证成功会收到一条短信,反之会有提示错误。9.申

    2025年10月17日
    2
  • LPCTSTR 用法

    LPCTSTR 用法LPCTSTR用法

    2025年6月26日
    2
  • 给 Pycharm 安装 pytorch

    给 Pycharm 安装 pytorch问题在之前的文章Win10通过Anaconda下载安装PyTorch中,用Anacondaprompt在base环境中安装了PyTorch,并且能在Jupyternotebook中调用。但遇到了两个问题:使用Pycharm创建新project时,envs目录下找不到pytorch的选项;在Pycharm中运行>>>importtorch报错“Couldnotfindcondaenvironment:torch”

    2022年8月27日
    8
  • bp神经网络的设计方法_bp神经网络例子

    bp神经网络的设计方法_bp神经网络例子基于BP神经网络的室内声源定位算法的实现(附有程序)问题描述现在有一个安静的房子,有一个人在房间里走动,我要利用屋里的麦克风接收这个人的脚步声,然后对这个人进行定位。问题的意义声源定位,这个问题的研究意义重大,它能克服视觉定位的缺点(即只能对看得到的地方进行定位)。问题的研究方法本文只讨论基于麦克风阵列的声源定位(即利用麦克风收集声源信息)。目前解决这个问题的主流方法有三个,分别是基于最大输出功率的可控波束形成技术、基于高分辨率谱估计技术、基于声达时间差的定位技术。这三种方法都是通过研究声音的

    2022年9月22日
    1
  • Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]

    Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据(注意中间有斜线)。若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。开始拖动:通过调用QDrag::exec()…

    2022年9月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号