【问题标题】:AS3 Psuedo 3D Z-IndexingAS3 伪 3D Z 索引
【发布时间】:2013-12-09 21:20:45
【问题描述】:

我正在尝试在 AS3 中制作一个非常基本的 Pseudo 3D 游戏。当我按下某些键时,我的角色会上下移动,但我想要发生的是当角色 y 位置高于对象 y 位置时,角色应该出现在对象后面。 这是我目前的对象类代码:

package  {

    import flash.display.MovieClip;
    import flash.utils.getTimer
    import flash.events.Event;

    public class bushMC extends MovieClip {

        private var lastFrame:int = new int(0);
        private var dt:Number = new Number();
        private var main:Main;      

        public function bushMC(){
            main = this.parent as Main;
            stage.addEventListener(Event.ENTER_FRAME, update);
            trace(main.getChildIndex(this));
        }
        private function update(e:Event):void{          
            dt = (getTimer() - lastFrame)/30;
            lastFrame = getTimer();

            if(main.char.y + 200 < this.y + 55 && main.getChildIndex(main.char) > main.getChildIndex(this)){
                main.setChildIndex(this, main.getChildIndex(main.char)+1);

            }
            else if(main.getChildIndex(main.char) < main.getChildIndex(this)){
                main.setChildIndex(this, main.getChildIndex(main.char));
            }
        }
    }

}

我已尝试为每个计算编辑大量值(+1、-1、等于),但似乎找不到正确的值。我试过的一个几乎可以工作,但是当字符应该在对象后面时,它只是在前面闪烁,然后在后面连续闪烁。

提前致谢,凯尔。

【问题讨论】:

    标签: actionscript-3 3d z-index


    【解决方案1】:

    我刚刚尝试了一个基于您的代码的快速模拟脚本。我得到了它,我假设你正在尝试让它工作:

    import flash.events.Event;
    import flash.display.MovieClip;
    var char:MovieClip = new MovieClip();
    var bush:MovieClip = new MovieClip();
    
    char.graphics.beginFill(0xFF0000);
    char.graphics.drawCircle(0, 0, 30);
    
    bush.graphics.beginFill(0x00FF00);
    bush.graphics.drawEllipse(0, 0, 40, 80);
    
    this.addChild(char);
    this.addChild(bush);
    
    bush.x = 100+(Math.random()*350);
    bush.y = 100+(Math.random()*200);
    
    this.addEventListener(Event.ENTER_FRAME, updateYPos);
    
    function updateYPos(e:Event):void {
        char.x = mouseX;
        char.y = mouseY;
    
        if(char.y < bush.y + 30 && this.getChildIndex(char) >= this.getChildIndex(bush)){
            this.setChildIndex(bush, this.getChildIndex(char));
        }
        else if(char.y > bush.y + 30 && this.getChildIndex(char) < this.getChildIndex(bush)){
            this.setChildIndex(bush, this.getChildIndex(char));
        }
    }
    

    我希望这个示例足以帮助您。它所需要的只是else if 上的一个额外条件,它可以工作。 :)

    【讨论】:

    • 今晚我会试试这个,因为它可能是我需要的小修复,如果不是生病尝试晚祷方法
    【解决方案2】:

    您应该在某处有一个排序的灌木列表,然后通过addChild() 以正确的顺序添加 - 最上面的灌木具有最低的 Z 位置(子索引 0 或最小的灌木,可能还有其他对象)。然后,当你的玩家移动时,你会跟踪它相对于灌木列表的位置,所以你不会对玩家的 z 排序运行完整的列表检查,而只检查“最近的”灌木是否可能发生变化,然后设置子索引玩家发现价值。请注意,如果您将玩家的子索引设置为灌木的索引,如果您正在向前移动玩家(更大的索引),请设置为 -1,因为灌木实际上会低一个位置,因为玩家在显示列表中占据一个位置,并且如果您将子索引设置为较低的值,请设置为相等。有一个更优雅的版本,利用你的灌木在显示列表中是连续的这一事实,只有玩家被打断,尽管一旦出现更多移动的物体就会失去动力。

    是的,您在播放器或任何其他移动对象上运行更新,而不是在灌木丛上。

    function updateZPos(e:Event):void {
        // process coordinates change
        var p:DisplayObjectContainer=this.parent; 
        // a bit faster to use function local var to get parent
        var ci:int=p.getChildIndex(this); // changeable, get current index
        var prev:DisplayObject=null;
        if(ci>0) prev=p.getChildAt(ci-1);
        var next:DisplayObject=null;
        if(ci<p.numChildren-1) next=p.getChildAt(ci+1);
        while(prev) {
            if (this.y<prev.y) {
                ci--;
                p.setChildIndex(this,ci);
                if (ci>0) prev=p.getChildAt(ci-1); else prev=null;
            } else break;
        while(next) {
            if (this.y>next.y) {
                ci++;
                p.setChildIndex(this,ci);
                if(ci<p.numChildren-1) next=p.getChildAt(ci+1); else next=null;
            } else break;
        }
    }
    

    这个函数写的意思是p的显示列表是预先排序的,在this移动后会保持它的排序状态,适用于任何移动的物体,而不仅仅是玩家。为了在不弄乱其他对象的情况下工作,请将移动到一个容器中的所有内容分开,然后将其引用为排序显示列表的基础。否则,您的播放器最终可能会得到最重要的结果,因为要检查的最后一个元素将是 Y 为 0 的得分文本字段。此外,您需要在整个移动对象的类集上保持注册点的连贯位置,例如基础正如您的代码中所暗示的那样,灌木丛将位于 Y=0 而不是 Y=30。玩家的腿也应该在 Y=0。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 2017-10-25
      • 2014-10-04
      • 2013-06-02
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多