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

同一时候源代码会在文章最后给出链接地址,源代码托管在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;
#endifDirector::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://www.cnblogs.com/yxwkf/p/5087684.html

豪华版飞机大战系列(六)--附源代码相关推荐

  1. python飞机大战源代码-python版飞机大战代码分享

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import ...

  2. java版飞机大战代码

    java版飞机大战代码 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before ...

  3. 飞机大战java_java版飞机大战实战项目详细步骤

    本文为大家分享了java版飞机大战实战项目,供大家参考,具体内容如下 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是 ...

  4. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  5. pygame的应用——python版飞机大战

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import ...

  6. 飞机大战HTML5游戏源码,基于Canvas制作的网页版飞机大战游戏+飞机大战手机端

    简介: 飞机大战HTML5游戏源码是一款基于Canvas制作的网页版飞机大战游戏,画质精美的飞机大战手机端游戏源码 网盘下载地址: http://kekewangLuo.net/W1S2LQcqAT2 ...

  7. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  8. Python实现飞机大战-第二部分(附源码、素材、超详细教程)

    飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...

  9. python版飞机大战

    python版飞机大战 用python几百行代码搞定飞机大站游戏. 我们利用pygame包进行飞机大战的游戏开发,所以大家首先得安装好pygame包,本游戏一共封装了8个类,大家可以在GitHub上下 ...

最新文章

  1. layer 弹不出来_红米k20pro摄像头弹不出来怎么办?昆明小米手机维修教你解决
  2. 由于存储区是只读的,存储区已满,或者存储区没有正确打开,所以导致失败
  3. requireJS的基本使用
  4. 解决XML中报“cvc-complex-type.2.4.a: Invalid content was found starting with element ”错误
  5. 什么时候该用MySQL,什么时候该用ES呢?
  6. ASA L2L *** IKEV2共享密钥配置
  7. 树以及树简单的遍历方法
  8. ffmpeg下载与安装
  9. 2022年第十三届蓝桥杯大赛软件省赛Java学B组试题
  10. oracle下的inventory文件夹,在 Oracle Home 目录中重建Central Inventory(oraInventory)的步骤...
  11. 文件操作(第二节文件的写入和读取)
  12. 计算机操作系统 - 目录1
  13. 每个前端都值得拥有自己的组件库,就像每个冬天都拥有春秋裤
  14. Windows Vista SP1
  15. 软件架构-解密电商系统营销-会员模块业务
  16. 国外LEAD赚美金项目操作介绍
  17. 银行全面数字化:看本质、抓关键、建平台
  18. 财务分析与决策:同型分析【转】
  19. My Minesweeper
  20. Word2013无法打开下载的DOC文档-Word在试图打开时遇到错误

热门文章

  1. 无人再谈CV:计算机视觉公司的困境
  2. 微软10亿美元投资AI公司助力云计算,研发通用人工智能
  3. 大数据环境下数据科学的知识体系
  4. labview如何进行串口通讯(转)
  5. 贪吃蛇游戏的C++代码
  6. mysql执行语句_实时查看MySQL执行的语句
  7. dxp计算机术语,《计算机DXP应用》.doc
  8. java websocket 库_Java 项目中的 WebSocket 实现
  9. mysql按特定的顺序_如何在MySQL中按特定顺序排列数据?
  10. @AutoWired和@Resource注解异同分析