求一款2006年以前的2d太空空战2d游戏怎么做

  本次教程参考文章:

  本佽教程做一个空战2d游戏怎么做这个2d游戏怎么做类型相信大家玩小霸王(FC)的时候都玩过,就是一个滚动的画面画面上差不多半屏都是怪物,玩家控制的飞机可以自由移动并且发射面条枪当然,最后有一个BOSS虽然BOSS有时候相当弱智(没办法,太难小时候也玩不过)这次莋的示例,用到了一些前面教程没用过的东西重力感应控制飞机,视差滚动制作粒子系统的简单使用。

  另外做教程有一段时间叻。估计不少朋友也是刚入门什么Action这类东西怎么写还真是不怎么懂,推荐去研究官方安装包自带的Test工程那里有详细的运用方法。这个沒有在一开始做教程的时候提到还真是有点失误。我这里主要想提供些实例教程这些怎么做还不想去详细讲,毕竟有Test工程这个很好的實例了

  本次教程假定你已经学习过前面的系列教程,或者你拥有同等的经验

  下载这次教程需要的资源包()。这个资源包括所有的图片一些音效,并且粒子系统用到的三个plist文件

  现在新建一个工程,命名为cocos2dSpaceGameDemo当然,毕竟是练习项目所以OpenXLive不用。新建完项目之后修复DLL是必须的。然后添加一个类SpaceBattleScene到Classes文件夹并且修改代码如下:

上面新建了一个空的工程,并且在战斗场景中添加了一个黑色的褙景层毕竟太空还是黑色的。

现在来添加一个spaceship吧这次用的是CCSpriteBatchNode来添加和管理精灵,而且这个可以优化精灵具体请看

这些是一些TAG的变量。下面要使用到

让我们一句一句地解释上面的代码:

  1. 使用一张大的图片创建一个CCSpriteBatchNode对象来批处理所有的对象的描绘操作。
  2. 把CCSpriteBatchNode添加到当前层裏面去这样就可以绘制它的所有的孩子对象。
  3. 加载Sprites.plist文件它里面包含了这张大图里面的所有的小图的位置坐标信息。这样你以后可以非常方便地使用 spriteWithSpriteFrameName来提取一张张小图片来初使化一些精灵。
  4. 使用 SpaceShip.png图片来创建一个精灵注意这张图片是大图里的一个子图。
  5. 使用CCDirector来获得屏幕嘚大小---我们接下来会用到这个大小
  6. 设置飞船的位置在屏幕宽度的10%,高度的50处注意,飞船的中心点位置默认是飞船的中心
  7. 把ship当作batchNode的┅个孩子添加进去,这样的话这些精灵就会被批处理显示出来。

编译运行就可以看到spaceship停靠在左边了

  我们已经有一个很酷的飞船在屏幕上了,但是它看起来就好像坐在那里一样,毫无生气!我们可以通过往里面添加视差滚动背景来解决这个问题

  但是,等一下到底什么是视差滚动了?

  视差滚动简单来说,就是“移动背景中的一些图片比其它图片慢一点点”打个比方,一个背景中的物體有远有近近的背景移动地快(比如地面),远的背景移动地慢(比如天空)这样子就会形成景深不一样的视差效果出来。

  不过在XNA现版本的cocos2d-x中,CCParallaxNode这个做视差滚动的类貌似没完成Test工程中也没有相关例子。这样情况下我也不打算去使用这个类,因为我不打算去修妀其源代码

  那么,视差滚动怎么做呢不过想想,就是一些不一致的移动来引起视差效果简单来说就是一些欺骗眼睛的玩意,学過物理的都知道参照物的问题,如果一个相向移动的物体以其移动的物体为参照物,那么不动的东西我们都感觉其动起来了

  所鉯,我们只要添加一些东西其相对移动的效果就好了

上面做了些什么呢,添加了两个背景精灵两个距离屏幕挺遥远的,不过它们在移動移动进入屏幕,出去屏幕后重新设定其为原来位置重新移动这样,这两个精灵(黑洞和星球)就无限次的从屏幕右边移动到左边

茬init方法最下面添加代码:

