|
|
|||||
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Анимация ходьбы
Я хочу сделать анимацию ходьбы героя в игре. Это отдельный символ, в нем четыре кадра: 1 - стоит, смотрит вправо, 2 - идет вправо (анимация ходьбы в отдельном символе, 3 - стоит, смотрит влево, 4 - идет влево. Мне надо, чтобы, пока зажата левая стрелка, проигрывалась анимация ходьбы влево, а пока зажата правая стрелка - ходьбы вправо. Вместо этого при запуске ролика и нажатии клавиши влево/вправо (до нажатия герой стоит, все нормально) герой начинает стоять при удерживании кнопки, а при отпускании начинает бежать. Вообщем, все получается ровно наоборот. Хотелось бы знать, как решить данную проблему.
Код первого кадра: stop(); stage.addEventListener(KeyboardEvent.KEY_DOWN, movementIn); function movementIn (e:KeyboardEvent){ if (e.keyCode == 39){ gotoAndPlay('goright'); } else if (e.keyCode == 37){ gotoAndPlay('stopleft'); //} else if (e.keyCode == 38){ } } import flash.events.KeyboardEvent; stop() stage.addEventListener(Event.ENTER_FRAME, updateRight); function updateRight(e: Event) { stage.addEventListener(KeyboardEvent.KEY_UP, stopRight); function stopRight(e: KeyboardEvent) { if (e.keyCode == 39) { gotoAndPlay('stopright'); } } } stop(); stage.addEventListener(KeyboardEvent.KEY_DOWN, movementIn2); function movementIn2 (e:KeyboardEvent){ if (e.keyCode == 39){ gotoAndPlay('stopright'); } else if (e.keyCode == 37){ gotoAndPlay('goleft'); //} else if (e.keyCode == 38){ } } import flash.events.Event; import flash.events.KeyboardEvent; stop(); stage.addEventListener(Event.ENTER_FRAME, updateLeft); function updateLeft(e: Event) { stage.addEventListener(KeyboardEvent.KEY_UP, stopLeft); function stopLeft(e: KeyboardEvent) { if (e.keyCode == 37) { gotoAndPlay('stopleft'); } } } |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Вам было бы проще помочь, если бы Вы писали в классах.
А так как Вы пишете в кадрах, то могу посоветовать лишь почитать про design patterns State. Добавлено через 49 секунд Или же я могу маленький пример накидать в классе, если сможете разобраться, то скажите, мне не трудно. |
|
|||||
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Цитата:
|
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
package { public class KeyBoardController { private var _keyboardFlags: Object = {}; public function get keyboardFlags( ): Object { return this._keyboardFlags; } private var _hero: Hero; public function setHero( hero: Hero ): void { this._hero = hero; } public function KeyBoardController( ){ } public function update( ):void { this.keyboardValidate( ); if( _keyboardFlags.LEFT == true ){ _hero.leftState( ); }else if( _keyboardFlags.RIGHT == true ){ _hero.rightState( ); }else if( _keyboardFlags.STOP == true ){ _hero.stopState( ); } } private function keyboardValidate( ): void { if( _keyboardFlags.LEFT == true && _keyboardFlags.RIGHT == true ){ _keyboardFlags.STOP = true; } } public function reset( ): void { for( var flag in this._keyboardFlags ){ if( this._keyboardFlags[flag] == true ){ this._keyboardFlags[flag] = false; } } } } } package { public class Hero { private var _view:DisplayObject; public function Hero( view:DisplayObject ){ this._view = view; } public function leftState( ): void { // } public function rightState( ): void { // } public function stopState( ): void { // } } } // и где-то в коде var _hero: Hero = new Hero( mc ); var _keyBoardController: KeyBoardController = new KeyBoardController( _hero ); var _keyboardFlags = _keyBoardController.keyboardFlags; stage.addEventListener( KeyboardEvent.DOWN, stage_keyboardEventDown ); stage.addEventListener( Event.ENTER_FRAME, stage_enterFrame ); private function stage_keyboardEventDown( event: KeyboardEvent ): void { if( event.keyCode == Keyboard.LEFT ){ _keyboardFlags.LEFT = true; } if( event.keyCode == Keyboard.RIGHT ){ _keyboardFlags.RIGHT = true; } } private function stage_enterFrame( event: Event ): void { _keyBoardController.update( ); _keyBoardController.reset( ); } Если что-то не понимаете, то спрашивайте, а то неохото все расписывать. Добавлено через 27 минут Или вот так - package { public class KeyBoardController { private var _keyboardFlags: Object = {}; public function get keyboardFlags( ): Object { return this._keyboardFlags; } private var _hero: Hero; public function setHero( hero: Hero ): void { this._hero = hero; } public function KeyBoardController( ){ } public function update( ):void { this.keyboardValidate( ); if( _keyboardFlags.LEFT == true ){ _hero.setState = Hero.LEFT; }else if( _keyboardFlags.RIGHT == true ){ _hero.setState = Hero.RIGHT; }else if( _keyboardFlags.STOP == true ){ _hero.setState = Hero.STOP; } return this; } private function keyboardValidate( ): void { if( _keyboardFlags.LEFT == true && _keyboardFlags.RIGHT == true ){ _keyboardFlags.STOP = true; } } public function reset( ): void { for( var flag in this._keyboardFlags ){ if( this._keyboardFlags[flag] == true ){ this._keyboardFlags[flag] = false; } } return this; } } } package { public class Hero { public static const LEFT: String = 'left'; public static const RIGHT: String = 'right'; public static const STOP: String = 'stop'; private var _currentState: String; public function set currentState( value ): void { if( this._currentState == value ){ return; } this._currentState = value; } private var _view:DisplayObject; public function Hero( view:DisplayObject ){ this._view = view; } private function leftState( ): void { // } private function rightState( ): void { // } private function stopState( ): void { // } public function execute( ): void { if( _currentState == Hero.LEFT ){ this.leftState( ); }else if( _currentState == Hero.RIGHT ){ this.rightState( ); }else if( _currentState == Hero.STOP ){ this.stopState( ); } } } } // и где-то в коде var _hero: Hero = new Hero( mc ); var _keyBoardController: KeyBoardController = new KeyBoardController( ).setHero( _hero ) var _keyboardFlags = _keyBoardController.keyboardFlags; stage.addEventListener( KeyboardEvent.DOWN, stage_keyboardEventDown ); stage.addEventListener( Event.ENTER_FRAME, stage_enterFrame ); private function stage_keyboardEventDown( event: KeyboardEvent ): void { if( event.keyCode == Keyboard.LEFT ){ _keyboardFlags.LEFT = true; } if( event.keyCode == Keyboard.RIGHT ){ _keyboardFlags.RIGHT = true; } } private function stage_enterFrame( event: Event ): void { _keyBoardController.update( ).reset( ); _hero.execute( ); } |
|
|||||
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Хорошо. Что хранит переменная _keyboardFlags?
|
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
private function stage_keyboardEventDown( event: KeyboardEvent ): void { if( event.keyCode == Keyboard.LEFT ){ _keyboardFlags.LEFT = true; } if( event.keyCode == Keyboard.RIGHT ){ _keyboardFlags.RIGHT = true; } } значение для свойства LEFT true. Понимаете? Если нажали влево, то сделали об этом запись, если нажали вправо, то тоже сделали запись. Да и само название свойства говорит, что в нем хранятся "флаги клавиатуры". Можно вопрос - Вы книги по as3 читали или учитесь по урокам и видео и если по урокам и видео, то as3 это первый Ваш язык? |
|
|||||
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Цитата:
Добавлено через 3 минуты Хорошо, но в чем принципиальная разница между "записать нажатие и регулярно его проверять, если верно - выполнить действие" и "при нажатии выполнить действие" |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
Тогда не садитесь за flash, пока книгу не прочтете, а то учится программировать в кадрах,
это пустая трата времени. |
|
|||||
@Wormhole
Извиняюсь за оффтоп @Gerbert private var _keyboardFlags: Object = {}; public function get keyboardFlags( ): Object { return this._keyboardFlags; } private function handleEnterFrame(event:Event):void { var instance:KeyBoardController = giveMeYourKBCInstance(); for (var key:String in instance.keyboardFlags) { delete instance.keyboardFlags[ key ]; } } Не будет лишнего вызова гет-функции при доступе, останется просто работа со свойством экземпляра. Более того, если свойству keyboardFlags нечаяно присвоить null или экземпляр нединамического класса, то это вылезет боком при попытке доступа к {любому}/{несуществующему} свойству, что даст пищу для размышлений (гдет-то я загнал в свойство значение извне, а его нужно только читать). А в таком виде, как у Вас, все будет работать без сбоев, но (если "ДУРАК" поработает) не ТАК, КАК ЗАДУМАНО! Терпеть не могу бездумное использование аксессоров, особенно если оправдание этому звучит так: "такой подход дисциплинирует..." Думайте головой, а не следуйте шаблонам. Помните, что шаг вперед лучше шага назад тогда, когда перед Вами не пропасть!!! Оправданием использования {гет}/{сет}/{гет+сет} - аксессоров только для доступа к скрытому свойству может быть только одно - предполагаемому классу нужно прописать свойство, посредством интерфейса (интерфейсы описывают только методы, а getParam() / setParam(value:*) - это уже синтаксическая соль по сравнению с аксессорами). @Все, кто дочитал до моего поста включительно || прочитал только мой пост Извините, наболело... Да и седьмой литр темного пива для меня не просто детектор лжи, он провоцирует на откровенность |
|
|||||
Banned
[+1 06.12.14]
[+1 18.12.14] [+1 30.12.14] Регистрация: Aug 2014
Сообщений: 461
|
elder_Nosferatu, в одном маленьком-маленьком городе,
живет один человечек, который носит трусы поверх брюк. И вот этот человечек встречает Вас и спрашивает - "а почему ты не носишь трусы по верх брюк? Ответы, что это не правильно, не по дрескоду, и прочие, я слушать НЕ ХОЧУ!". Вот что Вы этому нехочухе ответите? |
Часовой пояс GMT +4, время: 13:53. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|