平台游戏命中测试

时间:2014-11-29 19:31:01

标签: actionscript-3 flash actionscript flash-cs6

好的,所以我在舞台上有一个对象在"世界"影片剪辑。我努力做到这一点,以便当你向右移动时。如果名为hitD的动画片段(" dude")内的动画片段与世界各地的墙壁发生碰撞,那么这个家伙就会停止前进。

屏幕截图,如果有帮助的话。 选择了一般舞台花花公子 http://prntscr.com/5bgjfq世界就是除了球之外的一切

http://prntscr.com/5bgjuh HITD

如果有人有任何办法,他们可以修改这些碰撞物理,因为我现在的代码是粗略的,所有建议和想法都是受欢迎的。

var started:Boolean;
const NUMLEVELS = 3;
var status:String;
stage.focus = stage;
if (! started)
{// Only ever do this once!
    status = "falling";
    started = true;
    var speedX:Number = 5;
    var speedY:Number = 0;
    var topSpeedY:Number = 50;
    var start_x:Number = dude.x;
    var start_y:Number = dude.y;
    var keysDown:Object = new Object();
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
    stage.addEventListener( Event.DEACTIVATE, appDeactivate );
    dude.addEventListener(Event.ENTER_FRAME, moveDude);
    var W:Number = 15;
    var snows:Array = new Array();

}
for (var b:int = 0; b < 50; b++)
{
    var snow:Snow = new Snow();

    snows.push(snow);
    addChild(snow);
}


function cleanup()
{
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleased);
    stage.removeEventListener( Event.DEACTIVATE, appDeactivate );
    dude.removeEventListener(Event.ENTER_FRAME, moveDude);
}
function keyIsDown(key:uint):Boolean
{
    return Boolean(key in keysDown);
}
function keyPressed(e:KeyboardEvent):void
{
    keysDown[e.keyCode] = true;
}
function keyReleased(e:KeyboardEvent):void
{
    delete keysDown[e.keyCode];
}
function appDeactivate( event:Event ):void
{
    // Get rid of all keypress info when app loses focus
    keysDown=new Object();
}

function moveDude(e:Event):void
{

    var obj:Object = e.target; //setting dude as object
    // for now, if you get off the top of the screen you win
    if (obj.y < 0)
    {
        cleanup();
        nextScene();
        return;
    }
    // if character dies, restart
    if (obj.y > stage.stageHeight + 100)
    {
        gotoAndStop(1);
        obj.x = start_x;
        obj.y = start_y;
    }
    if (death!=null)
    {
        if (obj.hitTestObject(death))
        {
            trace("Dead");
        }
    }

    if (status=="falling")
    {
        speedY++;
        if (speedY>topSpeedY)
        {
            speedY = topSpeedY;
        }
        for (i = 0; i<2*speedY; i++)
        {
            obj.y++;
            if (world.hitTestPoint(obj.x - obj.width / 2,obj.y,true) || world.hitTestPoint(obj.x + obj.width / 2,obj.y,true))
            {
                status = "ground";
                break;
            }
        }

    }
    else if (status == "jumping")
    {
        speedY--;
        for (i = 0; i<2*speedY; i++)
        {
            obj.y--;
            if (world.hitTestPoint(obj.x - obj.width / 2,obj.y - obj.height,true) || world.hitTestPoint(obj.x + obj.width / 2,obj.y - obj.height,true))
            {
                speedY = 0;
                break;
            }
        }

        if (speedY==0)
        {
            status = "falling";
        }
    }
    else if (status == "ground")
    {
        if (! world.hitTestPoint(obj.x - 8,obj.y,true) && ! world.hitTestPoint(obj.x + 8,obj.y + 4,true))
        {
            speedY = 0;
            status = "falling";
        }

        if (keyIsDown(Keyboard.UP))
        {
            status = "jumping";
            speedY = 10;
        }
    }
    if (keyIsDown(Keyboard.DOWN)&&status=="ground")
    {
        dude.gotoAndStop("duck");
    }
    else
    {
        if (keyIsDown(Keyboard.SHIFT))
        {
            speedX = 10;
        }
        else
        {
            speedX = 5;
        }
        if (keyIsDown(Keyboard.LEFT))
        {
            for (i = 0; i<speedX; i++)
            {
                obj.x--;
                dude.ball.rotation--; //dude.ball is a movieclip similar to dude.hitD, it spins when you move.
                if (world.hitTestPoint(obj.x - obj.width / 2 + 4,obj.y - 8,true) || world.hitTestPoint(obj.x - obj.width / 2,obj.y - obj.height + 8,true))  
                {
                    dude.ball.rotation++;

                    obj.x++;
                    break;
                }
            }

        }
        else if (keyIsDown(Keyboard.RIGHT))
        {
            //dude.gotoAndStop("right");
            //obj.scaleX = 1;
            for (i = 0; i<speedX; i++)
            {
                obj.x++;
                dude.ball.rotation++;
                // The number in obj.y-4 affects the climbing ability
                if (status == "ground")
                {
                    //dude.height+= 0.1;
                    //dude.width += 0.1;
                }//so here I'm checking if it hits the lower corner or top right corner or hitD
                if (world.hitTestPoint(dude.hitD.x + obj.hitD.width/2 , obj.hitD.y,true) || world.hitTestPoint(obj.hitD.x + obj.hitD.width/2,obj.hitD.y - obj.hitD.height ,true))
                //if (world.hitTestObject(obj))
                {

                    dude.ball.rotation--;
                    obj.x--;
                    break;
                }
            }
        }
        dude.gotoAndStop(1);

    }
    while (status == "ground" && (world.hitTestPoint(obj.x-8, obj.y-1, true) || world.hitTestPoint(obj.x+8, obj.y-1, true)))
    {
        obj.y--;
    }

    const BORDER = 50;
    var diff:int;
    // Check right border:
    diff = obj.x + BORDER - stage.stageWidth;
    if (diff>0 && world.x>=stage.stageWidth-world.width)
    {
        obj.x -=  diff;
        world.x -=  diff;
        background1.x -=  diff;
        if (death != null)
        {
            death.x -=  diff;
        }
    }
    // Check left border:
    diff = obj.x - BORDER;
    if (diff<0 && world.x<=0)
    {
        obj.x -=  diff;
        world.x -=  diff;
        background1.x -=  diff;
        if (death != null)
        {
            death.x -=  diff;
        }
    }
    // Check bottom border:
    diff = obj.y + BORDER - stage.stageHeight;
    if (diff>0)
    {
        obj.y -=  diff;
        world.y -=  diff;
        background1.y -=  diff;
        if (death != null)
        {
            death.y -=  diff;
        }
    }
    // Check top border:
    diff = obj.y - BORDER;
    if (diff<0)
    {
        obj.y -=  diff;
        world.y -=  diff;
        background1.y -=  diff;
        if (death != null)
        {
            death.y -=  diff;
        }
    }
    if (obj.x > stage.stageWidth - 25)
    {
        if (currentFrame<NUMLEVELS)
        {
            gotoAndStop(currentFrame+1);
            obj.x = 25;
        }
        else
        {
            obj.x = stage.stageWidth - 25;
        }
    }
    else if (obj.x<25)
    {
        if (currentFrame>1)
        {
            gotoAndStop(currentFrame-1);
            obj.x = stage.stageWidth - 25;
        }
        else
        {
            obj.x = 25;
        }
    }

}

