我正在制作一个有三个框架的破砖游戏。第一帧是开始屏幕,第二帧是游戏本身,第三帧是"游戏结束"屏幕(再试一次按钮)。当我点击"开始游戏"程序跳转到第二帧并停止。如果你没有用球拍击球,程序会跳到第三帧。
我的问题出现在这里,因为程序会立即再次跳转到第二帧。知道为什么stop();
调用者无法工作?我试图删除最后一帧中的所有内容(stop();
调用者除外),但它仍然只是跳回到第2帧。
我真的无法弄清楚为什么会这样。我使用的是Adobe Flash Professional CC。第3帧上唯一的动作是" stop();"。这是第2帧的整个代码块:
import flash.events.KeyboardEvent;
import flash.display.Stage;
import flash.events.Event;
import flash.ui.Keyboard;
import fl.transitions.Tween;
import fl.transitions.easing.*;
trace(currentFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
this.addEventListener(Event.ENTER_FRAME, moveBall);
var rackert: bar = new bar();
rackert.name = "rackert";
rackert.y = 740;
rackert.x = 640;
addChild(rackert);
var ball: circle = new circle();
ball.y = 80;
ball.x = 640;
addChild(ball);
var ballXSpeed: Number = 12; //X Speed of the Ball
var ballYSpeed: Number = 12; //Y Speed of the Ball
function keyDown(e: KeyboardEvent) {
var key: uint = e.keyCode;
var step: uint = 35;
switch (key) {
case Keyboard.LEFT:
if (rackert.x > 0) {
var myTween: Tween = new Tween(rackert, "x", Regular.easeOut, rackert.x, rackert.x - step, 0.2, true);
} else rackert.x = 0;
break;
case Keyboard.RIGHT:
if (rackert.x + rackert.width < 1000) {
var myTween2: Tween = new Tween(rackert, "x", Regular.easeOut, rackert.x, rackert.x + step, 0.2, true);
} else rackert.x = 1000 - rackert.width;
break;
}
}
var gameOver: Boolean = false;
function moveBall(event: Event): void {
ball.x += ballXSpeed;
ball.y += ballYSpeed;
if (ball.x >= 1000 - (ball.width / 2)) {
ballXSpeed *= -1;
}
if (ball.x <= 0 + (ball.width / 2)) {
ballXSpeed *= -1;
}
if (ball.y >= stage.stageHeight) {
if (gameOver == false) {
gotoAndStop(3);
this.removeEventListener(Event.ENTER_FRAME, moveBall);
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDown);
gameOver = true;
rackert.visible = false;
}
}
if (ball.y <= 22) {
ballYSpeed *= -1;
}
if (ball.hitTestObject(rackert)) {
calcBallAngle();
}
}
function calcBallAngle(): void {
var ballPosition: Number = ball.x - rackert.x;
trace("Position: " + ballPosition);
var hitPercent: Number = (ballPosition / (rackert.width - ball.width)) - .7;
trace("percent: " + hitPercent);
ballXSpeed = hitPercent * 10;
ballYSpeed *= -1;
}
function getRandom(min: Number, max: Number): Number {
return min + (Math.random() * (max - min));
}
&#13;
答案 0 :(得分:1)
改变这个:
if (gameOver == false) {
gotoAndPlay(3); //gotoAndPlay(); caller
gameOver = true;
rackert.visible = false;
}
要:
if (gameOver == false) {
gotoAndStop(3); //gotoAndPlay(); caller
gameOver = true;
rackert.visible = false;
}
差异是goToAndStop()。默认行为是&#34;循环&#34;一个动画,所以你告诉它去第3帧(最后一帧)并且#34;播放&#34;通过该帧回到1,然后是2,你很可能有一个调用stop()的帧脚本;停止游戏头。
<强> 更新 强>
我相信你,你正在呼叫stop();在第3帧中。看起来它应该起作用,实际上它确实是,它只是没有处理你期望它工作的对象。由于您正在使用框架脚本,因此停止();正在调用框架脚本所在的范围内的InteractiveObject。让我澄清一下。
舞台的第3帧
- &GT;框架三上的孩子叫FrameScriptsArePITA
- &GT;双击FrameScriptsArePITA并编写一个框架脚本&#34; stop()&#34;,该脚本除了停止播放FrameScriptsArePITA外什么也不做。
注意你的范围。这就是为什么框架脚本最好避免的部分原因。使用您自己的DocumentClass并将设计视图中的所有内容挂钩到相应的类中将使AS3中的内容更容易解决。
答案 1 :(得分:1)
我终于找到了这个问题。我在第1帧上有一个计时器事件,导致了这个错误。我只是使用removeEventListener作为计时器功能,我跳到第2帧。正如 Technick Empire 所说,你应该总是清理任何东西,包括甚至是监听器,因为它们甚至可以干扰垃圾收集器并导致内存泄漏