我正在创建一个青蛙游戏在闪存AS3,只是想看看是否有人可以帮助我改进它而不破坏游戏。
我之所以要求这样做,是因为我没有任何错误,但我确实得到了50多个错误:
警告: 3596:重复变量定义。
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;
}
}
}发布于 2013-11-18 21:27:03
为了与变量名保持一致,我将Trucks重命名为小写trucks。
您有几个非常相似的for -循环,用于创建卡车和LogWoods。考虑创建一个函数createTruck(x, y, speed);,实现还可以负责将卡车添加到相应的Array中,并将子元素添加到MovieClip中。这样,您可以重写这样的for循环:
for (var i=1; i<=2; i++)
{
createTruck(200 * i) + 350, trucksYPos[3], -5);
}通过这样做,您还不需要newTruck变量,因为它只存在于createTruck函数中。
我建议您不要使用类型数组,而是使用Vector类,它具有键入的优点,因此它只允许添加特定类型的对象。这有一个显着的编译时优势,因为它允许更好的类型检查,但它有一个运行时不利。(虽然我不认为你需要担心运行时的劣势)
我很好奇您是如何使用startWin和startLose方法的。我猜他们是在某个时间点被召唤的。他们所做的就是为按钮的点击添加一个事件侦听器。当然这很重要,但是它应该有自己的方法吗?尤其是考虑到他们做同样的事情,感觉很奇怪。一旦您的btnBack存在(不是null),就添加事件侦听器,并且只执行一次。我不认为需要两种不同的方法。
在keyDownHandler方法中使用switch语句可以减少代码的行数并提高代码的可读性。
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;
}发布于 2015-05-08 17:24:09
如果您在同一范围内多次声明同一个变量,您的循环每次都将i声明为一个新变量,则应该将这些不同的循环放入不同的函数来执行所需的操作,或者使用某种循环变量(如果必须这样做的话).
private var loopVar:int = 0;
for(loopVar = 0; loopVar < 3; loopVar++)
for(loopVar = 0; loopVar <= secondLoopValue; loopVar++)这不是最好的选择,但这将删除这些错误,因为i不会被一遍又一遍地声明,而且更快地重用一个变量,而不是声明一个新的变量(我认为)。
只是在任何函数中没有超过一个循环,或者习惯了这些错误,第二个选项有时对我有用;)提醒我,在项目结束时我还有工作要做。
https://codereview.stackexchange.com/questions/35622
复制相似问题