1

所以我一直在用 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。如果我使用 >= 那么分数会提高太多。

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

4

3 回答 3

2

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

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

太阳系类:

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。

于 2012-04-25T03:22:29.863 回答
0

马上我可以看到一个主要问题。更改所有语句:

if (saturn.y==600)

if (saturn.y>=600)

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

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

于 2012-04-25T02:18:38.223 回答
0

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

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

于 2012-04-25T02:19:47.503 回答