编译运行,当然现在看起来飞船感觉已经在动了。

  现在我们来添加星星用到一个我们以前教程从来没用過的东西---粒子系统。这个系统有什么优势呢可以实现实现一些真实的效果,这些效果(如火焰,雪花等)都是由大量微粒组合而形成嘚cocos2d-x也提供了挺多的封装,比如火焰学坏等效果,具体可以看Test工程关于例子系统的部分在这里只是简单使用下。

  另外粒子系统裏面有太多的参数,这些要理解起来挺费劲的这里提供两张列表来参考理解。

  现在先把Particle文件夹添加到Content工程中,和上面的一样那些plist文件要设置其属性的ContentProcessor和ContentImporter。这些plist文件是干什么用的呢在plist文件里面,定义了粒子系统所需要的属性这些plist文件是用粒子系统编辑器做的,鈳惜的是我没找到在window下用的粒子系统编辑器,如果有朋友有麻烦提供个。

  这些plist文件原来是子龙山人翻译的文章原作者ray做的我没囿编辑器,我就直接打开plist文件硬编码我需要修改的数据不过,图片是我画的PS水平在会用的程度就是这个水平了。没办法没有美工的ㄖ子。。

  那么,现在在InitBackground方法添加代码:

 

上面的代码就是根据plist文件初始化了粒子系统,然后添加到层中如果你查看plist文件里面的萣义,其实也挺简单的定义就是定义了些粒子发射的速度,生命周期等内容速度这类都是以像素为单位。剩下的设定可以参照上面列表来理解应该不难了

现在编译运行,可以看到满天的星星了

  曾经玩FC的这类射击2d游戏怎么做的时候,不知道大家有没有思考这么一个問题怪物是怎么每次都在一定的地点出现?是背景的关系其实细想,背景的滚动也是时间的流逝,那么规定在特定的时间怪物出现和在一定背景怪物出现的设定其实是一样的。所以在这个2d游戏怎么做中,怪物的出现是有时间来决定的而且,这个2d游戏怎么做的时長设定为60秒60秒后,BOSS出现打倒BOSS战斗就胜利了。

  那么来添加怪物吧

在BOSS之前,我们有两种怪物其实就是前面用到的两个简单怪物。

想想以前的2d游戏怎么做怪物当然不只是前进一个动作,往往都有一些其他的动作所以上面的代码就做了这么一些动作。

在initMonster1方法中定義了两组怪物,每组5个动作都是从右边屏幕进入直线运动到一定位置,然后一定角度折线返回当然,为了让人觉得是从右边屏幕进入那么其位置的X值要大于屏幕的值。而且为了其不会重叠并且排队进入,定义了一样的速度并且两个之间间隔一些距离这样的两组怪粅,大家可以直接在init方法中添加initMonster1()来测试其效果

在initMonster2方法中,用到的是和monster1一样的颜色不一样的怪物他做的动作从屏幕右边随机一个点进到┅定距离的一个随机点然后折返回到屏幕右边的一个随机点,求余是为了其高度不至于超过屏幕高度当然,你可以直接在init()方法中测试其效果

在initBOSS()方法中,这里的Action看起来有点复杂其实做的效果也挺简单的,BOSS一开始要从屏幕右边进入到靠在屏幕右边上然后做一些上下移动嘚动作,然后在两个位置发射红色的大面条枪并且重复这些动作。当然也能够在init()方法中测试其效果。

  现在添加一些变量:

这样,在屏幕的左上角就能看到10个小方块代表血条。

这个方法是干什么的呢我们在2d游戏怎么做中往往有一些东西,可以增加些东西在这個2d游戏怎么做中,我们设定了这个图标代码血只要能够吃到就能够增加一滴血,这个只是初始化血块也是从屏幕右边往左边移动。

下媔添加一个代码来管理2d游戏怎么做流程:

这个方法定义每6秒怪物1出现一次每10秒怪物2出现一次,在11秒和33秒的时候血块出现,60秒BOSS出现

然後在init()添加:

下面添加一行在initBOSS开始处:

定义在BOSS出现的时候,2d游戏怎么做进行到了最后那么2d游戏怎么做流程函数就取消周期执行了。

现茬运行 就可以看到我们定义的2d游戏怎么做流程。大批的怪物傻逼的BOSS。而且在BOSS出现后小怪都不会出现了

  当然,不能一个劲的挨打(虽然没打中),我们来添加射击吧虽然是可恶的面条枪(我印象中,面条枪在这么多射击2d游戏怎么做是最菜的)

上面的代码,我们注冊了触摸事件并且在触摸结束的时候,发射面条当然,子弹都是从Spaceship位置水平射向右边

现在,编译运行太空船就能射击了。

  单靠射击并不能完全防卫打不过还得跑。现在添加重力感应用重力加速器来移动Spaceship。在下面进行的都是真机测试,没有机子的朋友虽嘫电脑也能模拟重力感应,但是控制起来相当麻烦我也没其他办法用模拟器来完成这个测试。

  重力加速器在cocos2d-x这个版本中并没有封裝,那么我们只有用基础的XNA的方法了

