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

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

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

Регистрация: Feb 2014
Сообщений: 192
Cool организация кода в игре

Подскажите, пожалуйста, каким образом лучше организовать код в игре.
Допустим игра танки. Одним танком управляет игрок, другими компьютер.
В игре 3 вида танков.
Я сделал общий класс Tank, куда включил такие свойства как скорость, прочность и т.д. Затем, расширил этот класс тремя другими, представляющими разные виды танков, в которых различные свойства скорости и прочности.
Но у меня возникли вопросы:
1. У трех танков есть метод movie(), который должен управляться игроком или компьютером, в зависмости от того, какой танк выберет пользователь. ТАК каким образом дать знать программе, что этот танк должен управляться игроком?
использовать флажок или дополнительные классы?
2. Для управления танком игроком необходимо зарегистрировать слушатели клавиш клавиатуры и слушатель Enter_FRAME. У меня вопрос, где лучше регистрировать слушатели в конструкторе классов танков либо в главном классе main?
Подскажите, хоть примерно, так как опыта еще не имею.

Старый 27.05.2014, 23:05
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
1. Флажок ясное дело, сами подумайте причем тут доп сущность. Из за одного параметра ее не создают. Если бы у вас был конфиг или какой то контроллер где все обрабатывалось и проверялось, тогда да. А так - флажок в моделе танка. ( надеюсь модели то у вас есть ?! )
2. В main - вообще кода быть не должно кроме controller.init() или как кому нравится. Регистрировать интер-фрейм лучше во вьюшках танка, вполне, клавиатуру тоже можно, хотя я бы этим занялся в контроллере, где происходила бы обработка нажатий и дальнейший посыл куда надо.
__________________
Марк Tween

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
В main - вообще кода быть не должно кроме controller.init() или как кому нравится.
Для того, чтобы понять как все работает, и более менее разобраться в коде, то можно для начала и в Main писать всю логику, ничего страшного в этом не вижу. Все эти вьюшки и контроллеры новичку ни к чему. Со временем все это придет.
Цитата:
Регистрировать энтер-фрейм лучше во вьюшках танка, вполне, клавиатуру тоже можно, хотя я бы этим занялся в контроллере, где происходила бы обработка нажатий и дальнейший посыл куда надо.
У меня для этого вообще отдельный класс используется, в котором есть статический метод isDown(keyCode:uint):Boolean
и для ENTER_FRAME тоже отдельный класс. Но все это в данном случае можно и в Main добавить, чтобы лишний раз себе голову не засорять.

Цитата:
ТАК каким образом дать знать программе, что этот танк должен управляться игроком?
Заводим переменную
Код AS3:
private var _playerTank:Tank = null;
И при выборе танка, допустим он выбирается щелчком мыши, записываем ссылку на него в эту переменную
Код AS3:
private function onClick(e:MouseEvent):void {
   if (e.target is Tank) { // допустим у танка есть метод isPlayer():Boolean который показывает, может ли игрок воспользоваться этим танком
        var targetTank:Tank = e.target as Tank;
        if (targetTank.isPlayer()) {
            _playerTank = targetTank; 
        }
   }
}
Ну а дальше, в обработчике ENTER_FRAME проверяем (предположим, используются флаги upPresed, downPressed и т.д., для определения нажатия клавиш)
Код AS3:
private function onEnterFrame(e:Event):void {
   if (upPressed) {
        if (_playerTank) { // проверяем не null ли ссылка
             _playerTank.movie(); // movie - это не правильное название метода, так как movie переводится как фильм. Правильнее было бы назвать метод move()
        }
   }
}
__________________
Ко мне можно и нужно обращаться на ты)

Старый 28.05.2014, 10:15
Dmitriy154 вне форума Посмотреть профиль Отправить личное сообщение для Dmitriy154 Найти все сообщения от Dmitriy154
  № 4  
Ответить с цитированием
Dmitriy154

Регистрация: Feb 2014
Сообщений: 192
Спасибо вам!
Если можно в двух словах объясните про контроллеры и вьюшки, или ссылку дайте.
Вопрос - если исспользовать отдельный класс для событий Enter_FRAME, то какой класс он должен рассширять? Может EventDispatcher. И в блоке кода этого класса, как я понимаю, должны вызываться методы move() и другие, или генерироваться событие Event?
Прошу заранее прощение, если глупость написал.

