在上一篇中。我们实现了游戏的開始界面,接下来要实现游戏的主界面。主界面包括地图、我方飞机、敌机等

先来实现我方飞机

我方飞机具有哪些属性呢? 飞机要具有生命值、要有动画效果(尾部喷气),飞机不可以飞出边界。所以要进行边界检測,当飞机生命值为0时。飞机会爆炸。然后被移除。

.h文件

//飞机动画
Animate* planeFly(); //边界检測
void borderCheck(float dt); //飞机爆炸
void blowUp(); //移除飞机
void removePlane(); //获取生命值
int getAlive(); //设定生命值
void loseAlive(); // 更新生命值
void updateAlive(int alive);

这个变量在create()函数中初始化,方便其它层调用我方飞机的相关数据

static MyPlane* instancePlane;	//飞机实例

我方飞机的生命值直接在这里显示、更新,不受控制器的控制

private:
int m_alive;
Label* aliveItem1;
Label* aliveItem2;

.cpp文件

/*
************************************************************************
*
* MyPlane.cpp
* 杜星飞 2015年8月13日
* 描写叙述: 包括飞机的属性、功能等
*
************************************************************************
*/ #include "MyPlane.h"
#include "SimpleAudioEngine.h" MyPlane::MyPlane() :m_alive(5)
{ }
MyPlane::~MyPlane()
{ } MyPlane* MyPlane::instancePlane = NULL; MyPlane* MyPlane::create()
{
MyPlane* m_plane = NULL;
do
{
m_plane = new MyPlane();
CC_BREAK_IF(!m_plane); if (m_plane && m_plane->init())
{
m_plane->autorelease();
instancePlane = m_plane;
}
else
CC_SAFE_DELETE(m_plane);
} while (0); return m_plane;
} //飞机动画
Animate* MyPlane::planeFly()
{
Vector<SpriteFrame *> vector;
for (int i = 0; i < 2; i++)
{
auto frameName = __String::createWithFormat("chinaFly%d.png", i + 1);
auto temSpriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(frameName->getCString());
vector.pushBack(temSpriteFrame);
}
//设置不断播放飞机的动画
auto animation = Animation::createWithSpriteFrames(vector, 0.2f, -1);
auto animate = Animate::create(animation); return animate;
} bool MyPlane::init()
{
if(!Layer::init())
return false; Size winSize = Director::getInstance()->getWinSize(); //加入飞机
auto m_planeSprite = Sprite::createWithSpriteFrameName("chinaFly1.png");
m_planeSprite->setPosition(Point(winSize.width / 2, m_planeSprite->getContentSize().height / 2));
m_planeSprite->setTag(AIRPLANE);
this->addChild(m_planeSprite);
m_planeSprite->runAction(this->planeFly()); // 飞机触摸
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true); //吞噬触摸事件 //对触摸事件的监听过程直接写在这里
listener->onTouchBegan = [](Touch* touch, Event *event)
{
auto target = static_cast<Sprite*>(event->getCurrentTarget()); Point locationInNode = target->convertToNodeSpace(touch->getLocation());
Size s = target->getContentSize();
Rect rect = Rect(0, 0, s.width, s.height); if (rect.containsPoint(locationInNode))
return true;
else
return false;
}; listener->onTouchMoved = [](Touch* touch, Event *event)
{
auto target = static_cast<Sprite*>(event->getCurrentTarget());
target->setPosition(target->getPosition() + touch->getDelta());
}; listener->onTouchEnded = [](Touch* touch, Event* event)
{
}; //将触摸监听加入到eventDispacher中去
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, m_planeSprite); //初始化生命值 //设置标签 并 获取中文文本
auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml"); aliveItem1 = Label::createWithTTF(
(((__String*)(dictionary->objectForKey("alive"))))->getCString(),
"fonts/DFPShaoNvW5-GB.ttf",
25);
aliveItem1->setPosition(Point(winSize.width/8, winSize.height-aliveItem1->getContentSize().height));
aliveItem1->setColor(Color3B(255, 0, 0));
this->addChild(aliveItem1); aliveItem2 = Label::createWithTTF(
"5",
"fonts/DFPShaoNvW5-GB.ttf",
25);
aliveItem2->setPosition(Point(aliveItem1->getPositionX()*2, winSize.height - aliveItem1->getContentSize().height));
aliveItem2->setColor(Color3B(255, 0, 0));
this->addChild(aliveItem2); // 开启边界检測
this->schedule(schedule_selector(MyPlane::borderCheck)); return true;
} //边界检測
void MyPlane::borderCheck(float dt)
{
//进行边界推断,不可超出屏幕
Point location = this->getChildByTag(AIRPLANE)->getPosition();
Size winSize = Director::getInstance()->getWinSize(); // 返回的就是这个矩形的大小
Size planeSize = this->getChildByTag(AIRPLANE)->getContentSize(); if (location.x<planeSize.width / 2)
location.x = planeSize.width / 2; if (location.x>winSize.width - planeSize.width / 2)
location.x = winSize.width - planeSize.width / 2; if (location.y<planeSize.height / 2)
location.y = planeSize.height / 2; if (location.y>winSize.height - planeSize.height / 2)
location.y = winSize.height - planeSize.height / 2; this->getChildByTag(AIRPLANE)->setPosition(location);
} //飞机爆炸
void MyPlane::blowUp()
{
this->unscheduleAllSelectors(); // 停止飞机的全部行动 //载入飞机爆炸动画 音效
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/chinaDown.mp3");
} Vector<SpriteFrame*> planeBlowUp;
for (int i = 0; i < 4; i++)
{
auto planeName = __String::createWithFormat("china1_down%d.png", i + 1);
auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByName(
planeName->getCString());
planeBlowUp.pushBack(tempBlowUp);
} Animation* animation = Animation::createWithSpriteFrames(planeBlowUp, 0.2f);
Animate* animate = Animate::create(animation);
CallFunc* m_removePlane = CallFunc::create(this, callfunc_selector(MyPlane::removePlane));
Sequence* sequence = Sequence::create(animate, m_removePlane, NULL); // 停止一切的飞机动作
this->getChildByTag(AIRPLANE)->stopAllActions(); this->getChildByTag(AIRPLANE)->runAction(sequence);
} //移除飞机
void MyPlane::removePlane()
{
// 移除飞机精灵 true子节点上的全部执行行为和回调将清理
this->removeChildByTag(AIRPLANE, true);
} //获取生命值
int MyPlane::getAlive()
{
return m_alive;
} //设定生命值
void MyPlane::loseAlive()
{
--m_alive;
updateAlive(m_alive);
} // 更新生命值
void MyPlane::updateAlive(int alive)
{
if (alive >= 0)
{
CCString* strAlive = CCString::createWithFormat("%d", alive);
aliveItem2->setString(strAlive->getCString());
aliveItem2->setColor(Color3B(rand_0_1() * 255, rand_0_1() * 255, rand_0_1() * 255));
}
}