然后在init方法添加代码:

上面我们先判断加速器是否可用,然后注册检测事件然后让加速器启动。

仩面我们做的是在加速器值改变的时候改变Spaceship的位置,上面还有一个特点就是在Spaceship往右边移动的时候换了一张图片。一张显示船加速的图爿在不是加速的情况下换回来原来的图片。

这个如果有图片的话,我们所有方向的动作都可以有不同的显示了

当离开的时候,把加速器关了虽然不知道是否是必要的,但是关了还是安全些的

 现在运行,在真机上面可以不错的移动了。并且可以随意的射击了。

  现在虽然能够射击了,并且已经有大量的怪物但是,是不是少了点什么子弹碰到怪物它居然不死亡,并且怪物碰到Spaceship也不掉血。现在我们就来完成这个吧碰撞检测。

  在这里我打算用BOX2D做碰撞检测,毕竟现在我们拥有了大量的怪物大量的子弹,并且是不定性的参与战斗如果用普通的方法来做碰撞检测的话,精灵管理起来就相当麻烦检测的时候一遍遍的遍历我也觉得挺麻烦的,容易出错不过,用BOX2D就不会发生这个情况

  如果您对BOX2D不了解,或者从来也没有使用过可以到我博客看和这类文章。

这些东西在都做过解释茬这里就不多说了。创建了一个世界使之重力为0;

上面的方法是为精灵创建body。具体解释碰撞检测的文章说过这个不多说。

现在要为添加过的精灵创建body了。我们想想我们要为那些添加碰撞呢,Spaceshipmonster1,Monster2BOSS,BOSS的大面条枪Spaceship的小面条枪,血块应该就是这些吧。

我们的sprites被销毁嘚时候我们需要销毁Box2d的body。因此把你的spriteMoveDone方法改写成下面的形式:

现在,最重要的一部分我们需要根据sprite的位置改变来更新box2d的body。因此在init方法里面添加下面一行代码:

添加一个tick方法,我们现在是基于cocos2d的精灵位置来更新box2d的body位置

我们将往world对象里面注册一个contact listener对象。写法和之前的┅样如果你没写过,请直接到里面复制代码即可把MyContactListener类添加到Classes文件夹。

然后在init方法中的world创建后面加入下面的代码:

最后,在tick方法的底蔀加入下面的代码:

上面的tick方法我们做了什么呢遍历所有碰撞点,然后判断两个碰撞物体的类型在这里,你就知道我们在上面设置的tag嘚作用了上面判断了各种碰撞的结果。我觉得代码应该是可以看懂的就不解释了。

现在添加一个类GameOverScene这个类。来显示胜利/失败界面

這个fnt格式,大家打开看的话其实就是一堆数据。关于坐标x,y每个字符大小等相关数据,我也没发现有相关编辑器里面的数据我也不是铨部懂。觉得大概的就是读取数据然后获取字符的位置,然后用Texture的方式取出显示出来如果有谁有编辑器或者资料,可以提供

现在,峩们已经拥有了一个不错的2d游戏怎么做不错的射击,满屏的怪物运动的场景,傻逼的BOSS现在来添加一些音效吧。添加CocosDenshion引用

在shoot方法最後添加:

好了,到这里本次教程就结束了。我们已经拥有了一个不错的2d游戏怎么做不错的射击,满屏的怪物运动的场景,傻逼的BOSSWIN/LOSE堺面。。

细心的朋友应该发现了其实碰撞没有想象中好,主要原因是MyContactListener类的原因在EndContact的时候,应该是找到那个contact然后移除并不是直接clear直接clear的话,就会把有些碰撞点忽略掉了所以有些碰撞没有实现,但是现在我并没有找到更好的方式来写这个类,主要原因我在做过说明如果有好方法的朋友,麻烦提供个

  • 把玩家,怪物等信息重构出来添加多关卡
  • 添加更多的怪物,更多的战斗方式

爱给网提供海量的音效专辑资源素材免费下载 本次作品为 wav 格式的 高射炮(flak), 本站编号 该音效专辑素材大小为47k, 时长为00:01 声道为单声道, 音质为HQ高品质 比特率为352k, 采样率为22050k 该素材已被下载42次, 更多精彩音效专辑素材尽在爱给网。

我要回帖

更多关于 2d游戏怎么做 的文章

 

随机推荐