PDA

Просмотр полной версии : перевод простой игры с AS2 на AS3


mamtn
07.08.2010, 21:33
Я преподаю детям в компьютерном центре (дополнительное образование детей) курс
"Создание игр". Делали мы с ними простые игры на AS2. Но вот подумала я, что надо переходить на AS3.
Попробовала перевести одну из игр- лабиринт на AS3 - ничего не получается.
Вот фрагмент кода игры на AS2:

stop();
moveSpeed = 5;// Скорость движения человечка
_root.onEnterFrame = function() {// Внутри этой функции основной код игры
//------- Управление клипом man с помощью клавиатуры---------------
if (Key.isDown(Key.RIGHT)) {
man._x += moveSpeed;
} else if (Key.isDown(Key.UP)) {
man._y -= moveSpeed;
} else if (Key.isDown(Key.DOWN)) {
man._y += moveSpeed;
} else if (Key.isDown(Key.LEFT)) {
man._x -= moveSpeed;
}
};
Здесь человечек быстро реагирует на нажатие клавиш

Создала код управления человечком на AS3:
(c помощью подсказок Фрагменты кода)

stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_PressKeyToMove);
function fl_PressKeyToMove(event:KeyboardEvent):void
{
switch (event.keyCode)
{
case Keyboard.UP:
{
man.y -= 5;
break;
}
case Keyboard.DOWN:
{
man.y += 5;
break;
}
case Keyboard.LEFT:
{
man.x -= 5;
break;
}
case Keyboard.RIGHT:
{
man.x += 5;
break;
}
}
}

Здесь человечек "тормозит" - при смене направления движения возникает пауза.
Такое движение не подходит для игры.

Нужно добавить обработку события смены кадров. Но как это сделать?
Я пыталась, плавность в движении появляется - паузы при смене направлкния движения исчезают, но зато человечек почему-то двигается с ускорением- вообще бешено разгоняется.

Вот код, т.е. попытка...

stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_PressKeyToMove);

function fl_PressKeyToMove(event:KeyboardEvent):void
{
switch (event.keyCode)
{
case Keyboard.UP :
{
stage.addEventListener(Event.ENTER_FRAME, enterFrameToMoveUp);
function enterFrameToMoveUp(e:Event):void
{
kl.y -= 5;
}

stage.addEventListener(KeyboardEvent.KEY_UP,removeEnterFrameUp);
function removeEnterFrameUp(e:KeyboardEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME, enterFrameToMoveUp);
}
break;
};
case Keyboard.DOWN :
{
stage.addEventListener(Event.ENTER_FRAME, enterFrameToMoveDown);
function enterFrameToMoveDown(e:Event):void
{
kl.y += 5;
}
stage.addEventListener(KeyboardEvent.KEY_UP, removeEnterFrameDown);
function removeEnterFrameDown(e:KeyboardEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME, enterFrameToMoveDown);
}
break;
};
case Keyboard.LEFT :// Здесь по старому, с паузами
{
kl.x -= 5;
break;
};
case Keyboard.RIGHT :
{
kl.x += 5;
break;
}
}
};

Если интересно, вот адрес сайта, посвященного нашему курсу:
http:www.flashkursmt.narod.ru

udaaff
07.08.2010, 21:44
Для оформления своего кода надо использовать теги (http://www.flasher.ru/forum/showthread.php?t=122539)

gr_crd
07.08.2010, 22:48
я обычно использую такой подход:


// эти 4 логические переменные укажут, нажата ли сейчас определенная клавиша
// влево, вправо, вверх, вниз
var leftIsDown:Boolean=false;
var rightIsDown:Boolean=false;
var upIsDown:Boolean=false;
var downIsDown:Boolean=false;

// три слушателя событий
// когда клавишу нажимают keyDown
// когда клавишу отпускают keyUp
// старый добрый enterFrame
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
stage.addEventListener(Event.ENTER_FRAME, enterFrame);


// функции keyDown и keyUp установят соответствующие значения логических переменных
// например - нажали клавишу влево - leftIsDown=true; - клавиша влево нажата = true
function keyDown(e:KeyboardEvent):void{
if(e.keyCode==Keyboard.UP) upIsDown=true;
if(e.keyCode==Keyboard.DOWN) downIsDown=true;
if(e.keyCode==Keyboard.LEFT) leftIsDown=true;
if(e.keyCode==Keyboard.RIGHT) rightIsDown=true;
}
// а когда отпустят leftIsDown=false; - клавиша влево нажата = false
function keyUp(e:KeyboardEvent):void{
if(e.keyCode==Keyboard.UP) upIsDown=false;
if(e.keyCode==Keyboard.DOWN) downIsDown=false;
if(e.keyCode==Keyboard.LEFT) leftIsDown=false;
if(e.keyCode==Keyboard.RIGHT) rightIsDown=false;
}

// а здесь проверяются переменные, если соответствующая клавиша нажата - выполняется действие
// похоже на запись на AS2 - различие: вместо if (Key.isDown(Key.RIGHT)) мы проверяем if(rightIsDown)
function enterFrame(e:Event):void
{
if(upIsDown)man.y -= 5;
if(downIsDown)man.y += 5;
if(leftIsDown)man.x -= 5;
if(rightIsDown)man.x += 5;
}

VVall
07.08.2010, 23:29
"Тормозит" - это действие автоповтора клавиатуры. По нажатию клавиши приходит событие нажатия, и через паузу оно начинает повторяться с одинаковыми, более короткими паузами. Правильное решение этой проблемы указано в предыдущем сообщении.

mamtn
08.08.2010, 16:54
Всем спасибо за ответ, особенно gr cdr!
Все получилось, продолжаю переводить игру с AS2 на AS3