更新生命值的函数仅仅用在我方飞机生命值降低是调用。

还有就是对于中文字符的处理

//设置标签 并 获取中文文本
auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml");

能够在项目中加入一个XML文件

<?xml version="1.0" encoding="UTF-8"?>
<dict>
<key>play</key>
<string>開始游戏</string>
<key>score</key>
<string>得分:</string>
<key>alive</key>
<string>生命:</string>

通过对应的key来显示显示对应的中文。

还有就是,有些字体不支持中文的显示,比方
系统自带的 arial.ttf就不行,而DFPShaoNvW5-GB.ttf能够。

【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现的更多相关文章

  1. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)

    微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  2. js 飞机大战

    完整文件及代码可以在网盘下载,下载链接为:https://pan.baidu.com/s/1hs7sBUs 密码: d83x 飞机大战css定义: <style> #container{ ...

  3. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  4. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  5. 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)

    微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  6. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)

    序言作为一个android开发人员,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的. 体验地址:http://www.wandoujia. ...

  7. JS 实现飞机大战

    这是JS版本的飞机大战,和C#版本的思路相同,就是语言上有差别,用来巩固知识.可以将代码直接引入到HTML中就可以看到效果 //编写背景对象 function Background(width,hei ...

  8. 【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景

    主场景要包括其它类的头文件 #include "cocos2d.h" #include "MyPlane.h" #include "Bullet.h& ...

  9. 【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理

    敌方飞机应该不定时的出现,有自己的生命周期.运动轨迹.这个类用来管理敌机的产生.移动.爆炸.销毁等. 敌机管理类主要函数例如以下 //绑定控制器(更新分数) void bindController(C ...

随机推荐

  1. POJ 2888

    思路挺清晰的.不过,我就是WA.不清楚为什么,很多数据都过了. 其实,一个置换后若有循环节个数为K,则N必定可以除以尽K.而K正好可以看成一个环.为什么呢?看前K个珠子,就是一个环,而后面的若干个K个 ...

  2. node14---分层结构数据库操作

    /**回调函数(函数作为参数): 0. 外层函数调用的地方,一定是外层函数体先执行,回调函数和普通函数地址一样,然后看函数体规定回调函数怎么执行. 1. 异步时候使用回调函数, 无论是否异步,回调函数 ...

  3. javascript对象的深度克隆

    在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...

  4. 细数SuperComputer最新排名和常见Benchmark类型

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  5. JavaScript学习——BOM对象

    1.BOM 对象:浏览器对象模型(操作与浏览器相关的内容) 2.Window 对象 Window 对象表示浏览器中打开的窗口 setInterval():它有一个返回值,主要是提供给 clearInt ...

  6. HTML基础——网站首页显示页面

    1.表格标签: border设置边框,align设置位置(居中等),bgcolor设置背景颜色,cellspacing设置边框之间的空隙,cellpadding设置边框与里面内容的间距. table表 ...

  7. 安装Windows服务方法

    用sc create 服务名 binPath="路径",不要用老方法InstallUtil会出现一堆的错误

  8. asp.net 连接字符串的多种写法

    一.使用OleDbConnection对象连接OLE DB数据源 1.连接Access 数据库 Access 2000: “provider=Microsoft.Jet.Oledb.3.5;Data ...

  9. easyui的datagrid右侧没有边框线

    做项目时,用的easyui的框架的datagrid,运行时发现右侧没有边框,其它的都有边框,使用网页的审查元素可以看到datagrid样式里的宽度没有自动减去2个像素,这些都是easyui自算的宽高, ...

  10. 用MyBatis进行数据库的增删改查

    前提是MyBatis环境部署好了,参考地址: https://www.cnblogs.com/package-java/p/10316536.html 为了方便演示,我提前在数据库插入了数据方便查询 ...