【问题标题】:Messed up if statements in Actionscript 3?搞砸了 Actionscript 3 中的 if 语句?
【发布时间】:2012-05-05 16:58:10
【问题描述】:

所以我一直在使用 Action Script 3 和 CS5.5 制作这款游戏​​。您要做的是在穿越太空时避开小行星。我认为让太阳系外的行星在整个游戏的背景中沿着屏幕向下移动会很酷。有点让它看起来像你飞过他们。我这样做的方法是每秒每帧在它们的 y 坐标上添加五个。一旦他们的 y 坐标达到 600(屏幕底部),我将添加一个新的行星,它会做同样的事情。由于某种原因,一旦我到达土星,一切都变得很奇怪。土星来得早,天王星也来得早。我不知道发生了什么事。我为此沮丧了一个小时。这是我认为有问题的部分。

公共函数 onTick(timerEvent:TimerEvent):void {

        earth.PlanetMovement(5);

        if (earth.y==600)
        {
            mars.PlanetsStart(300, -100);
            addChild( mars );
            levels=levels+5;
        }
        mars.PlanetMovement(5);
        if (mars.y==600)
        {
            jupiter.PlanetsStart(300,-150);
            addChild (jupiter);
            levels=levels+10;
        }
        jupiter.PlanetMovement(5);

        if (jupiter.y==600)
        {
            saturn.PlanetsStart(300,-155);
            addChild (saturn);
            levels=levels+20;
        }
        saturn.PlanetMovement(5);
        if (saturn.y==600)
        {
            uranus.PlanetsStart(300,-160)
            addChild ( uranus);
            levels=levels+25;
        }
        uranus.PlanetMovement(5);

PlanetMovement 和 PlanetsStart 是 Planets 类中的两个函数。如果您需要更多信息,请告诉我。

编辑:我想我应该进一步解释。 PlanetsStart 是一个函数,它具有每个影片剪辑的起始坐标。因此,一旦地球达到 600 的 y 坐标,火星就会从 (300, -100) 开始。然后它被添加到屏幕上。 levels 是一个变量,它会提高每个 fps 的分数。 PlanetMovement 是每个movieclip 将移动多少fps。如果我使用 >= 那么分数会提高太多。

这正是发生的事情。地球出现在它应该出现的地方。然后火星准时出现。然后由于某种原因土星突然出现在火星和木星的中间。在土星到达底部后,天王星出现。然后木星到达底部,一切正常。土星出现,然后是天王星

【问题讨论】:

    标签: actionscript-3 flash flash-cs5


    【解决方案1】:

    呃。不幸的是,这比您暗示的要复杂。它真的会帮助你首先编写某种代码计划,开发一些将显示基本逻辑(和逻辑错误)的伪代码,然后再编写代码。

    以下是构建此想法的更好方法的示例。但是,我不认为你的想法是可怕的记忆意识。您应该只根据需要引入行星,并根据需要移除它们。研究一种称为“对象池”的技术,以帮助更好地构建它。

    太阳系类:

    package  
    {
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.geom.Point;
    
        public class SolarSystem extends MovieClip 
        {
            private var PLANET_NAMES:Array = new Array("earth", "mars", "jupiter", "saturn", "uranus");
    
            // you will have to fix these values:
            private var PLANET_STARTS:Array = new Array(new Point(300, -100), new Point(300, -100),new Point(300, -100),new Point(300, -100),new Point(300, -100));
    
            private var planets:Array;
            private var maxY:Number = 600;
            private var speed:Number = 5;
    
            private var levels:Number = 0;
            private var levelIncrement:Number = 5;
    
            public function SolarSystem() 
            {
                super();
                addEventListener(Event.ADDED_TO_STAGE, initHnd, false, 0, true);
            }
    
            private function initHnd(e:Event):void 
            {
                removeEventListener(Event.ADDED_TO_STAGE, initHnd);
    
                runPlanets();
    
                addEventListener(Event.ENTER_FRAME, frameHnd, false, 0, true);
            }
    
            private function runPlanets():void 
            {
                for (var i:int = 0; i < PLANET_NAMES.length; i++) 
                {
                    planets[i] = new Planet();
                    planets[i].name = PLANET_NAMES[i];
                    Planet(planets[i]).startPlanet(PLANET_STARTS[i]);
                    this.addChild(planets[i]);
                }
            }
    
            private function frameHnd(e:Event):void 
            {
                if(planets && planets.length > 0){
                    // move all the planets until they are too low, then remove them.
                    // decrementing loop because planets will be being removed occasionally.
                    for (var i:int = planets.length -1; i >= 0; i--) 
                    {
                        if (planets[i] && Planet(planets[i]).y >= maxY) {
    
                            // this seems very strange to me, but it will replicate what your code says:
                            levels += (levels + levelIncrement);
    
                            try {
                                removeChild(Planet(planets[i]));
                                planets[i] = null;
                            }catch (e:Error) { }
                        } else if ( Planet(planets[i]).isMoving ){
                            Planet(planets[i]).movePlanet(0, speed);
                        }
                    }
                } else {
                    removeEventListener(Event.ENTER_FRAME, frameHnd);
                }
            }
        }
    }
    

    这里是行星类:

    package
    {
        import flash.display.MovieClip;
    
        public class Planet extends MovieClip
        {
            private var _isMoving:Boolean = false;
    
            public function Planet()
            {
                super();
            }
    
            public function startPlanet(sx:Number, sy:Object):void
            {
                this.x = sx;
                this.y = sy;
    
                isMoving = true;
            }
    
            public function movePlanet(dx:Number, dy:Number):void
            {
                if (isMoving)
                {
                    this.x += dx;
                    this.y += dy;
                }
            }
    
            public function get isMoving():Boolean
            {
                return _isMoving;
            }
    
            public function set isMoving(value:Boolean):void
            {
                _isMoving = value;
            }
        }
    }
    

    同样,这不是最好的方法,但将概念和操作分组到类中更易于管理

    HTH。

    【讨论】:

      【解决方案2】:

      我马上就发现了一个重大问题。更改所有语句:

      if (saturn.y==600)
      

      if (saturn.y>=600)
      

      只是说 == 意味着你只会在你的 Y 值正好是 600 的情况下触发条件。

      请注意,您还可以将 levels = levels+20 等内容更改为简单的 levels += 20;

      【讨论】:

      • 是的,我知道。如果我这样做 >=,那么级别将继续提高 5、10 和 25。levels 是一个变量,它通过每个 fps 的增量来提高 highschore。如果我这样做了,分数会非常高。此外,如果我这样做 >= 它只会继续添加电影剪辑火星、木星、土星和天王星。因为我正好在 600 处,所以当它到达那个 y 坐标时,只会创建一个。
      • 如果您只使用 600,那么您必须确保仅以达到 600 的倍数增加。即上面的增量 155、160...会因为它们跳过 600 值而导致条件失败。
      【解决方案3】:

      当像这样移动东西时,最好使用“>=”而不是“==”来检查位置。如果你的对象从 y=1 开始呢?然后它永远不会达到 600,它会一直持续下降。

      即使尚未调用 PlanetsStart,您似乎也在调用 PlanentMovement。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多