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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.01.2013, 14:29
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 11  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Класс Main - это главный контроллер
Контроллер — это класс Keys. Не используйте слово "контроллер" в смысле "центр логики". Контроллер не более чем драйвер, переводящий некие действия пользователя в понятные приложению данные.
Цитата:
Если нет, то зачем он нужен?
Для отображения персонажа, вестимо. Для управления его анимацией, поворотами, ходьбой, прыжками и прочими визуальными эффектами. А что он, по-вашему, должен хранить? Если бы персонажей было сто, был бы смысл каждому из них хранить свою "скорость". А когда он один, достаточно карте иметь одно приватное свойство "скорость персонажа". И то только если эта скорость на самом деле переменная.
Цитата:
в классе Beatle должны быть свойства + методы
Безусловно. Свойства и методы, относящиеся к данному экземпляру. Методы "заплакать", "подпрыгнуть", "присесть" и т.п., то есть "перейти на такой-то кадр анимации". И свойства типа ширина и высота. Потому что даже х и у нельзя считать его собственными свойствами "в вакууме". Это его свойства в системе координат его контейнера (карты). Отсюда и методы типа moveDown выглядят как-то смешно. С таким же успехом можно написать beatle.y += persSpeed;. Вот только логики здесь будет гораздо больше: система изменяет свои части, а не части изменяют систему. Это называется словом Иерархия. А его противоположность — Хаос, когда шашки сами решают куда им ходить.
Цитата:
Что посоветуете изучить/прочитать, чтобы усвоить проектирование ООП приложений?
Ну хотя бы ActionScript 3.0. Шаблоны проектирования.
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
Ура! Я понял о чем Вы говорили и написал передвижение своего жука по всем правилам. Прочитал Ваш последний пост и всё сходится. Теперь намного лучше понимаю ООП.


Последний раз редактировалось zzSpirit; 08.01.2013 в 19:09.
Старый 08.01.2013, 16:07
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 13  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
Цитата:
Сообщение от samana Посмотреть сообщение
Если вы хотите сделать управление внутри класса Beatle, то это может выглядеть примерно так (простой вариант):
Код AS3:
		private function stage_keyUp(e:KeyboardEvent):void 
		{
			if (e.keyCode == 37) keyLeft = false;
			if (e.keyCode == 39) keyRight = false;
		}
 
		private function stage_keyDown(e:KeyboardEvent):void 
		{
			if (e.keyCode == 37) keyLeft = true;
			if (e.keyCode == 39) keyRight = true;
		}
Тогда в Маин классе остаётся только добавить экземпляр класса Beatle на сцену.
это не правильно... 1 кейкод не может быть одновременно равен 2-м значениям, нужно использовать конструкцию switch или хотябы if else if

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

Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
Цитата:
Сообщение от gagaga Посмотреть сообщение
это не правильно... 1 кейкод не может быть одновременно равен 2-м значениям, нужно использовать конструкцию switch или хотябы if else if
Хм... В моем примере также сделано. Но где тут кейкод равняется двум значениям? Такого нету.
А если if else if или switch использовать - то нажатия двух клавиш одновременно не будут фиксироваться.
По-моему пример юзера samana правильный.

Добавлено через 5 минут
Упс, а хотя да. e.keyCode не может быть равен двум значениям, нужно использовать switch.
Только не совсем понимаю, если нажаты 2 и более клавиш, то через кадр по очереди будут разные коды в e.keyCode? Как тогда определяется нажатие двух клавиш, ведь действительно e.keyCode не может равняться двум значениям, если он не массив...

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
В вашем классе Keys функция onKeyDown и onKeyUp должна выглядеть так:
Код AS3:
private function onKeyDown(event:KeyboardEvent):void
{
	if (event.keyCode == 38)
	{
		up = true;
	}
	else if (event.keyCode == 40)
	{
		down = true;
	}
	else if (event.keyCode == 37)
	{
		left = true;
	}
	else if (event.keyCode == 39)
	{
		right = true;
	}
}
Одновременно клавиши нажиматься не могут. Нажали вниз, произошло события KeyboardEvent.KEY_DOWN, down стал равен true, затем через несколько миллисекунд нажали вправо, произошло тоже самое событие, теперь down и right равны true, остальные переменные false. При отпускании этих кнопок произойдут два события KeyboardEvent.KEY_UP и по очереди down и up будут вновь равны false.

