Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.10.2014, 20:12
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 1  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Attention Анимация ходьбы

Я хочу сделать анимацию ходьбы героя в игре. Это отдельный символ, в нем четыре кадра: 1 - стоит, смотрит вправо, 2 - идет вправо (анимация ходьбы в отдельном символе, 3 - стоит, смотрит влево, 4 - идет влево. Мне надо, чтобы, пока зажата левая стрелка, проигрывалась анимация ходьбы влево, а пока зажата правая стрелка - ходьбы вправо. Вместо этого при запуске ролика и нажатии клавиши влево/вправо (до нажатия герой стоит, все нормально) герой начинает стоять при удерживании кнопки, а при отпускании начинает бежать. Вообщем, все получается ровно наоборот. Хотелось бы знать, как решить данную проблему.
Код первого кадра:
Код AS3:
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){
 
	}
}
Код второго кадра:
Код AS3:
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');
		}
	}
}
Код третьего кадра:
Код AS3:
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){
 
	}
}
Код четвертого кадра:
Код AS3:
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');
		}
	}
}
На кадрах расставлены метки, думаю, понятно, что к чему относится. Заранее спасибо

Старый 23.10.2014, 21:57
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 2  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Вам было бы проще помочь, если бы Вы писали в классах.
А так как Вы пишете в кадрах, то могу посоветовать лишь почитать про design patterns State.

Добавлено через 49 секунд
Или же я могу маленький пример накидать в классе, если сможете разобраться, то скажите, мне не трудно.

Старый 23.10.2014, 22:36
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 3  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от Gerbert Посмотреть сообщение
Вам было бы проще помочь, если бы Вы писали в классах.
А так как Вы пишете в кадрах, то могу посоветовать лишь почитать про design patterns State.

Добавлено через 49 секунд
Или же я могу маленький пример накидать в классе, если сможете разобраться, то скажите, мне не трудно.
Накидайте, пожалуйста. Попробую разобраться

Старый 23.10.2014, 23:15
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 4  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Код AS3:
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;
				}
			}
		}
	}
}
Код AS3:
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
		{
			//
		}
	}
}
Код AS3:
// и где-то в коде
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( );
}
Добавлено через 1 минуту
Если что-то не понимаете, то спрашивайте, а то неохото все расписывать.

Добавлено через 27 минут
Или вот так -
Код AS3:
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( );
}

Старый 24.10.2014, 16:21
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 5  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Хорошо. Что хранит переменная _keyboardFlags?

Старый 24.10.2014, 17:26
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 6  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Код AS3:
private function stage_keyboardEventDown( event: KeyboardEvent ): void
{
	if( event.keyCode == Keyboard.LEFT ){
		_keyboardFlags.LEFT = true;
	}
 
	if( event.keyCode == Keyboard.RIGHT ){
		_keyboardFlags.RIGHT = true;
	}
}
Видите, если по условию keyCode == кнопки "стрелка влево", то присваеваем
значение для свойства LEFT true. Понимаете? Если нажали влево, то сделали об этом запись,
если нажали вправо, то тоже сделали запись.
Да и само название свойства говорит, что в нем хранятся "флаги клавиатуры".

Можно вопрос - Вы книги по as3 читали или учитесь по урокам и видео и если по урокам и видео,
то as3 это первый Ваш язык?

Старый 24.10.2014, 18:15
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 7  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от Gerbert Посмотреть сообщение
Код AS3:
private function stage_keyboardEventDown( event: KeyboardEvent ): void
{
	if( event.keyCode == Keyboard.LEFT ){
		_keyboardFlags.LEFT = true;
	}
 
	if( event.keyCode == Keyboard.RIGHT ){
		_keyboardFlags.RIGHT = true;
	}
}
Видите, если по условию keyCode == кнопки "стрелка влево", то присваеваем
значение для свойства LEFT true. Понимаете? Если нажали влево, то сделали об этом запись,
если нажали вправо, то тоже сделали запись.
Да и само название свойства говорит, что в нем хранятся "флаги клавиатуры".

Можно вопрос - Вы книги по as3 читали или учитесь по урокам и видео и если по урокам и видео,
то as3 это первый Ваш язык?
Учился по официальному курсу Adobe - там про классы мало, сейчас начал читать колина мука. До as писал на js и D

Добавлено через 3 минуты
Хорошо, но в чем принципиальная разница между "записать нажатие и регулярно его проверять, если верно - выполнить действие" и "при нажатии выполнить действие"

Старый 24.10.2014, 18:19
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 8  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Тогда не садитесь за flash, пока книгу не прочтете, а то учится программировать в кадрах,
это пустая трата времени.

Старый 24.10.2014, 18:31
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 9  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
@Wormhole
Извиняюсь за оффтоп

@Gerbert
Код AS3:
		private var _keyboardFlags: Object = {};
		public function get keyboardFlags( ): Object
		{
			return this._keyboardFlags;
		}
И зачем это? Защита свойства _keyboardFlags через геттер keyboardFlags даст Вам уверенность лишь в том, что _keyboardFlags не будет содержать null или экземпляр нединамического класса. Но я всегда могу сделать чтото вроде этого
Код AS3:
private function handleEnterFrame(event:Event):void {
  var instance:KeyBoardController = giveMeYourKBCInstance();
    for (var key:String in instance.keyboardFlags) {
      delete instance.keyboardFlags[ key ];
  }
}
и насмерть убить зашитую в приложение логику взаимодействия с клавиатурой, заставив такой хендлер слушать ЭнтерФрейм. Так почему бы не сделать просто
Код AS3:
public var keyboardFlags:Object = {};
Не будет лишнего вызова гет-функции при доступе, останется просто работа со свойством экземпляра. Более того, если свойству keyboardFlags нечаяно присвоить null или экземпляр нединамического класса, то это вылезет боком при попытке доступа к {любому}/{несуществующему} свойству, что даст пищу для размышлений (гдет-то я загнал в свойство значение извне, а его нужно только читать). А в таком виде, как у Вас, все будет работать без сбоев, но (если "ДУРАК" поработает) не ТАК, КАК ЗАДУМАНО! Терпеть не могу бездумное использование аксессоров, особенно если оправдание этому звучит так: "такой подход дисциплинирует..." Думайте головой, а не следуйте шаблонам. Помните, что шаг вперед лучше шага назад тогда, когда перед Вами не пропасть!!!
Оправданием использования {гет}/{сет}/{гет+сет} - аксессоров только для доступа к скрытому свойству может быть только одно - предполагаемому классу нужно прописать свойство, посредством интерфейса (интерфейсы описывают только методы, а getParam() / setParam(value:*) - это уже синтаксическая соль по сравнению с аксессорами).

@Все, кто дочитал до моего поста включительно || прочитал только мой пост
Извините, наболело... Да и седьмой литр темного пива для меня не просто детектор лжи, он провоцирует на откровенность

Старый 24.10.2014, 20:29
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 10  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
elder_Nosferatu, в одном маленьком-маленьком городе,
живет один человечек, который носит трусы поверх брюк. И вот этот человечек встречает Вас
и спрашивает - "а почему ты не носишь трусы по верх брюк? Ответы, что это не правильно, не по дрескоду,
и прочие, я слушать НЕ ХОЧУ!".

Вот что Вы этому нехочухе ответите?

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:53.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.