如何检测播放器是否在平台上

时间:2014-01-14 01:46:42

标签: actionscript-3 collision platform

我正在使用as3制作一个基本的平台游戏,并试图找到一种方法来检测我的玩家是否在平台上,所以我可以让他跳跃,如果他在它上面,但如果他是的话就不能跳离开平台。这是我的代码:

package  {
import flash.display.MovieClip
import flash.events.Event
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip
{

    var _vx = 0
    var _vy = 0
    var _ay = 0.5
    var _isOnGround:Boolean
    var canJump:Boolean
    var _collisionArea:MovieClip
    // Constants:
    // Public Properties:
    // Private Properties:


    // Initialization:
    public function Main()
    {

        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp)
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    function onKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            _vx = -5;
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            _vx = 5;
        }
        else if (event.keyCode == Keyboard.UP  )
        {
            if (canJump)
            {
                _vy = -10
            }
        }
    }
    function onKeyUp(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            _vx = 0;
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            _vx = 0;
        }
    }
    public function onEnterFrame(event:Event):void
    {

        if(player1.isOnGround)
        {
            canJump=true
        }
        else if (!player1.isOnGround)
        {
            canJump=false
        }
        if (_vy > 10)
        {
            _vy = 10
        }
        player1.y += _vy
        player1.x += _vx

        vy += _ay
        //Player vs wall collision
        for (var i:int = 0; i <= 4; i++)
        {
            CollisionB.platform_BlockRectangles(player1, this["wall" + i]);
            //trace("wall" + i);
        }
    }

    public function set vx(vxValue:Number):void
    {
        _vx = vxValue;
    }
    public function get vx():Number
    {
        return _vx;
    }
    public function set vy(vyValue:Number):void
    {
        _vy = vyValue;
    }
    public function get vy():Number
    {
        return _vy;
    }
    public function get isOnGround():Boolean
    {
        return _isOnGround;
    }
    public function set isOnGround(onGround:Boolean):void
    {
        _isOnGround = onGround;
    }
    public function get collisionArea():MovieClip
    {
        return _collisionArea;
    }
}   

} 我还使用另一个代码为的类:

static public function platform_BlockRectangles(objectA:Object,objectB:Object):void
    {
    //This function requires the following setter properties in objectA:
        // _objectIsOnGround:Boolean, vx:Number, vy:Number
        var objectA_Halfwidth=objectA.width/2;
        var objectA_Halfheight=objectA.height/2;
        var objectB_Halfwidth=objectB.width/2;
        var objectB_Halfheight=objectB.height/2;
        var dx=objectB.x-objectA.x;
        var ox=objectB_Halfwidth+objectA_Halfwidth-Math.abs(dx);

        if (0<ox)
        {
            var dy=objectA.y-objectB.y;
            var oy=objectB_Halfheight+objectA_Halfheight-Math.abs(dy);
            if (0<oy)
            {

                if (ox<oy)
                {
                    if (dx<0)
                    {
                        ox*=-1;
                        oy=0;
                    }
                    else
                    {
                        oy=0;
                    }
                    //Dampen horizontal velocity
                    objectA.vx=0;

                }
                else
                {
                    if (dy<0)
                    {
                        ox=0;
                        oy*=-1;
                        objectA.isOnGround=true;

                    }
                    else
                    {
                        ox=0
                    }
                    //Dampen vertical velocity
                    objectA.vy=0;
                }
                objectA.x-=ox;
                objectA.y+=oy;
            }
        }
    }

有人请帮忙!!!!!!!

2 个答案:

答案 0 :(得分:0)

我特别建议您使用以下库:FlixelCitrus 尝试遵循此tutorial,将解释所有必要的逻辑,以帮助您的游戏

答案 1 :(得分:0)

您可以使用AABB碰撞检测。 Here是一个教程(距离函数部分)。 如果你谷歌这个词,你会得到很多关于这个主题的信息。 但是我建议你使用flixelflashPunk你刚刚开始并且想要做游戏,他们会为你照顾这些东西,你可以开始制作游戏。