Добавлено через 3 минуты
Цитата:
Сообщение от zzSpirit Посмотреть сообщение
Только не совсем понимаю, если нажаты 2 и более клавиш, то через кадр по очереди будут разные коды в e.keyCode?
Да.
Цитата:
Сообщение от zzSpirit Посмотреть сообщение
Как тогда определяется нажатие двух клавиш, ведь действительно e.keyCode не может равняться двум значениям, если он не массив...
Код AS3:
if (down && up)
{
    trace("Нажата клавиша вниз и вверх");
}

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

Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
Цитата:
Сообщение от TWETTI Посмотреть сообщение
Одновременно клавиши нажиматься не могут. Нажали вниз, произошло события KeyboardEvent.KEY_DOWN, down стал равен true, затем через несколько миллисекунд нажали вправо, произошло тоже самое событие, теперь down и right равны true, остальные переменные false. При отпускании этих кнопок произойдут два события KeyboardEvent.KEY_UP и по очереди down и up будут вновь равны false.
Только что проверил, запустил и нажал сразу две клавиши. Жук двигался по диагонали, output такой:
Код AS3:
keyCode: 40
keyCode: 39
keyCode: 39
keyCode: 39
keyCode: 39
keyCode: 39
и так далее... Дальше всегда 39
Получается, клавиша вниз всегда оставалась true, даже тогда, когда аутпут показывал только клавишу влево. Ну, все правильно, хотя и не очень понятно, как в следующих кадрах АС3 знал, что все еще нажата клавиша вниз, если аутпут всегда выдавал только 39 на каждом кадре. Загадка.

Добавлено через 5 минут
Цитата:
Сообщение от TWETTI Посмотреть сообщение
В вашем классе Keys функция onKeyDown и onKeyUp должна выглядеть так:
Изменил. понимаю, что так правильнее, хотя разницы и нету. По идее, быстрее должно работать.

Добавлено через 7 минут
Цитата:
Сообщение от TWETTI Посмотреть сообщение
Код AS3:
if (down && up)
{
    trace("Нажата клавиша вниз и вверх");
}
Нет, я имел ввиду не как определить что нажаты две клавиши, а как AS3 определяет, что нажаты 2 клавиши. Посмотрите output. Там кейкод клавиши которая первая была нажата, а потом уже идет только кейкод клавиши, которая была нажата второй. Они идут не по очереди.

Добавлено через 14 минут
Изменил ИФы на Свитчи. И код лучше читается и меньше по размеру и правильней. Теперь там такие конструкции:
Код AS3:
		private function onKeyDown(event:KeyboardEvent):void
		{
			switch(event.keyCode)
			{
				case 38 : up = true; break;
				case 40 : down = true; break;
				case 37 : left = true; break;
				case 39 : right = true; break;
			}
		}

Старый 08.01.2013, 17:13
TWETTI вне форума Посмотреть профиль Отправить личное сообщение для TWETTI Найти все сообщения от TWETTI
  № 17  
Ответить с цитированием
TWETTI
 
Аватар для TWETTI

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Цитата:
Сообщение от zzSpirit Посмотреть сообщение
Нет, я имел ввиду не как определить что нажаты две клавиши, а как AS3 определяет, что нажаты 2 клавиши. Посмотрите output. Там кейкод клавиши которая первая была нажата, а потом уже идет только кейкод клавиши, которая была нажата второй. Они идут не по очереди.
AS3 никак не определяет что две клавиши нажаты. Это должны делать вы сами.

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

Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
Обновленный архив с проектом загрузил по той же ссылке.

Добавлено через 1 минуту
Цитата:
Сообщение от TWETTI Посмотреть сообщение
AS3 никак не определяет что две клавиши нажаты. Это должны делать вы сами.
Но ведь если 2 клавиши нажаты, он в output пишет сначала кейкод первой клавиши, а потом постоянно кей-код другой клавиши. (мой output написал выше)
При этом обе клавиши равны true. Хотя кейкод первой клавиши он больше не получал.

Добавлено через 4 минуты
Ой, опять туплю. Всё правильно. Первая клавиша не должна стать false, если не поступило команды о ее отпускании. Извиняюсь.

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Цитата:
Сообщение от zzSpirit Посмотреть сообщение
Но ведь если 2 клавиши нажаты, он в output пишет сначала один кейкод, а потом постоянно кей-код другой. (мой output написал выше)
При этом обе клавиши равны true.
Все правильно. В output выводится информация о том, какая клавиша сейчас нажата. Обе клавишы равны true потому, что вы в коде это учли.

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

Регистрация: Jan 2013
Адрес: Москва, Сходня
Сообщений: 41
Да. Уже написал выше. Всё правильно. Не было команды false для первой клавиши, поэтому она всегда была true, а в output выводился кейкод второй клавиши.

Добавлено через 1 час 24 минуты
Wolsh, Благодарю за книгу. Буду ее очень внимательно изучать. Благодаря Вашим подробным обьяснениям, многое понял. Большое Вам спасибо!


Последний раз редактировалось zzSpirit; 08.01.2013 в 18:56.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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