代码问题

时间:2011-01-01 09:20:03

标签: actionscript-3

这可能是一个很大的问题,我只是编码的初学者 - 但有人可以告诉我这段代码有什么问题吗? (它很短。) 此代码的目的是使预定义的对象英雄随着加速度移动并随着时间的推移缓慢减速。

import flash.utils.Timer;
import flash.events.KeyboardEvent;

var vMove:Number = 0
var vMoveMaxL = -15
var vMoveMaxR = 15
var vLeft:Boolean = false
var vRight:Boolean = false
var vAccel:Number = 0.5
var vDeccel:Number = 1
var vDeccelFactor:Number = 0.1
var vTimer:Timer; new Timer(10)

vTimer.addEventListener(TimerEvent.TIMER, MovementTimer);
vTimer.start();

function MovementTimer(event:TimerEvent):void
{
 //Acceleration
 {
  //Initiation
  {
   stage.addEventListener(KeyboardEvent.KEY_DOWN, Acceleration);
   function Acceleration(event:KeyboardEvent):void
   {
    switch (event.keyCode)
    {
     case Keyboard.LEFT:
     {
      if  (vMove > vMoveMaxL)
      {
       vMove = vMoveMaxL;
       vLeft = true;
      }
      else
      {
       vMove -= vAccel;
       vLeft = true;
      }
     }
     case Keyboard.RIGHT:
     {
      if (vMove < vMoveMaxR)
      {
       vMove = vMoveMaxR;
       vRight = true;
      }
      else
      {
       vMove += vMoveMaxR;
       vRight = true;
      }
     }
    }
   }
  }
  //Blank
  {
   stage.addEventListener(KeyboardEvent.KEY_UP, Conditioner);
   function Conditioner(event:KeyboardEvent):void
   {
    switch (event.keyCode)
    {
     case Keyboard.LEFT:
     {
      vLeft = false;
     }
     case Keyboard.RIGHT:
     {
      vRight = false;
     }
    }
   }
  }
 }
 //Decceleration
 {
  if (vMove == 0)
  {
   vMove = 0;
  }
  else
  {
   if (vLeft==false && vRight==false)
   {
    vDeccel -= vDeccelFactor;
    {
     vMove *= vDeccel;
    }
   }
   else
   {
    vMove = vMove;
   }
  }
 }
 //Blank
 {
  hero.x += vMove;
 }
 //Blank
}

1 个答案:

答案 0 :(得分:2)

这一行看起来很可疑:

var vTimer:Timer; new Timer(10)

有两个陈述:第一个说明将有一个名为vTimer的Timer,第二个会创建一个间隔为10ms的新Timer。我希望你的意思是有一个语句可以创建Timer并将其分配给vTimer。所以它应该是:

var vTimer:Timer = new Timer(10);

我没有密切关注其余代码,但我希望这能让你走上正轨。

编辑:仔细查看其余代码,我发现了很多问题。

鉴于计时器设置,vTimer将每隔10毫秒调用MovementTimer。每秒100次。在每次拨打MovementTimer时,您都会为KEY_DOWN添加一个新的监听器,因此当您按一个键时,1秒钟后将有100个呼叫Acceleration

您应该在计时器功能之外移动键处理函数和侦听器分配。看起来你正在尝试实现一个模式,其中键监听器设置一个标志(vLeft等),并且计时器在每个tick上应用加速。这是一个很好的模式,但在它发挥作用之前你需要进行一些修正。

这是我用于监听器和键标志的基本结构:

var left:Boolean = false;
var right:Boolean = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

function onKeyDown(event:KeyboardEvent):void {
  if (event.keyCode == Keyboard.LEFT) {
    left = true;
  }
  else if (event.keyCode == Keyboard.RIGHT) {
    right = true;
  }
}
function onKeyUp(event:KeyboardEvent):void {
  if (event.keyCode == Keyboard.LEFT) {
    left = false;
  }
  else if (event.keyCode == Keyboard.RIGHT) {
    right = false;
  }
}

var timer:Timer = new Timer(10);
timer.addListener(TimerEvent.TIMER, onTimer);

function onTimer(event:TimerEvent):void {
  if (left) {
    // do left acceleration things
  }
  else {
    // deceleration things
  }
  if (right) {
    // do right acceleration things
  }
  else {
    // deceleration things
  }
  // apply movements
}

我没有测试过这段代码,但希望很清楚它与你自己的代码有什么不同。完成此操作后,您应该能够再次使用有意义的值调整加速度/减速度。

要注意/考虑的其他几件事情:

  • 为自己分配值不会执行任何操作,因此您可以删除您所说的部分vMove = vMove
  • 您在简单语句周围使用了大量不必要的块({}之间的部分)。在actionscript(和javascript)中,除了类和类函数之外,这些不会改变变量的范围,因此除非if / else语句需要它们,否则可以删除它们。
  • 您的密钥处理程序将vLeftvRight都设置为false。如果我同时按下左键和右键会发生什么,但我只释放其中一个?

一旦您对代码感到满意,您应该四处寻找图书馆来处理密钥轮询。快速谷歌搜索建议http://code.google.com/p/bigroom/wiki/KeyPoll可以帮助您避免使用意大利面条代码,如果您想以同样的方式支持其他按键操作。