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

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

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

Регистрация: May 2013
Сообщений: 8
По умолчанию Анимация персонажа при управлении

Добрый день!

С флешем знакома в общей сложности третьи сутки, учусь по туториалам которые попадаются на ютубе. Задача следующая: при движении персонажа вправо-влево-вверх-вниз включать соответствующую анимацию движения.
Код управления кнопками писался по туториалу управления тупокружочком, остальное - лучшее до чего я смогла дойти самостоятельно, прошерстив других схожих инструкций в количестве.
Проблема: при нажатии клавиш управления анимация включается, но проигрывается только один раз. Плюс есть не очень приятный баг: при одновременном нажатии двух клавиш, например вверх, потом не отпуская влево, персонаж поворачивается влево и продолжает в таком положении двигаться вверх.

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

Код AS3:
package AS {
 
	import flash.display.MovieClip;
	import flash.events.KeyboardEvent;
	import flash.events.Event;
 
 
	public class Hero extends MovieClip {
 
		private var moveUp:Boolean;
		private var moveDown:Boolean;
		private var moveLeft:Boolean;
		private var moveRight:Boolean;
 
		private var moveUpFlag:Boolean;
		private var moveDownFlag:Boolean;
		private var moveLeftFlag:Boolean;
		private var moveRightFlag:Boolean;
 
		private var moveSpeed:uint;
 
		public function Hero() {
			moveUp=false;
			moveRight=false;
			moveLeft=false;
			moveDown=false;
 
			moveSpeed=4;
 
			Constants.stageRef.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedListener);
			Constants.stageRef.addEventListener(KeyboardEvent.KEY_UP, keyReleasedListener);
			Constants.stageRef.addEventListener(Event.ENTER_FRAME, frameListener);
 
		}
 
		private function keyPressedListener(e:KeyboardEvent){
			var key:uint=e.keyCode;
			if(key==87||key==38){//W or UP key
				this.gotoAndPlay("goUp")
				moveUp=true;				
			}else if(key==65||key==37){//A or LEFT key
				this.gotoAndPlay("goLeft")
				moveLeft=true;				
			}else if(key==83||key==40){//S or DOWN key
				this.gotoAndPlay("goDown")
				moveDown=true;				
			}else if(key==68||key==39){//D or RIGHT
				this.gotoAndPlay("goRight")
				moveRight=true;				
			}
 
		}
 
		private function keyReleasedListener(e:KeyboardEvent){
			var key:uint=e.keyCode;
			if(key==87||key==38){//W or UP key
				this.gotoAndStop("goUp")
				moveUp=false;
			}else if(key==65||key==37){//A or LEFT key
				this.gotoAndStop("goLeft")
				moveLeft=false;
			}else if(key==83||key==40){//S or DOWN key	
				this.gotoAndStop("goDown")
				moveDown=false;
			}else if(key==68||key==39){//D or RIGHT
				this.gotoAndStop("goRight")
				moveRight=false;
			}
		}
 
		private function frameListener(e:Event){
			if(moveUp){
				this.y-=moveSpeed;
 
			}else if(moveLeft){
				this.x-=moveSpeed;
 
			}else if(moveDown){
				this.y+=moveSpeed;
 
 
			}else if(moveRight){
				this.x+=moveSpeed;
 
			}
		}
	}
 
}
Вложения
Тип файла: zip AS3 Study.zip (21.1 Кб, 53 просмотров)

Старый 20.05.2013, 22:19
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 2  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
То что класс наследуется от MovieClip не означает что он будет отображаться.
Либо класс не полный, либо вы хитрите.

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

Регистрация: May 2013
Сообщений: 8
А, что? То есть хитрю?

Старый 20.05.2013, 22:33
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 4  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
Класс расположен где?
P.S.Независим или в кадре?
P.S.S.Даже немного не так. Класс "привязан" к муви, а клип отображается в определённых кадрах?

Старый 20.05.2013, 22:41
FlashWizard вне форума Посмотреть профиль Отправить личное сообщение для FlashWizard Найти все сообщения от FlashWizard
  № 5  
Ответить с цитированием
FlashWizard
[+1 22.06.11]
 
Аватар для FlashWizard

Регистрация: Jun 2010
Адрес: г. Ташкент
Сообщений: 364
Цитата:
Класс расположен где?
P.S.Независим или в кадре?
Koopa, как интересно вы расположите класс в кадре?

Старый 20.05.2013, 22:42
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 6  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
Цитата:
Сообщение от FlashWizard Посмотреть сообщение
Koopa, как интересно вы расположите класс в кадре?
легко
Другой вопрос, зачем.

Старый 20.05.2013, 22:49
FlashWizard вне форума Посмотреть профиль Отправить личное сообщение для FlashWizard Найти все сообщения от FlashWizard
  № 7  
