`

Flixel横板游戏制作教程(四)— RandomLevels

 
阅读更多

from: http://bbs.9ria.com/thread-77302-1-1.html

 

演示程序

http://www.adamatomic.com/canabalt/

http://www.flixel.org/mode/

 

Flixel横板游戏制作教程(四)— RandomLevels

本教程是接着Flixel横板游戏制作教程(三)— AddingWeapons来做的。
现在我们来给游戏加入 随机的平台,由于本次教程的重点是随机平台的算法,所以对算法不太明白的同学大可以不去理会,喜欢研究的就看看算法吧。后面的教程会介绍一个专门配合flixel 的地图编辑器,非常好用,所以本次教程属于 娱乐向。。。看看就好,不比深究。
那么开始了,看到 GameState 类:

 

package 
{
        import org.flixel.FlxG;
        import org.flixel.FlxGroup;
        import org.flixel.FlxState;
        import org.flixel.FlxTileblock;
        import org.flixel.FlxU;
        
        /**
         * ...
         * @author zb
         */
        public class GameState extends FlxState 
        {
                /***********   前面已有的声明  *************/
                
                //地图制作用
                //地图宽度
                static public const MAP_WIDTH:Number = 640;
                //地图高度
                static public const MAP_HEIGHT:Number = 480;
                //素材中每个小砖块的宽度
                static private const TILE_BLOCK_WIDTH:Number = 8;
                //随机地图中一个矩形平台一个方向(水平方向或垂直方向)的最大的砖块数量
                //比如 最大的一个平台的砖块数 是 4*4=16
                static private const MAX_TILE_BLOCK_NUM:uint = 4;
                ///随机地图中一个矩形平台一个方向(水平方向或垂直方向)的最大的砖块数量
                static private const MIN_TILE_BLOCK_NUM:uint = 2;
                //每次进行随机平台生成的时候,重复的次数,用法见下面算法中解释
                static private const RANDOM_LOOP_COUNT:int = 5;
                //我们用一个 flxGroup来储存 生成的 随机平台
                protected var levels:FlxGroup;
                override public function create():void 
                {
                        //*********已有的内容**********/
                        
                        //这里不需要上一节的 地板了,注释掉吧
                        //addGround();
                        
                        //*********已有的内容**********/
                        
                        //加入随机地图
                        addRandomMap();
                }
                
                //************已有的 方法**************//
                
                private function addRandomMap():void
                {
                        levels = new FlxGroup();
                        //生成地图边界
                        var tile:FlxTileblock;
                        //地图的左边界
                        tile = new FlxTileblock(0, 0, 8, MAP_HEIGHT);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //地图的下边界
                        tile = new FlxTileblock(0, MAP_HEIGHT-8, MAP_WIDTH, 8);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //地图的右边界
                        tile = new FlxTileblock(MAP_WIDTH-8, 0, 8, MAP_HEIGHT);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //地图的上边界
                        tile = new FlxTileblock(0, 0, MAP_WIDTH, 8);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //将levels 组加入到显示列表中
                        //注意,只要 flxGroup 被添加进入了 显示列表,
                        //后面 再 加入组的 object 也会自动加入显示列表中
                        add(levels);
                        
                        //下面就是生成随机平台了,这里生成 150 个平台
                        for (var i:int = 0; i < 150; i++) 
                        {
                                addRandomTile();
                        }
                }
                
                private function addRandomTile():void
                {
                        //随机矩形平台的实例
                        var newTile:FlxTileblock;
                        //随机矩形平台的宽度
                        var blockWidth:Number;
                        //随机矩形平台的高度
                        var blockHeight:Number;
                        //随机平台的 x 坐标
                        var blockX:Number;
                        //随机平台的 y 坐标
                        var blockY:Number;
                        
                        //这个是用来判断 这次新生成的 平台,是否与 之前的平台 重叠
                        var newTileIsOverlapOthers:Boolean = false;
                        //重新生成随机平台的重复次数,用在 当与之前的 平台重叠时
                        //取消并重新生成一个新的平台,再进行 重叠判断
                        //当 重复次数 超过规定的 最大重复 次数时,则取消本次 随机平台的生成
                        var loopCount:int = 0;
                        
                        //进行本次随机平台的生成与重叠判断循环
                        do {
                                //计算随机平台的宽度
                                // int(Math.random() * (MAX_TILE_BLOCK_NUM - MIN_TILE_BLOCK_NUM) + MIN_TILE_BLOCK_NUM)
                                // 上面这个是 水平方向的 砖块数量
                                // * TILE_BLOCK_WIDTH ,然后 砖块数量 乘上 砖块的 宽度,
                                //就是平台的宽度了 
                                blockWidth = int(Math.random() * (MAX_TILE_BLOCK_NUM - MIN_TILE_BLOCK_NUM) + MIN_TILE_BLOCK_NUM) * TILE_BLOCK_WIDTH;
                                
                                //计算随机平台的高度
                                //因为 这里素材中 砖块的高度和宽度 都是 8,所以就不再额外加入 高度的静态值了
                                blockHeight = int(Math.random() * (MAX_TILE_BLOCK_NUM - MIN_TILE_BLOCK_NUM) + MIN_TILE_BLOCK_NUM) * TILE_BLOCK_WIDTH;
                                
                                //计算平台的 x 坐标位置
                                //MAP_WIDTH / TILE_BLOCK_WIDTH,这个是先计算出 地图的宽度 相当于多少个小砖块的数量
                                //使用 random ,得到一个 砖块数的 随机值
                                // - MAX_TILE_BLOCK_NUM,接着减去一个 每个随机平台的 最大数量,
                                //就可以保证 平台的位置 不会超过 地图边界
                                // * TILE_BLOCK_WIDTH,最后乘上小砖块的宽度,算出平台的 x 坐标
                                blockX = int(Math.random() * MAP_WIDTH / TILE_BLOCK_WIDTH - MAX_TILE_BLOCK_NUM) * TILE_BLOCK_WIDTH;
                                //同样算出 y 坐标
                                blockY = int(Math.random() * MAP_HEIGHT / TILE_BLOCK_WIDTH - MAX_TILE_BLOCK_NUM) * TILE_BLOCK_WIDTH;
                                
                                //这里就生成一个 随机的砖块了
                                newTile = new FlxTileblock(blockX, blockY, blockWidth, blockHeight);
                                newTile.loadTiles(tileImg);
                                
                                //遍历levels 组中的 平台
                                for each (var existTile:FlxTileblock in levels.members) 
                                {
                                        //当 新生成的 平台 与 之前的平台 重叠的话
                                        //就会返回 true
                                        //overlaps方法,判断 本object 是否与 参数中的 object 重叠
                                        newTileIsOverlapOthers = newTile.overlaps(existTile);
                                        
                                        //如果 发生重叠了 ,就停止遍历
                                        if (newTileIsOverlapOthers) 
                                        {
                                                break;
                                        }
                                }
                                
                                //重复次数 增加 1
                                ++loopCount;
                                
                                //当 发现 重叠 并且 重复次数 小于 最大重复次数时
                                //回到循环,并重新 生成一个新的 随机平台
                                //再与 之前 的平台 进行 重叠 判断
                                //最大重复 次数 为 RANDOM_LOOP_COUNT
                                //如果 不重叠,或者 重复次数 超过 最大重复次数
                                //结束循环
                        }while (newTileIsOverlapOthers && loopCount < RANDOM_LOOP_COUNT)
                        
                        //不管 本次生成的 随机平台 是否与之前的 重叠
                        //都会加入到 平台 组中
                        //由于 有 一定的 重复机会
                        //所以 不重叠的 概率 也有 一定保证
                        levels.add(newTile);
                }
                
            override public function update():void 
                {
                        //由于前面的地板方法被注释掉了,这个也跟着注释吧!
                        //FlxU.collide(player, groundTile);
                        
                        //同上,注释掉吧
                        //FlxU.collide(bullets, groundTile);
                        
                        //加入 子弹 与 现在 的 levels 碰撞检测
                        FlxU.collide(bullets, levels);
                        //人物与 levels 碰撞检测
                        FlxU.collide(player, levels);
                        
                        //还是要提醒下,别忘了加上。。。
                        super.update();
                }
        }
        
}

 看看运行效果吧,每次进入游戏都不一样哦~

 



 

  • 大小: 10.2 KB
分享到:
评论

相关推荐

    Flixel 横板游戏制作教程(一)— HelloFlixel ...

    标题中的“Flixel横板游戏制作教程(一)— HelloFlixel”指的是一个针对初学者的游戏开发系列教程,重点介绍了如何使用Flixel框架创建2D横版游戏。Flixel是一款开源的ActionScript库,适用于Flash平台,但现在也...

    Flixel横板游戏制作教程(二)— AddingPlayer

    在"Flixel横板游戏制作教程(二)— AddingPlayer"中,我们将深入学习如何使用Flixel框架创建一个2D横向滚动的游戏。Flixel是一个开源的ActionScript 3库,特别适合开发2D游戏,它提供了丰富的功能,如精灵动画、...

    Flixel横板游戏制作教程(三)— AddingWeapons

    在本教程中,“Flixel横板游戏制作教程(三)— Adding Weapons”将带领我们探索如何在基于Flixel框架的2D横版游戏中添加武器系统。Flixel是一个用ActionScript 3编写的开源游戏库,适用于Flash平台,但也可以通过...

    Flixel横板游戏制作教程(五)— Enemies

    在本教程“Flixel横板游戏制作教程(五)— Enemies”中,我们将深入学习如何在使用Flixel框架创建的2D横版游戏中添加敌人。Flixel是一个流行的开源ActionScript 3库,常用于开发2D游戏,尤其适用于Flash平台。尽管...

    Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台)

    文档`Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台).doc`提供了详细的步骤和示例代码,帮助开发者理解移动平台的实现过程。通过阅读这份文档,你可以学习到如何编写`MovingPlatform`类的代码,以及...

    Flixel横板游戏制作教程(十一)—JetPack(飞行背包)

    最后,`Flixel横板游戏制作教程(十一)—JetPack(飞行背包).doc`文档应该详细解释了整个过程,包括代码示例和步骤指南,帮助开发者理解如何集成飞行背包功能。 通过这个教程,开发者不仅可以学习到Flixel框架的...

    Flixel 横板游戏制作教程(完结)

    Flixel是啥?一个AS3的2D游戏引擎,主要功能为: •同屏显示更多元素 •通过外部文件和图片创建Tilemap ...本教程是根据一个老版本(版本为 1.27)的教程改写而成的,本教程的Flixel版本为 2.43的。

    Flixel横板游戏制作教程(九)—SquashingthePlayer(挤压Player)

    文档`Flixel横板游戏制作教程(九)—SquashingthePlayer(移动平台).doc`详细解释了如何实现挤压效果,特别是针对移动平台的特殊情况。阅读这份文档将有助于理解如何在Flixel中应用挤压效果,以及如何处理移动平台...

    Flixel横板游戏制作教程(七)—VictoryState(胜利状态)

    总之,本教程通过`Flixel横板游戏制作教程(七)—VictoryState(胜利状态).doc`文档,详细讲解了如何在Flixel环境中创建和管理游戏的不同状态,特别是胜利状态的实现。通过学习这些内容,开发者可以更好地理解和...

    Flixel 横板游戏制作教

    ### Flixel横版游戏制作教程 #### 一、Flixel 游戏框架简介 Flixel是一款基于Adobe Flash的开源2D游戏开发框架,它由Adam “Atomic” Saltsman创建,广泛应用于Flash游戏的开发。Flixel简化了许多常见的游戏开发...

    Flixel横板游戏制作教程(十)—Pickups(拾取道具)

    在本教程中,我们将探索如何在使用Flixel框架创建的横版游戏中实现Pickups(拾取道具)功能。Flixel是一个强大的2D游戏开发库,为ActionScript 3和Haxe开发者提供了丰富的功能,使得游戏开发变得更加简单。在这个...

    Flixel横板游戏制作教程(六)—SoundsandMusic(音效与音乐)

    在本教程中,我们将深入探讨如何在Flixel框架中集成音效与音乐,以创建一个生动有趣的横版游戏。Flixel是一个流行的开源ActionScript 3库,它为开发2D游戏提供了丰富的功能,包括图形渲染、碰撞检测以及音频处理。 ...

    flixel platform game example

    尽管现代Web已转向HTML5,但AS3和Flixel仍然是学习游戏开发和经典Flash游戏制作的重要资源。 在压缩包中的文件 "Nutmeg Part 3 - Final Game" 可能是指游戏项目的一个特定阶段或部分,可能是一个系列教程或项目的一...

    flixel 游戏源代码

    `Flixel横板游戏制作教程(四)— RandomlyLevels .doc`是一个文档,可能详细介绍了如何创建随机生成的关卡,这是很多游戏增加重玩价值和挑战性的重要手段。学习如何动态生成关卡布局,可以使游戏更具吸引力。 最后...

    Flixel AS3游戏引擎

    总的来说,Flixel AS3游戏引擎是ActionScript开发者构建2D游戏的强大工具,它提供了全面的游戏开发功能,同时保持了较低的学习曲线,使得小型团队和个人开发者也能制作出高质量的游戏作品。结合其开源社区的支持,...

    Flixel游戏框架初探

    ### Flixel游戏框架初探 #### 一、Flixel框架简介 Flixel是一款完全开源的Flash游戏开发框架,适用于2D横版动作类游戏的开发。它提供了丰富的功能,包括动画处理、物体运动、2D碰撞检测、Tilemap支持以及场景管理...

    Flixel-flash开源游戏引擎

    Flixel是一个强大的开源游戏开发框架,专门针对Adobe Flash平台设计。它以其高效、轻量级和易用性而受到开发者们的青睐。Flixel以其丰富的功能集,为创建2D游戏提供了全面的支持,包括精灵动画、物理系统、音频处理...

    flash flixel游戏引擎

    **Flash Flixel游戏引擎详解** Flash Flixel是一款强大的开源游戏引擎,专为创建2D像素艺术风格的游戏而设计,让人联想到经典的Game Boy Advance(GBA)游戏。Flixel以其简单易用和丰富的功能集而受到游戏开发者们...

    flixel_as3小游戏(开源)

    这个项目为游戏开发者和AS3爱好者提供了一个宝贵的学习资源,它包含四个不同类型的小游戏,展示了如何使用flixel库来构建横版卷轴游戏。下面我们将深入探讨这个开源项目的关键知识点。 首先,我们要了解flixel是...

Global site tag (gtag.js) - Google Analytics