首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Actionscript 3中的Frogger游戏

Actionscript 3中的Frogger游戏
EN

Code Review用户
提问于 2013-11-18 19:11:35
回答 2查看 655关注 0票数 5

我正在创建一个青蛙游戏在闪存AS3,只是想看看是否有人可以帮助我改进它而不破坏游戏。

我之所以要求这样做,是因为我没有任何错误,但我确实得到了50多个错误:

警告: 3596:重复变量定义。

代码语言:javascript
复制
package {

    import flash.display.*;
    import flash.events.*;
    import flash.ui.*;

    public class Frogger extends MovieClip
    {
        private var life, timeElapsed, totalTimer:Number;    
        private var p1speedX, p1speedY:Number;
        private var gotoWin, gotoLose, standingOnLog:Boolean;
        private var logs, Trucks, homes, logsYPos, TrucksYPos:Array;

        public function startMenu()
        {
            btnStartGame.addEventListener(MouseEvent.CLICK, gotoStartGame);
            stop();
        }

        public function startWin()
        {
            btnBack.addEventListener(MouseEvent.CLICK, gotoMenu);
        }

        public function startLose()
        {
            btnBack.addEventListener(MouseEvent.CLICK, gotoMenu);
        }

        public function startGame()
        {            
            timeElapsed = 0;
            totalTimer = 60;
            life = 3;
            p1speedX = 0;
            p1speedY = 0;
            gotoWin = false;
            gotoLose = false;
            standingOnLog = false;
            Trucks = new Array();
            logs = new Array();
            homes = new Array();
            logsYPos = new Array(115,165,215,265);
            TrucksYPos = new Array(365,415,465,515);

            setupGame();


            addEventListener(Event.ENTER_FRAME,update);
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
            stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
            stage.focus = this;



            for (var i=1; i<=3; i++)
            {    
                var newTruck = new Truck();
                newTruck.x = -300 * i;
                newTruck.y = TrucksYPos[0];
                newTruck.speedX = 5;
                Trucks.push(newTruck);
                addChild(newTruck);
            }

            for (var i=1; i<=1; i++)
            {
                var newTruck = new Truck();
                newTruck.x = (170 * i) + 500;
                newTruck.y = TrucksYPos[1];
                newTruck.speedX = -25;
                Trucks.push(newTruck);
                addChild(newTruck);
            }

            for (var i=1; i<=4; i++)
            {
                var newTruck = new Truck();
                newTruck.x = (-220 * i) + 100;
                newTruck.y = TrucksYPos[2];
                newTruck.speedX = 8;
                Trucks.push(newTruck);
                addChild(newTruck);
            }

            for (var i=1; i<=2; i++)
            {
                var newTruck = new Truck();
                newTruck.x = (200 * i) + 350;
                newTruck.y = TrucksYPos[3];
                newTruck.speedX = -5;
                Trucks.push(newTruck);
                addChild(newTruck);
            }

            for (var i=1; i<=4; i++)
            {
                var newLog = new LogWood();
                newLog.x = -300 * i;
                newLog.y = logsYPos[0];
                newLog.speedX = 5;
                logs.push(newLog);
                addChild(newLog);
                swapChildren(mcP1,newLog);
            }

            for (var i=1; i<=2; i++)
            {
                var newLog = new LogWood();
                newLog.x = (170 * i) + 500;
                newLog.y = logsYPos[1];
                newLog.speedX = -5;
                logs.push(newLog);
                addChild(newLog);
                swapChildren(mcP1,newLog);
            }

            for (var i=1; i<=2; i++)
            {
                var newLog = new LogWood();
                newLog.x = (-220 * i) + 100;
                newLog.y = logsYPos[2];
                newLog.speedX = 14;
                logs.push(newLog);
                addChild(newLog);
                swapChildren(mcP1,newLog);
            }

            for (var i=1; i<=3; i++)
            {
                var newLog = new LogWood();
                newLog.x = (250 * i) + 400;
                newLog.y = logsYPos[3];
                newLog.speedX = -5;
                logs.push(newLog);
                addChild(newLog);
                swapChildren(mcP1,newLog);
            }
        }

        private function setupGame()
        {

            for (var i=0; i< MovieClip(root).numChildren; i++)
            {
                var object = MovieClip(root).getChildAt(i);

                if (object is Home)
                {
                    homes.push(object);
                }}}

        private function gotoStartGame(evt:MouseEvent)
        {
            btnStartGame.removeEventListener(MouseEvent.CLICK, gotoStartGame);
            gotoAndStop("game");
        }


        private function gotoMenu(evt:MouseEvent)
        {
            btnBack.removeEventListener(MouseEvent.CLICK, gotoMenu);
            gotoAndStop("menu");
        }

        private function keyDownHandler(evt:KeyboardEvent)
        {
            if (evt.keyCode == Keyboard.LEFT) 
            {
                p1speedX = -1;
            }
            else if (evt.keyCode == Keyboard.RIGHT)
            {
                p1speedX = 1;
            }

            if (evt.keyCode == Keyboard.UP) 
            {
                p1speedY = -1;
            }
            else if (evt.keyCode == Keyboard.DOWN)
            {
                p1speedY = 1;
            }
        }

        private function keyUpHandler(evt:KeyboardEvent)
        {
            if ((evt.keyCode == Keyboard.LEFT) || (evt.keyCode == Keyboard.RIGHT))
            {
                p1speedX = 0;
            }
            if ((evt.keyCode == Keyboard.UP) || (evt.keyCode == Keyboard.DOWN))
            {
                p1speedY = 0;
            }
        }

        public function update(evt:Event)
        {
            handleUserInput();
            handleGameLogic();
            handleDraw();

            if (gotoWin)
                triggerGoToWin();
            else if (gotoLose)
                triggerGoToLose();
        }

        private function handleUserInput()
        {
            if (p1speedX > 0)
            {
                if (mcP1.x + 50 < 800)
                    mcP1.x += 50;

                p1speedX = 0;
                mcP1.rotation = 90;
                mcP1.play();
            }
            else if (p1speedX < 0)
            {
                if (mcP1.x - 50 > 0)
                    mcP1.x -= 50;    
                p1speedX = 0;
                mcP1.rotation = -90;
                mcP1.play();
            }

            if (p1speedY < 0)
            {
                mcP1.y -= 50;

                p1speedY = 0;
                mcP1.rotation = 0;
                mcP1.play();
            }
            else if (p1speedY > 0)
            {
                if (mcP1.y + 50 < 600)
                    mcP1.y += 50;    
                p1speedY = 0;
                mcP1.rotation = -180;
                mcP1.play();
            }
        }

        private function handleGameLogic()
        {
            timeElapsed++;

            for (var i=Trucks.length-1; i>= 0; i--)
            {
                Trucks[i].x += Trucks[i].speedX;

                if (Trucks[i].hitTestPoint(mcP1.x,mcP1.y))
                {
                    life--;
                    resetGame();
                }

                if (Trucks[i].speedX < 0 && Trucks[i].x <= -50)
                {
                    Trucks[i].x = 850;
                }
                else if (Trucks[i].speedX > 0 && Trucks[i].x >= 850)
                {
                    Trucks[i].x = -50;
                }
            }

            var standingOnLog = false;
            for (var i=logs.length-1; i>= 0; i--)
            {
                logs[i].x += logs[i].speedX;
                if (logs[i].hitTestPoint(mcP1.x,mcP1.y))
                {
                    standingOnLog = true;
                    mcP1.x += logs[i].speedX;
                }

                if (logs[i].speedX < 0 && logs[i].x <= -50)
                {
                    logs[i].x = 850;
                }
                else if (logs[i].speedX > 0 && logs[i].x >= 850)
                {
                    logs[i].x = -50;
                }
            }

            for (var i in homes)
            {
                if (homes[i].hitTestObject(mcP1))
                {
                    homes[i].gotoAndStop("occupied");
                    mcP1.x = 400;
                    mcP1.y = 565;
                }
            }

            if (mcP1.y < 290)
            {
                if (!standingOnLog)
                {
                    life--;
                    resetGame();
                }
            }

            if ((totalTimer - Math.floor(timeElapsed/30) <= 0) ||
                (life <= 0))
                gotoLose = true;

            var allOccupied = true;
            for (var i in homes)
            {
                if (homes[i].currentLabel == "empty")
                    allOccupied = false;
            }
            if (allOccupied)
                gotoWin = true;
        }

        private function handleDraw()
        {
            txtTime.text = String(totalTimer - Math.floor(timeElapsed/30));
            txtLife.text = String(life);
        }

        private function clearGame()
        {
            for (var i=Trucks.length-1; i>= 0; i--)
            {
                removeChild(Trucks[i]);
                Trucks.splice(i,1);
            }

            for (var i=logs.length-1; i>= 0; i--)
            {
                removeChild(logs[i]);
                logs.splice(i,1);
            }
        }
        private function triggerGoToWin()
        {
            clearGame();
            removeEventListener(Event.ENTER_FRAME, update);
            gotoAndStop("win");
        }

        private function triggerGoToLose()
        {
            clearGame();
            removeEventListener(Event.ENTER_FRAME, update);
            gotoAndStop("lose");
        }

        private function resetGame()
        {
            mcP1.x = 400;
            mcP1.y = 565;
        }
    }
}
EN

