AS3: бег по блокам в игре - PullRequest
1 голос
/ 14 января 2012

Я делаю игру на Flash ActionScript 3, она почти готова, но у меня есть некоторые проблемы.

Учтите, что в этой игре вы персонаж (на данный момент черный квадрат) и вынужно подняться как можно выше, прыгая на падающие блоки.В настоящий момент я могу прыгать, сталкиваться с блоками (слева-справа) и прыгать на блоки.

Когда 2 блока падают точно рядом друг с другом (Блок А падает рядом с Блоком Б) Затем я прыгаю в блок А и хочу запустить в блок В (просто бегать без прыжков). Я получаю что-то очень странное, я не могу ходить по блокам.

Вот код, где должна быть проблема:

package Classes

{import flash.events. *;import flash.display.MovieClip;импортировать flash.display.Stage;импорт flash.ui.Keyboard;import Classes.KeyObject;

public class Player extends MovieClip
{
    var isJumping:Boolean = false;
    var jumpPower:int = 0;
    var ground:int;
    var stageRef:Stage;
    var key:KeyObject;
    var isDead:Boolean = false;
    var allBlocks:Array;
    var blockX:int;
    var blockY:int;
    var blockWidth:int;
    var blockHeight:int;
    var steps:int = 10;
    var upPressed:Boolean = false;
    public function Player(stageReff:Stage,allBlocks:Array)
    {

        stageRef = stageReff;
        key = new KeyObject(stageRef);
        this.allBlocks = allBlocks;
        ground = stageRef.stageHeight;
        addEventListener(Event.ENTER_FRAME,update);
        //addEventListener(KeyboardEvent.KEY_UP, keyReleased);
    }

    function isHit()
    {
        for (var j = 0; j < allBlocks.length; j++)
        {
            if (this.hitTestObject(allBlocks[j]) && allBlocks[j] != isOnTopOf())
            {
                blockX = allBlocks[j].x;
                blockY = allBlocks[j].y;
                blockWidth = allBlocks[j].width;
                blockHeight = allBlocks[j].height;
                return true;
            }
        }
        return false;
    }

    function isHitTop()
    {
        for (var j = 0; j < allBlocks.length; j++)
        {
            if (this.PlayerBottom.hitTestObject(allBlocks[j].hitBoxTop))
            {
                jumpPower = 0;
                isJumping = false;
                this.y = allBlocks[j].y - allBlocks[j].height;
                return true;
            }
        }
        return false;
    }

    function isHitBottom()
    {
        for (var j = 0; j<allBlocks.length; j++)
        {
            if (this.hitTestObject(allBlocks[j].hitBoxBottom))
            {
                if (isJumping)
                {
                    this.y = allBlocks[j].y + this.height;
                    jumpPower=0;
                    isJumping = false;
                    isDead = false;
                    trace(isDead);
                }


                else
                {

                    isDead = true;
                    trace(isDead);
                }
            }
        }
    }

    function isOnTopOf()
    {
        for (var j = 0; j < allBlocks.length; j++)
        {
            if (this.PlayerBottom.hitTestObject(allBlocks[j].hitBoxTop))
            {
                trace("is WEL onTopOf");
                return allBlocks[j];
            }
        }
        trace("is NIET onTopOf");
        return null;
    }


    function update(evt:Event):void
    {
        if (!isDead)
        {
            isHitTop();
            isHitBottom();
            if (key.isDown(Keyboard.UP))
            {
                //Voorkomen dat hij 2x springt
                if (! isJumping)
                {
                    jumpPower = 12;
                    isJumping = true;
                }
            }

            if (key.isDown(Keyboard.LEFT))
            {
                if (this.x > stageRef.stageWidth - stageRef.stageWidth)
                {
                    this.x -=  steps;
                    if (isHit() == true)
                    {
                        this.x = blockX + blockWidth + 1;
                        //trace("is gehit maar staat er niet op");
                    }

                }
            }
            else if (key.isDown(Keyboard.RIGHT))
            {
                if (this.x < stageRef.stageWidth - this.width)
                {
                    this.x +=  steps;
                    if (isHit() == true)
                    {
                        this.x = blockX - this.width - 1;
                        this.y = blockY;
                    }
                }
            }


            if (isJumping)
            {
                this.y -=  jumpPower;
                jumpPower -=  2;
                isHitTop();
                isHitBottom();
            }


            if (! isJumping && ! isHitTop())
            {
                this.y +=  7;
            }


            if (this.y > ground)
            {
                this.y = ground;
                isJumping = false;
            }
        }
        else
        {
            removeEventListener(Event.ENTER_FRAME,update);
        }
    }
}
}

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Я решил проблему. Это было в функции isHit(). Я также добавил несколько новых функций, таких как меню, оценка и твиттер.

0 голосов
/ 14 января 2012

Проблема здесь:

if (isHit() == true)
{
   this.x = blockX - this.width - 1;
   this.y = blockY;
}

Вы прыгаете на блок.Затем вы нажимаете стрелку вправо, чтобы перейти вправо (вы попадете на эту строку else if (key.isDown(Keyboard.RIGHT))).И в этом коде вы проверяете, есть ли столкновения.Да, они есть, потому что вы остаетесь на блоке.Итак, ваш персонаж получает следующие координаты:

this.x = blockX - this.width - 1;this.y = blockY;

Но blockX, blockY и this.width фиксированы.Итак, ваш персонаж обездвижен.

...