游戏设定集里的敌机血量是怎样设定的

[Unity3D]Unity3D游戏开发之飞机大战项目讲解 - 推酷
[Unity3D]Unity3D游戏开发之飞机大战项目讲解
& & & & 大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是
& & & & 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目。这是一个比较综合的项目,希望对大家学习Unity3D有所帮助,我会在文章最后给出项目代码。作为一个游戏而言,游戏策划十分重要,所以在开始今天的文章之前,我们先来了解下这个项目的策划。我们的玩家是一个飞机,玩家可以使用A、D、S、W四个键位来控制飞机位置,当按下空格键时,我方飞机可以向敌机发射炮弹,当敌机中弹后将减少生命值,当敌机生命值为0时,敌机将爆炸销毁。在游戏场景中只有一种从屏幕上方不断向下飞行的敌机,当我方飞机与敌机碰撞后,双方都将减少生命值。当我方生命值减少至0时,游戏将结束。好了,了解完游戏规则设定后,我们就可以开始今天的内容了。
& & 一、游戏场景
& & & 游戏场景我们采用2D的界面,如图,我们创建一个蓝天白云的平面场景,该场景垂直于摄像机并采取正交投影方式。如果对在Unity3D中创建2D场景尚存在疑惑的朋友可以参考文章
两篇文章。
& & & 我们这里在场景中添加GUIText对象来显示玩家得分等基本信息,脚本定义如下:
using UnityE
using System.C
public class GameManager : MonoBehaviour {
//玩家得分
private Transform G
//玩家生命
private Transform HP;
//游戏结束
private Transform T
private GameObject P
void Start ()
//初始化界面
Grade=transform.Find(&Grade&);
HP=transform.Find(&HP&);
Text=transform.Find(&Text&);
Text.guiText.enabled=
//获取玩家对象
Player=GameObject.Find(&Player&);
void Update ()
if(Player!=null)
Grade.guiText.text=&得分:&+Player.GetComponent&Player&().Grade.ToString();
HP.guiText.text=&生命:&+Player.GetComponent&Player&().MaxHP.ToString();
if(HP.guiText.text==&生命:0&)
Text.guiText.enabled=
//立即复活
if(Input.GetKey(KeyCode.Y))
Application.LoadLevel(&Main&);
if(Input.GetKey(KeyCode.N))
Application.Quit();
二、玩家飞机
& & & 玩家飞机的创建和背景的创建时相同的,这里我们不再多说。玩家飞机需要完成移动、发射、碰撞的事件处理。为此我们编写下面的脚本:
using UnityE
using System.C
public class Player : MonoBehaviour {
//飞机的移动速度
public float MoveS
//飞机的最大生命值
public int MaxHP=100;
//定义子弹对象
public GameObject B
//定义子弹发射位置
private Transform BulletPosL;
private Transform BulletPosR;
[HideInInspector]
public int Grade=0;
void Start ()
BulletPosL=this.transform.Find(&BulletPosL&);
BulletPosR=this.transform.Find(&BulletPosR&);
void Update ()
if(Input.GetKey(KeyCode.A))
transform.Translate(Vector3.left*Time.deltaTime*(-MoveSpeed));
if(Input.GetKey(KeyCode.D))
transform.Translate(Vector3.left*Time.deltaTime* MoveSpeed );
if(Input.GetKey(KeyCode.W))
transform.Translate(Vector3.forward*Time.deltaTime*(-MoveSpeed));
if(Input.GetKey(KeyCode.S))
transform.Translate(Vector3.forward*Time.deltaTime*MoveSpeed);
//按下空格键,发射子弹
if(Input.GetKey(KeyCode.Space))
Instantiate(Bullet,BulletPosL.transform.position,Quaternion.Euler(new Vector3(0,1,0)));
Instantiate(Bullet,BulletPosR.transform.position,Quaternion.identity);
#region 减血
public void Hit(int Value)
if(MaxHP&0)
Destroy(this.gameObject);
#endregion
#region 增加分数
public void Add(int Value)
#endregion
& & & &在这段代码中,Bullet是我们的子弹对象,它从飞机的两个子弹发射位置BulletPosL、BulletPosR发射,向屏幕上方按照一定的速度缓缓移动,当子弹与敌人碰撞时,子弹对象将销毁,同时敌人生命值减少。Bullet对象对应于我们的一个Prefab。BulletPosL、BulletPosR对应于飞机上的两个位置。如图:
& & & 我们的子弹Bullet是一个绑定了脚本的Capsule。它的代码定义如下:
using UnityE
using System.C
public class Bullet : MonoBehaviour {
//定义子弹的移动速度
public float MoveSpeed=10F;
//定义子弹的销毁时间
public float DestroyTime=2.0F;
//定义子弹对敌人的伤害值
public int Damage=2;
//玩家飞机
private GameObject P
void Start()
Player=GameObject.Find(&Player&);
void Update ()
//移动子弹
transform.Translate(Vector3.up * MoveSpeed * Time.deltaTime);
//碰撞事件捕捉
void OnTriggerEnter(Collider mCollider)
if(mCollider.gameObject.tag==&Enemy&)
//敌人减血
mCollider.gameObject.GetComponent&Enemy&().Hit(Damage);
//我方得分
Player.GetComponent&Player&().Add(1);
//销毁子弹
Destroy(this.gameObject);
//当离开摄像机范围时触发销毁事件
void OnBecameInvisible()
Destroy(this.gameObject);
& &三、敌人飞机
在我们的游戏中共有三种敌机,我们先将它们制作成预设。然后通过敌机生成器不断地生成敌机。如图:
&和子弹相反,我们希望敌机从屏幕上方以一定速度向下移动,当碰到玩家飞机或者子弹时,将减少生命值。为此,我们这样定义敌机的脚本:
using UnityE
using System.C
public class Enemy : MonoBehaviour {
//移动速度
public float MoveSpeed=1.5F;
public GameObject E
//最大生命值
public int MaxHP=100;
void Update ()
//移动飞机
transform.Translate(Vector3.forward*Time.deltaTime*MoveSpeed);
public void Hit(int Value)
//如血量不低于0,则敌人飞机掉血
if(MaxHP&0)
//产生爆炸效果
Instantiate(Explosion,transform.position,Quaternion.Euler(new Vector3(90,180,0)));
//销毁敌机
Destroy(this.gameObject);
void OnTriggerEnter(Collider mCollider)
//如果与玩家飞机遭遇,则双方减血
if(mCollider.gameObject.tag==&Player&)
//敌机掉血
this.Hit(2);
//玩家飞机掉血
Transform mPlayer=mCollider.gameObject.transform.Find(&Player&);
mPlayer.GetComponent&Player&().Hit(2);
void OnBecameInvisible()
Destroy(this.gameObject);
& 接下来,我们通过敌机生成器来不断地生成敌机。敌人生成器是我们预制在游戏场景中的空游戏体,它位于游戏场景的顶部。我们将下面的脚本绑定到游戏生成器 上,使其可以不断地生成敌人:
using UnityE
using System.C
public class SpawnEnemy : MonoBehaviour {
//定义敌人速度
public float SpawnTime=1.0f;
//定义敌人对象数组
public GameObject[] E
void Start ()
StartCoroutine(&Spawn&);
//通过迭代器生成敌人
IEnumerator Spawn()
yield return new WaitForSeconds(SpawnTime);
//克隆对象
Instantiate(Enemys[Random.Range(0,3)],new Vector3(transform.position.x * Random.Range(-1F,1F),
transform.position.y,-4),Quaternion.Euler(new Vector3(90,180,0)));
StartCoroutine(&Spawn&);
& & & 其中Enemys对应到我们的敌人预设,每隔一段时间,我们随机地产生一种敌人,该敌人将从屏幕上方缓缓向下移动。
& & 四、碰撞检测
在这个游戏中,主要存在子弹与敌机的碰撞、玩家飞机与敌机的碰撞两种形式。它们分别被定义在Bullet.cs和Enemy.cs两个类文件中。
//碰撞事件捕捉
void OnTriggerEnter(Collider mCollider)
if(mCollider.gameObject.tag==&Enemy&)
//敌人减血
mCollider.gameObject.GetComponent&Enemy&().Hit(Damage);
//我方得分
Player.GetComponent&Player&().Add(1);
//销毁子弹
Destroy(this.gameObject);
void OnTriggerEnter(Collider mCollider)
//如果与玩家飞机遭遇,则双方减血
if(mCollider.gameObject.tag==&Player&)
//敌机掉血
this.Hit(2);
//玩家飞机掉血
Transform mPlayer=mCollider.gameObject.transform.Find(&Player&);
mPlayer.GetComponent&Player&().Hit(2);
&五、爆炸特效
& & &当敌机被摧毁时,将显示爆炸特效,我们这里采用一组2D贴图来实现爆炸特效,原理是改变贴图的mainTextureScale和mainTextureOffset两个属性值。我们来一起看代码:
using UnityE
using System.C
public class Explosion : MonoBehaviour {
//动画序列索引
private int index=0;
private AudioSource mA
void Start()
mAudio=GetComponent&AudioSource&();
void FixedUpdate ()
if(index&8)
this.renderer.sharedMaterial.mainTextureScale=new Vector2(1.0F/8,1);
this.renderer.sharedMaterial.mainTextureOffset=new Vector2(index * 1.0F/8,0);
mAudio.Play();
Destroy(this.gameObject);
& & &其中mAudio对应到一个AudioSource组件,我们在这里指定一个爆炸的音效。同样地,我们将爆炸制作成预设,该预设对应于Enemy.cs中的Explosion。
& & &好了,到这里今天的&内容就讲解完了,我们一起来看看最终的效果吧!
& & &希望今天的内容大家能够喜欢。学了这么长时间的Unity3D,感慨还是挺多的,很多东西你不努力去做,是永远做不好的,你不给自己压力,你不会知道自己有多优秀。本项目源代码可以从
&每日箴言:&不管活到什么岁数,总有太多思索、烦恼与迷惘。一个人如果失去这些,安于现状,才是真正意义上的青春的完结。—— &渡边淳一
& & & 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei
& & & 转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致Raiden 简单的雷电游戏,有3关,可以实现子 不同变换及血量条的增减。敌机有4种 类型飞 Game Program
238万源代码下载-
&文件名称: Raiden
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 3591 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:简单的雷电游戏,有3关,可以实现子弹的不同变换及血量条的增减。敌机有4种不同类型飞机-Lightning simple game, there are three off, you can achieve different conversion and changes in blood volume of the bullets. There are four different types of aircraft and aircraft
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&Raiden&&......\.classpath&&......\.project&&......\.settings&&......\.........\org.eclipse.jdt.core.prefs&&......\bin&&......\...\audio&&......\...\.....\backsound.wav&&......\...\.....\BombSound.wav&&......\...\.....\shoot1.wav&&......\...\.....\shoot2.wav&&......\...\config&&......\...\......\fire_strategy.properties&&......\...\......\stage_1.properties&&......\...\......\stage_2.properties&&......\...\......\stage_3.properties&&......\...\images&&......\...\......\bg0.jpg&&......\...\......\bg1.jpg&&......\...\......\bg2.jpg&&......\...\......\bg3.jpg&&......\...\......\bomb0.png&&......\...\......\bomb1.png&&......\...\......\bomb2.png&&......\...\......\bomb3.png&&......\...\......\bomb4.png&&......\...\......\bomb5.png&&......\...\......\BossA.png&&......\...\......\BossB.png&&......\...\......\BossC.png&&......\...\......\EnemyA.png&&......\...\......\EnemyB.png&&......\...\......\EnemyC.png&&......\...\......\firechange.png&&......\...\......\laserbullet.png&&......\...\......\sliverbullet.png&&......\...\......\this.png&&......\...\org&&......\...\...\shixun&&......\...\...\......\raiden&&......\...\...\......\......\model&&......\...\...\......\......\.....\AudioThread.class&&......\...\...\......\......\.....\BackGround.class&&......\...\...\......\......\.....\BombSoundThread.class&&......\...\...\......\......\.....\Collider.class&&......\...\...\......\......\.....\ColliderChain$Node.class&&......\...\...\......\......\.....\ColliderChain.class&&......\...\...\......\......\.....\colliders&&......\...\...\......\......\.....\.........\EnemyBulletCollider.class&&......\...\...\......\......\.....\.........\HeroBloodUpObjectCollider.class&&......\...\...\......\......\.....\.........\HeroBossCollider.class&&......\...\...\......\......\.....\.........\HeroBulletCollider.class&&......\...\...\......\......\.....\.........\HeroChangeFireStrategyCollider.class&&......\...\...\......\......\.....\.........\HeroEnemyCollider.class&&......\...\...\......\......\.....\Direction.class&&......\...\...\......\......\.....\firestratagies&&......\...\...\......\......\.....\..............\DoubleGunFireStrategy.class&&......\...\...\......\......\.....\..............\FourGunFireStrategy.class&&......\...\...\......\......\.....\..............\OneGunFireStrategy.class&&......\...\...\......\......\.....\..............\ShotGunFireStrategy.class&&......\...\...\......\......\.....\FireStrategy.class&&......\...\...\......\......\.....\Game.class&&......\...\...\......\......\.....\GameObject.class&&......\...\...\......\......\.....\GameObjectDispatcherThread.class&&......\...\...\......\......\.....\gameobjects&&......\...\...\......\......\.....\...........\BloodUpObject.class&&......\...\...\......\......\.....\...........\Bullet.class&&......\...\...\......\......\.....\...........\bullets&&......\...\...\......\......\.....\...........\.......\LaserBullet.class&&......\...\...\......\......\.....\...........\.......\LitteBullet.class&&......\...\...\......\......\.....\...........\.......\SilverBullet.class&&......\...\...\......\......\.....\...........\ChangeFireStrategyObject.class&&......\...\...\......\......\.....\...........\enemies&&......\...\...\......\......\.....\...........\.......\BossA.class&&......\...\...\......\......\.....\...........\.......\BossB.class&&......\...\...\......\......\.....\...........\.......\BossC.class&&......\...\...\......\......\.....\...........\.......\EnemyA.class&&......\...\...\......\......\.....\...........\.......\EnemyB.class&&......\...\...\......\......\.....\...........\.......\EnemyC.class&&......\...\...\......\......\.....\...........\Enemy.class&&......\...\...\......\......\.....\...........\Exploder.class&&......\...\...\......\......\.....\...........\Hero.class&&......\...\...\......\......\.....\...........\Power.class&&......\...\...\......\......\.....\GameStatus.class&&......\...\...\......\......\.....\ShootThread.class&&......\...\...\......\......\view&&......\...\...\......\......\....\GameMain$1.class&&......\...\...\......\......\....\GameMain$2.class&&......\...\...\......\......\....\GameMain$3.class&&......\...\...\......\......\....\GameMain.class&&......\...\...\......\......\....\GamePanel.class&&......\src&&......\...\audio&&......\...\.....\backsound.wav&&......\...\.....\BombSound.wav&&......\...\.....\shoot1.wav&&......\...\.....\shoot2.wav&&......\...\config&&......\...\......\fire_strategy.properties&&......\...\......\stage_1.properties
&输入关键字,在本站238万海量源码库中尽情搜索:用3.0实现飞机大战——用户数据的操作|皂荚花
有朋自远方来不亦乐乎!
程序不是看出来的,是写出来的!思想不是想出来的,是敲出来的!欢迎加群交流技术问题!
热度:2,339
本篇博客为飞机大战添加一下分数标签,同时保存用户的数据到xml文件中,我们可以做一个分数榜,来显示一下玩家的得分情况,本篇博客实现UserData类,然后添加到游戏主场景中显示玩家的当前得分情况,同时我们还将根据玩家的得分情况来设置敌机出现的数量,最后玩家退出游戏的时候保存分数到文件中,分数榜留作以后博客完成。下面看一下UserData类的写法。
#ifndef _SAVE_DATA_H_
#define _SAVE_DATA_H_
#include &cocos2d.h&
USING_NS_CC;
class SaveData : public Ref
SaveData(void);
~SaveData(void);
bool init();
CREATE_FUNC(SaveData);
//用户数据操作的成员变量
UserDefault * m_userD
//该集合中保存的是分数的记录,因为分数是基本数据类型,放到vector中的内容必须是Ref的子类,所以要用Value
//封装一下,但封装完毕却不是使用vector来存放,而是用ValueVector
ValueVector m_
//记录玩家的当前分数
CC_SYNTHESIZE(int,m_score,Score);
void save();
#include &SaveData.h&
SaveData::SaveData(void)
SaveData::~SaveData(void)
bool SaveData::init()
//先对成员变量进行初始化
m_userDefault = UserDefault::getInstance();
//初始化vector集合
m_vector = ValueVector();
//初始化本次游戏玩家得分
m_score = 0;
//每玩一次游戏,分数的记录条数就会加一
m_userDefault-&setIntegerForKey(&count&,(m_userDefault-&getIntegerForKey(&count&,0))+1);
//首先判断XML文件是否存在,如果不存在的话就会执行if中的语句
if(m_userDefault-&getBoolForKey(&isExit&,false) == false)
//玩家初次玩游戏会执行这里
m_userDefault-&setBoolForKey(&isExit&,true);
//将分数记录保存在vector集合中
for(int i=0;i&m_userDefault-&getIntegerForKey(&count&)-1;i++)
__String * index = String::createWithFormat(&%d&,i);
//将要放的数据使用Value包装一下
m_vector.push_back(Value(m_userDefault-&getIntegerForKey(index-&getCString())));
void SaveData::save()
/*本函数的整体思路是先对vector中保存的玩家数据进行排序,然后重新写入到xml文件中*/
//将玩家的分数保存到set集合中,以便排序
m_vector.push_back(Value(m_score));
//自定义排序函数,对m_vector中的内容进行排序,方便以后对数据的操作
auto sortData = [](Value value1,Value value2)
return value1.asInt()&value2.asInt();
//调用c++模板中的sort函数进行排序,前俩个参数是数组的地址,最后一个参数是使用的排序函数
std::sort(m_vector.begin(),m_vector.end(),sortData);
//将玩家的得分保存在文件中
for(int i=0;i&m_vector.size();i++)
auto value = m_vector.at(i);
auto index = __String::createWithFormat(&%d&,i);
m_userDefault-&setIntegerForKey(index-&getCString(),value.asInt());
m_userDefault-&flush();
在这个类中需要注意的是玩家分数会存放到一个vector集合中,为什么要这么做呢,因为我们要利用这个vector对玩家分数进行排序,方便以后做一个分数榜出来。玩家分数是int类型,vector中只能存放Ref的子类,所以int需要包装一下,也就是用到了Value类,关于这些容器的使用可以查看我前边的博客。最后我们使用的是ValueVector这个容器来存放数据,如果你使用vector的话是会报错的。接下来是对XML文件是否存在的一个判断,然后将XML文件中的内容读取到vector集合中,以便和本次的游戏得分进行比较,save函数比较重要,在save函数中演示了对vector排序的方法,我们需要在适当的时候调用这个函数,保存游戏数据。接下来就是什么时候用这个类了,我们需要显示玩家的得分情况,所以需要在UILayer中使用,以下是UILayer中init函数新增加的代码。
//添加显示分数的标签
m_saveData = SaveData::create();
//这里一定要retain一下saveData,在析构函数中release一下
m_saveData-&retain();
auto str = __String::createWithFormat(&%d&,m_saveData-&getScore());
m_score = Label::createWithBMFont(&font/font.fnt&,str-&getCString());
m_score-&setPosition(Point(score_label-&getContentSize().width+m_score-&getContentSize().width/2+30,
size.height-score_label-&getContentSize().height/2));
this-&addChild(m_score);
//记得更新分数的显示
this-&scheduleUpdate();
void UILayer::update(float tm)
auto str = __String::createWithFormat(&%d&,m_saveData-&getScore());
//更新分数和坐标
m_score-&setString(str-&getCString());
m_score-&setPositionX(score_label-&getContentSize().width+m_score-&getContentSize().width/2+30);
需要注意的是SaveData类继承自Ref,这里作为UILayer的成员变量的时候记着要retain,否则就释放掉了。好了,现在运行程序是不是添加了分数,但是我们消灭飞机分数是不变的,没错,因为我们还没有改变分数啊。改变的地方当然是敌机和子弹碰撞的时候了,下面就是代码。
//生命值为0敌机爆炸,如果敌机已经死亡就不要和剩下的子弹进行判断了,所以要break
if(enemyVector.at(i)-&getHp() == 0)
enemyVector.at(i)-&blowUp();
//改变分数
auto saveData = m_ui-&getSaveData();
//加上分数,这个分数是敌机的生命值,函数getOriginalHp是新加的
saveData-&setScore(saveData-&getScore()+enemyVector.at(i)-&getOriginalHp());
//获得敌机原始的血量值
int getOriginalHp(){return (m_frameName[5]-'0')*5;};
在游戏主场景中我将ui作为了成员变量,而ui中有一个成员变量是m_saveData,这样的话SaveData就不用写成单例的形式了,通过这种方式我们来改变玩家的分数。下面我们完成根据玩家的分数来改变敌机出现的频率,修改主场景中的函数addEnemy。
//添加敌机
void MainGame::addEnemy(float tm)
//这里是根据分数来改变敌机出现的快慢
int score = m_ui-&getSaveData()-&getScore();
//更新schedule只更新一次,使用level来控制
if(score&50 && m_level == 0)
m_level = 1;
else if(score&50 && score&=200 && m_level == 1)
//重新调用schedule会更新时间的
this-&schedule(SEL_SCHEDULE(&MainGame::addEnemy),0.8f);
m_level = 2;
else if(score&200 && score&=400 && m_level == 2)
this-&schedule(SEL_SCHEDULE(&MainGame::addEnemy),0.5f);
m_level = 3;
else if(score&400 && score&=800 && m_level == 3)
this-&schedule(SEL_SCHEDULE(&MainGame::addEnemy),0.4f);
m_level = 4;
else if(score&800 && m_level == 4)
this-&schedule(SEL_SCHEDULE(&MainGame::addEnemy),0.3f);
m_level = 5;
/*到此处为止,代码就没有修改了,上边是修改过的代码*/
auto enemy = EnemyBase::create();
//根据不同的概率来添加不同种类的飞机
int enemy_x = CCRANDOM_0_1()*9+1;
int count = 0;
if(enemy_x & 0 && enemy_x &7)
enemy_x = 1;
count = 4;
else if(enemy_x &= 7 && enemy_x & 9)
enemy_x = 2;
count = 4;
//敌机三用到的背景图片不太一样,这里单独的建立下
count = 6;
enemy-&initEnemy(&enemy3_n1&,count);
//创建敌机三的动画
Vector&SpriteFrame *&
vector.pushBack(SpriteFrameCache::getInstance()-&getSpriteFrameByName(&enemy3_n1.png&));
vector.pushBack(SpriteFrameCache::getInstance()-&getSpriteFrameByName(&enemy3_n2.png&));
auto animation = Animation::createWithSpriteFrames(vector,0.2f,-1);
auto animate = Animate::create(animation);
enemy-&runAction(animate);
//添加到当前的层中
this-&addChild(enemy);
//将敌机添加到管理器中
auto & enemyVector = Manager::getInstance()-&getEnemyVector();
enemyVector.pushBack(enemy);
//直接返回,不再执行下面的语句
//以下的这句话一定要调用
auto str = __String::createWithFormat(&enemy%d&,enemy_x);
enemy-&initEnemy(str-&getCString(),count);
this-&addChild(enemy);
//将敌机添加到管理器中
auto & vector = Manager::getInstance()-&getEnemyVector();
vector.pushBack(enemy);
如果只修改上边的代码你会发现如果我们不暂停场景游戏是没有任何问题的,但是如果暂停了场景再开始游戏敌机出现的频率一下子就慢了下来。这是因为我们暂停场景的时候是用的入栈的方式,出栈以后会执行onEnterTransitionDidFinish函数,在这个函数中更新了敌机出现的频率为1,所以对代码做如下的改动。
//场景切换完毕调用
void MainGame::onEnterTransitionDidFinish()
//必须先调用父类的函数
Layer::onEnterTransitionDidFinish();
//添加敌机,每秒添加一个
float tm = 1.0f;
if(m_level == 1)
tm = 0.8f;
else if(m_level == 2)
tm = 0.5f;
else if(m_level == 3)
tm = 0.4f;
else if(m_level == 4)
tm = 0.3f;
this-&schedule(SEL_SCHEDULE(&MainGame::addEnemy),tm);
//添加子弹
this-&schedule(SEL_SCHEDULE(&MainGame::addBullet),0.1f);
//添加UFO和炸弹,每十秒出现一个UFO或者是炸弹
this-&schedule(SEL_SCHEDULE(&MainGame::addUfo),10.0f);
//碰撞检测
this-&schedule(SEL_SCHEDULE(&MainGame::isHitEnemy));
最后玩家退出游戏的时候需要调用一下Sava函数,这个位置就不用我说了吧。
2014年十月 &(8)
2014年九月 &(3)
2014年八月 &(7)
2014年七月 &(14)
2014年六月 &(15)
2014年五月 &(19)
2014年四月 &(14)
2014年三月 &(22)
2014年二月 &(59)
2014年一月 &(16)
小广告-翻墙小插件
文章关键字
Powered by

我要回帖

更多关于 游戏设定 的文章

 

随机推荐