回答 2

Code Review用户

发布于 2013-11-18 21:27:03

为了与变量名保持一致,我将Trucks重命名为小写trucks

您有几个非常相似的for -循环,用于创建卡车和LogWoods。考虑创建一个函数createTruck(x, y, speed);,实现还可以负责将卡车添加到相应的Array中,并将子元素添加到MovieClip中。这样,您可以重写这样的for循环:

代码语言:javascript
复制
    for (var i=1; i<=2; i++)
    {
        createTruck(200 * i) + 350, trucksYPos[3], -5);
    }

通过这样做,您还不需要newTruck变量,因为它只存在于createTruck函数中。

我建议您不要使用类型数组,而是使用Vector类,它具有键入的优点,因此它只允许添加特定类型的对象。这有一个显着的编译时优势,因为它允许更好的类型检查,但它有一个运行时不利。(虽然我不认为你需要担心运行时的劣势)

我很好奇您是如何使用startWinstartLose方法的。我猜他们是在某个时间点被召唤的。他们所做的就是为按钮的点击添加一个事件侦听器。当然这很重要,但是它应该有自己的方法吗?尤其是考虑到他们做同样的事情,感觉很奇怪。一旦您的btnBack存在(不是null),就添加事件侦听器,并且只执行一次。我不认为需要两种不同的方法。

keyDownHandler方法中使用switch语句可以减少代码的行数并提高代码的可读性。

代码语言:javascript
复制
    switch (evt.keyCode) {
      case Keyboard.LEFT:
         p1speedX = -1;
         break;
      case Keyboard.RIGHT:
         p1speedX = 1;
         break;
      case Keyboard.UP:
         p1speedY = -1;
         break;
      case Keyboard.DOWN:
         p1speedY = 1;
         break;
    }
票数 3
EN

Code Review用户

发布于 2015-05-08 17:24:09

如果您在同一范围内多次声明同一个变量,您的循环每次都将i声明为一个新变量,则应该将这些不同的循环放入不同的函数来执行所需的操作,或者使用某种循环变量(如果必须这样做的话).

代码语言:javascript
复制
private var loopVar:int = 0;

for(loopVar = 0; loopVar < 3; loopVar++)
for(loopVar = 0; loopVar <= secondLoopValue; loopVar++)

这不是最好的选择,但这将删除这些错误,因为i不会被一遍又一遍地声明,而且更快地重用一个变量,而不是声明一个新的变量(我认为)。

只是在任何函数中没有超过一个循环,或者习惯了这些错误,第二个选项有时对我有用;)提醒我,在项目结束时我还有工作要做。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/35622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档