Ответить с цитированием
FlashWizard
[+1 22.06.11]
 
Аватар для FlashWizard

Регистрация: Jun 2010
Адрес: г. Ташкент
Сообщений: 364
Цитата:
легко
У меня ошибка компиляции. Вы не путаете?
Код на кадре таймлайна преобразуется в класс. Описание класса внутри описания другого, в первый раз слышу.

Старый 20.05.2013, 22:52
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 8  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Цитата:
Проблема: при нажатии клавиш управления анимация включается, но проигрывается только один раз
Скорее всего, нужно в финальный кадр анимации для определенного направления вставить код перехода на начальный кадр этой анимации:
Код AS3:
gotoAndPlay("goDown")
Цитата:
при одновременном нажатии двух клавиш, например вверх, потом не отпуская влево, персонаж поворачивается влево и продолжает в таком положении двигаться вверх
Он делает именно то, что написано в коде - если нажать клавишу "влево", проигрывает анимацию передвижения влево. Двигается же он вверх, потому что в frameListener стоят условия выбора только одного направления, а первым проверяется именно направление вверх.
P.S.
Учиться лучше по туториалам текстовым, честно вчитываясь, теория в видео обычно воспринимается как "бла-бла-бла, а теперь пишем код".

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
при одновременном нажатии двух клавиш, например вверх, потом не отпуская влево, персонаж поворачивается влево и продолжает в таком положении двигаться вверх.
А Вы бы как хотели?
У Вас при поступлении события от клавиатуры разбирается, какая клавиша была нажата. Но при этом условия if() вложены через else (видимо, авторы туториалов считают, что переменная может хранить сразу несколько значений ). Затем каждый кадр (по событию ENTER_FRAME) происходит перемещение персонажа в зависимости от флагов влево, вправо и т.д. То есть, хотелось бы чтобы от флагОВ, но на самом деле — от флагА, поскольку if'ы снова вложены через else, то есть, если персонаж идет вверх, он уже никак не может идти влево. Кроме того, если клавишу вверх не отпустили, он вообще никуда больше идти не будет, потому что остальные варианты рассматриваются только в else ("иначе", то есть только если вверх не идем). Если хотите, чтобы перс двигался и по диагонали, уберите else. Если хотите, чтобы перс просто был повернут в ту же сторону из 4-х, в которую двигается — поворачивайте его там же, где меняете координату. Потому что сейчас происходит так: приходит одно событие от клавиатуры, затем второе — и все это на протяжении одного кадра, то есть отрисовано будет только последнее изменение состояния.
Вобщем, сначала Вам надо определиться, чего Вы ждете при нажатии двух направлений одновременно.
__________________
Reality.getBounds(this);

Старый 20.05.2013, 23:01
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 10  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Ну суть бага в том, что у Вас в приемнике Фрэйма стоит порядок движения, т.е если у Вас нажата кнопочка, которая раньше зарегистрирована, то это движение из двух, трех, четырех он выберет.

Т.е. Если нажата Вверх и вниз - пойдет вверх, влево и вниз - пойдет влево.
Т.е приоритеты :
1. up
2. left
3. down
4. right

Приоритет определяет направление, чем ниже он - туда и будет двигаться. А почему происходит поворот? Потому что рассылка события заходит в приемник keyPressedListener и делает поворот.

Исправить этот баг - просто, просто нужно обнулять переменные ненужных нам направлений в приемнике:

Код AS3:
private function keyPressedListener(e:KeyboardEvent){
			var key:uint=e.keyCode;
			if(key==87||key==38){//W or UP key
				this.gotoAndPlay("goUp");
				moveUp = true;
				moveRight=false;
				moveDown = false;
				moveLeft=false;
			}else if(key==65||key==37){//A or LEFT key
				this.gotoAndPlay("goLeft");
				moveLeft = true;
				moveUp = false;
				moveRight=false;
				moveDown=false;
			}else if(key==83||key==40){//S or DOWN key
				this.gotoAndPlay("goDown");
				moveDown = true;
				moveUp = false;
				moveRight=false;
				moveLeft=false;
				return;
			}else if(key==68||key==39){//D or RIGHT
				this.gotoAndPlay("goRight");
				moveRight = true;
				moveUp = false;
				moveDown=false;
				moveLeft=false;
			}
 
		}
Если же Вы хотите, чтобы после отпускания одной из двух клавиш Ваш персонаж продолжал движение, то Вам придется завести что-то типа переменной приоритета и менять при получении события, т.е где я менял значения переменных, там обновлять этот приоритет при получении событий, а в приемнике фрейма отталкиваться от значений :
1. Нажата ли кнопочка?
2. Если нажата, то проверять приоритет.

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

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

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


 


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


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