Старый 28.05.2014, 12:03
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 5  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Цитата:
Вопрос - если исспользовать отдельный класс для событий Enter_FRAME, то какой класс он должен рассширять?
Класс может и ничего не расширять, но он должен получить ссылку на stage, которую уже и нужно подписывать под EF. В этом классе должен быть метод insert ( добавить ) с параметром, тип у которого будет интерфейс обязующий, что в добавляемом классе точно будет метод move.

Добавлено через 26 минут
Код AS3:
package 
{
	public interface IEnterFrame 
	{
		function move():void;
	}
}
Код AS3:
package 
{
	public class SimpleClass implements IEnterFrame 
	{
		public function SimpleClass() { }
		public function move():void { }
	}
}
Код AS3:
package 
{
	import flash.display.Stage;
	import flash.events.Event;
 
	public class EnterFameClass 
	{
		private var _stage:Stage;
		private var _objects:Array = [];
		private var _count:int;
 
		public function EnterFameClass(stage:Stage) 
		{
			_stage = stage;
		}
 
		public function start():void
		{
			_stage.addEventListener(Event.ENTER_FRAME, stage_enterFrameHandler);
		}
 
		public function stop():void
		{
			_stage.removeEventListener(Event.ENTER_FRAME, stage_enterFrameHandler);
		}
 
		public function insert(object:IEnterFrame):void
		{
			if (_objects.indexOf(object) != -1) return;
 
			_objects[_count++] = object;
		}
 
		public function remove(object:IEnterFrame):void
		{
			var index:int = _objects.indexOf(object);
 
			if (index == -1) return;
 
			_objects.splice(index, 1);
 
			_count--;
		}
 
		private function stage_enterFrameHandler(event:Event):void 
		{
			for (var i:int = 0; i < _count; i++) 
			{
				_objects[i].move();
			}
		}
	}
}


Последний раз редактировалось LifeIsRhythm; 28.05.2014 в 14:17.
Старый 28.05.2014, 13:28
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
IEnterFrame
Какое-то не очень название для интерфейса.
Существует негласное (ну или даже не совсем не гласное) правило, что название интерфейса должно быть прилагательным, а название класса существительным в единственном числе
Я бы назвал интерфейс IUpdatable, а в нем бы создал один метод update()

LifeIsRhythm, ваш код не рабочий
Цитата:
Код AS3:
public function insert(object:IEnterFrame):void
		{
			if (_objects.indexOf(object) == -1) return; // никогда не добавит новый объект, так как условие будет всегда выполняться, тут == надо заменить на >
 
			_objects[_count++] = object; // вот тут тоже не понятно, лучше push() использовать. Все равно будет ячейка создаваться 
		}
 
		public function remove(object:IEnterFrame):void
		{
			_objects.splice(_objects.indexOf(object), 1); // если объект отсутствует, в массиве, то он снесет другой, и массив сместится. Нужна проверка, а есть ли такой в массиве, перед тем, как удалять
           // да и _count тогда надо обновить, чего тут не происходит
		}
Цитата:
Если можно в двух словах объясните про контроллеры и вьюшки, или ссылку дайте.
В двух словах это не объяснить. Читайте про шаблоны проектирования. Книг полно. Да и тем тоже
__________________
Ко мне можно и нужно обращаться на ты)

Старый 28.05.2014, 14:18
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 7  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Исправил

Старый 28.05.2014, 14:24
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 8  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Не обязательно иметь ссылку на stage, чтобы слушать enterframe.
Можно создать внутри любой DisplayObject и подписаться на него.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 28.05.2014, 14:30
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 9  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

Регистрация: May 2014
Сообщений: 182
Цитата:
Не обязательно иметь ссылку на stage, чтобы слушать enterframe.
В контексте отдельного класса enterframe, она, как мне кажется, необходима.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
В контексте отдельного класса enterframe, она, как мне кажется, необходима.
Совсем нет. Любой DO может слушать событие ENTER_FRAME
Цитата:
Сообщение от LifeIsRhythm Посмотреть сообщение
Исправил
Этот код все равно будет кишеть ошибками, как говорят американцы the code is error prone.
Переменная _count там вообще нафиг не нужна. Наверняка попадется тот случай, когда она каким-то чудом не будет равна длине массива.
Вместо нее лучше использовать _object.length; (хотя здесь вообще не надо знать длину массива нигде)
А цикл с этого
Код AS3:
for (var i:int = 0; i < _count; i++) 
			{
				_objects[i].move();
			}
заменить на этот
Код AS3:
for (var i:String in _objects) {
     _objects[i].move();
}
__________________
Ко мне можно и нужно обращаться на ты)

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

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

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


 


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


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