stop()调用者无法正常工作

时间:2015-04-21 10:21:36

标签: actionscript-3 flash

我正在制作一个有三个框架的破砖游戏。第一帧是开始屏幕,第二帧是游戏本身,第三帧是"游戏结束"屏幕(再试一次按钮)。当我点击"开始游戏"程序跳转到第二帧并停止。如果你没有用球拍击球,程序会跳到第三帧。

我的问题出现在这里,因为程序会立即再次跳转到第二帧。知道为什么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;
&#13;
&#13;

2 个答案:

答案 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 所说,你应该总是清理任何东西,包括甚至是监听器,因为它们甚至可以干扰垃圾收集器并导致内存泄漏