Flash AS3:在我的游戏中运行块

时间:2012-01-13 20:10:14

标签: flash actionscript-3 block

我在flash动作脚本3中制作游戏,差不多完成但我遇到了一些问题...... 我将首先解释一下这个游戏:你是一个角色(目前是一个黑色的方块),你必须通过跳跃下降的块来尽可能高。我现在能做的就是跳跃并与棋子发生碰撞(左 - 右)并跳到街区。

我遇到的问题是:当2个区块完全相邻时(区块A落在区块B旁边)然后我跳到区块A并且我想要跑到区块B(只是在没有跳跃的情况下运行)我得到的东西非常奇怪,我不能走上街区:s 我现在正在寻找一个星期但仍然没有进展。所以我希望我能在这里得到任何帮助。没有任何可视化就很难解释这个问题所以我上传了这些文件,所以你可以自己测试一下。 下载链接:http://www.megaupload.com/?d=JT4158KA

我仍然是初学者,所以得到一点帮助会很棒。我坚持了一个多星期了:s 我甚至问我的老师,他无法解决。所以我希望你们能帮忙

但是如果你理解我的解释和/或懒得下载我的文件(17kb big:p),这里的问题应该是代码

package Classes

{     import flash.events。*;     import flash.display.MovieClip;     import flash.display.Stage;     import 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 :(得分:0)

问题在于:

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是固定的。所以你的角色被固定了。

答案 1 :(得分:0)

我已经解决了这个问题。问题出在函数isHit() 我还添加了一些新功能,如菜单,分数,推特提要。

我差不多完成游戏了。再加上一件事,如果我对自己的角色足够高,在某个时刻我无法获得任何更高的东西,因为我已经到达了我的场景的顶部。我想要例如。如果我的角色占据了我场景的50%,那么场景会“上升”,我可以在游戏中达到无限的状态,就像我的角色永远不会达到我的场景顶部。我怎么能这样做?

以下是具有新功能的更新游戏:) http://www.megaupload.com/?d=TGGTKF5N

提示/技巧或改进和反馈总是受欢迎=)

相关问题