Проблема с кодом - PullRequest
       1

Проблема с кодом

0 голосов
/ 01 января 2011

Это может быть большой вопрос, и я только начинающий в кодировании - но может кто-нибудь сказать мне, что не так с этим кодом?(он довольно короткий.) Цель этого кода - заставить предопределенный объект-герой двигаться с ускорением и медленно замедляться со временем.

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 Ответ

2 голосов
/ 01 января 2011

Эта строка выглядит подозрительно:

var vTimer:Timer; new Timer(10)

Там есть два утверждения: первое говорит, что будет таймер с именем vTimer, второе создает новый таймер с интервалом 10 мс.Я ожидаю, что вы хотели, чтобы был один оператор, который бы создал Timer и назначил его для vTimer.Таким образом, это должно быть:

var vTimer:Timer = new Timer(10);

Я не внимательно изучил остальную часть кода, но я надеюсь, что это поможет вам.

edit: При более внимательном рассмотрении остальной части вашего кода я вижу немало проблем.

Учитывая настройку таймера, vTimer будет вызывать MovementTimer каждые 10 мс.100 раз в секунду.Внутри каждого звонка на MovementTimer вы добавляете нового слушателя для KEY_DOWN, поэтому через 1 секунду при нажатии клавиши будет 100 звонков на Acceleration.

Вам следует переместить обработчик клавишфункции и настройки слушателя вне вашей функции таймера.Похоже, вы пытаетесь реализовать шаблон, в котором ключевые слушатели устанавливают флаг (vLeft и т. Д.), А таймер применяет ускорение к каждому тику.Это хороший шаблон, но вам нужно сделать немало исправлений, прежде чем он заработает.

Вот базовая структура, которую я бы использовал для слушателей и флаги клавиш:

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.
  • ваш обработчик ключей up устанавливает vLeft и vRight оба равны false.Что произойдет, если я нажму и левую, и правую клавиши, но отпущу только одну из них?

Как только вы довольны своим кодом, вам следует поискать библиотеку для обработки опроса клавиш.для тебя.Быстрый поиск в Google показывает, что http://code.google.com/p/bigroom/wiki/KeyPoll поможет вам избежать использования спагетти-кода, если вы хотите таким же образом поддерживать другие нажатия клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...