提前感谢您提供的任何帮助:)

1 个答案:

答案 0 :(得分:1)

对于玩家物理,制作中央 ENTER_FRAME处理函数的方法更为明确,仅用于计算应用于玩家的转换。

您仍然可以从中获取信息,但您只需在那里处理最终输出。否则,它可能会有问题,特别是当事情变得更加复杂并且你想要添加更多功能时。(例如,想象一下将来,你想在地面添加粉丝,吹起空气,玩家必须在他们有很多要改变的地方,也许还有很多问题。

对于碰撞检测,此功能将为您提供以下信息:玩家无法使用变量'UpColl','DownColl','Right Coll'和'的方向LeftColl”。 然后,您可以从主要功能中引用此信息,该功能将转换应用到您的播放器。我将在下面举例说明。

function collEveryFrame(event:Event):void
{
    // capture player positions
    player_x = WORLD.player.x;
    player_y = WORLD.player.y;

    // the movie clip object where you store your solid objects. Remember, ALL MovieClip objets inside this MovieClip will taken as solid objects in your game, and regardless their shape, their boundingBox will be taken as collison. So they will all be square.
    collContainer = WORLD.cW;
    // your player's collision object
    playerColl = WORLD.player;

    // RIGHT SQUARE COLLISION DETECTION
    for (var i:int; i < collContainer.numChildren; i++)
    {
        // Check if any collision object colliding with player
        if (playerColl.hitTestObject(collContainer.getChildAt(i)))
        {
        // One collision detected. Check 'from which side' does the player colliding with the object;
        if (collContainer.getChildAt(i).y > playerColl.y + playerColl.height - p1MoveSpeed)
        {
            playerColl.y = collContainer.getChildAt(i).y - playerColl.height;
            DownColl = true;
        }
        else if (collContainer.getChildAt(i).y + collContainer.getChildAt(i).height < playerColl.y + p1MoveSpeed)
        {
            playerColl.y = collContainer.getChildAt(i).y + collContainer.getChildAt(i).height;
            UpColl = true;
        }
        else if (collContainer.getChildAt(i).x + collContainer.getChildAt(i).width < playerColl.x + p1MoveSpeed)
        {
            playerColl.x =  +  collContainer.getChildAt(i).x + collContainer.getChildAt(i).width;
            LeftColl = true;
        }
        else if (collContainer.getChildAt(i).x > playerColl.x + playerColl.width - p1MoveSpeed)
        {
            playerColl.x =  +  collContainer.getChildAt(i).x - playerColl.width;
            RightColl = true;
        }
        }
    }
    // RIGHT SQUARE COLLISION DETECTION [End]
}

转换功能;

function playerMovement(event:Event):void
{
    // (apply this for all sides)
    // if nothing keeps player from going right; 
    if (! RightColl)
    {
        // Apply everything currently pushing the player to right
        if (keyIsDown(Keyboard.RIGHT))
        {
            movement_Right = 15;
        }else{
            movement_Right = 0;
        }
        // example fictional wind function returns wind speed
        windSpeed = getWindSpeed();

        player.x +=  movement_Right + windSpeed + etc + etc;
        // say windSpeed is -5 (Wind is coming from right, so pushing the player to left)
        // so if user pressing right arrow key, player will move to right 10px for every frame, else 5px to left, etc.
    }
}

通过这种方式,关于物理学的一切都将很容易实现。 例如,在计算向下移动时,添加重力和跳跃等。