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

本文介绍如何使用Flixel游戏框架创建横版游戏中常见的移动平台。通过定义MovingPlatform类并设置其水平和垂直移动范围,实现平台在游戏世界中的自动往返运动。同时,展示了如何在GameState中实例化不同的移动平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

演示程序

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

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

 

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

Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台)
本教程是接着Flixel横板游戏制作教程(七)—VictoryState(胜利状态)来做的。
移动平台是很多横板游戏里都存在的,下面开始来做吧~
先看移动平台类MovingPlatform :

package 
{
        import org.flixel.FlxObject;
        import org.flixel.FlxTileblock;
        
        /**
         * ...
         * @author zb
         */
        public class MovingPlatform extends FlxTileblock 
        {
                //平台水平移动的最大范围
                public var horizonMoving:uint;
                //平台垂直移动的最大范围
                public var verticalMoving:uint;
                //平台的初始 x 坐标
                public var stX:int;
                //平台的初始 y 坐标
                public var stY:int;
                //平台垂直方向的标识
                private var velFacing:uint;
                /**
                 * 构造方法
                 * @param        X 初始 x 坐标
                 * @param        Y 初始 y 坐标
                 * @param        Width 平台的宽度
                 * @param        Height 平台的高度
                 * @param        HM 平台水平移动的最大范围
                 * @param        VM 平台垂直移动的最大范围
                 * @param        randomPos 是否使用随机移动位置,就是说平台是否从范围内的某个点开始移动
                 */
                public function MovingPlatform(X:int, Y:int, Width:uint, Height:uint,HM:uint,VM:uint,randomPos:Boolean=true):void 
                {
                        //先调用super
                        super(X, Y, Width, Height);
                        //赋值初始 坐标
                        stX = X;
                        stY = Y;
                        //赋值水平和垂直最大移动范围
                        horizonMoving = HM;
                        verticalMoving = VM;
                        
                        //设置最大速度以及速度值,这里最大速度是用于给正反移动方向的速度赋值
                        maxVelocity.x = HM * 0.2;
                        maxVelocity.y = VM * 0.2;
                        velocity.x = maxVelocity.x;
                        velocity.y = maxVelocity.y;
                        
                        //facing在这里作为水平方向的标识,默认向右
                        facing = RIGHT;
                        //垂直方向标识,DOWN 和 UP 是flxSprite的静态变量,默认向下
                        velFacing = DOWN;
                        
                        //如果设置了 randomPos 为 true
                        if (randomPos) 
                        {
                                //那么x 和 y 的位置就设置成 范围内的 某个随机点
                                x = Math.random() * HM + stX;
                                y = Math.random() * VM + stY;
                        }
                }
                
                override public function update():void 
                {
                        //当平台 x 坐标大于最大水平范围 且方向为 右时
                        if (x > (stX+horizonMoving) && facing==RIGHT) 
                        {
                                //将 x 轴的坐标设置为 负值,即向左移动
                                velocity.x = -maxVelocity.x;
                                //设置 facing方向 为 左
                                facing = LEFT;
                        }else if (x < stX && facing==LEFT) 
                        {
                                //如果 x 坐标小于初始 坐标,就设置速度 向右
                                velocity.x = maxVelocity.x;
                                facing = RIGHT;
                        }
                        if (y > (stY+verticalMoving) && velFacing==DOWN) 
                        {
                                //当 y 坐标大于 垂直最大范围,且方向向下
                                //将 y 速度设置 向上,velFacing 向上
                                velocity.y = -maxVelocity.y;
                                velFacing = UP;
                        }else if (y < stY && velFacing==UP) 
                        {
                                //当 y 坐标小于 垂直最大范围,且方向向上
                                //将 y 速度设置 向下,velFacing 向下
                                velocity.y = maxVelocity.y;
                                velFacing = DOWN;
                        }
                        //别忘了
                        super.update();
                }
        }
        
}

 接着是 GameState 类:

package 
{
        import org.flixel.FlxG;
        import org.flixel.FlxGroup;
        import org.flixel.FlxObject;
        import org.flixel.FlxState;
        import org.flixel.FlxText;
        import org.flixel.FlxTileblock;
        import org.flixel.FlxU;
        
        /**
         * ...
         * @author zb
         */
        public class GameState extends FlxState 
        {
                //*********已有的内容************//
                override public function create():void 
                {
                        //*********已有的内容************//
                        
                        //注释掉
                        //addRandomMap();
                        
                        //注释掉
                        //addEnemies();
                        
                        //注释掉
                        //addEnemyCounter();
                        
                        //加入移动平台
                        addMovingPlatForms();
                }
                
                //*********已有的内容************//
                
                private function addMovingPlatForms():void
                {
                        //这个判断主要是配合教程来做
                        //如果使用了 addRandomTile 方法的话,这里就需要加个判断。。
                        //为了方便查看移动平台的效果,建议 注释掉 addRandomTile 方法
                        if (levels==null) 
                        {
                                levels = new FlxGroup();
                        }
                        
                        //加入一个地板。。。
                        var tile:FlxTileblock = new FlxTileblock(0, 200, 640, 20);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //这个是水平和垂直方向都移动的平台
                        tile = new MovingPlatform(240, 30, 8 * 20, 8*3,150,140,false);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //只 水平移动的平台
                        tile = new MovingPlatform(100, 170, 8 * 10, 8*3,250,0);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        //只垂直移动的平台
                        tile = new MovingPlatform(120, 0, 8 * 10, 8*3,0,120);
                        tile.loadTiles(tileImg);
                        levels.add(tile);
                        
                        add(levels);
                }
                
            override public function update():void 
                {
                        //*********已有的内容************//
                        
                        //注释掉
                        //FlxU.collide(enemyGroup, levels);
                        
                        //注释掉
                        //FlxU.overlap(bullets, enemyGroup, hitEnemy);
                        
                        //注释掉
                        //checkEnemyCount();
                        
                        
                        //还是要提醒下,别忘了加上。。。
                        super.update();
                }
                
                //*********已有的内容************//
        }
        
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值