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

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

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

Регистрация: Apr 2010
Сообщений: 137
По умолчанию Хранение итемов

Мучает вопрос уже очень долго время, всегда делал одним способом, но он начал надоедать.
Если у игрока может быть разное оружие, например пистолеты, то как их хранить у себя в игре? Как их получать? Конкретнее. Каждое оружие выглядит по своему. Вот в библиотеке есть мувики McPistol1, McPistol2, и есть класс Pistol. В классе Pistol есть, например, _id, _mc, _damage, и разных пистолетов около 100. Я раньше делал константу, COUNT = 100, а далее, чтобы получить пистолет:
Код AS3:
public static function getItem(_id:uint):Pistol {
   var _ret:Pistol = new Pistol();
   switch (_id) {
      case 1:
         _ret._mc = new McPistol1();
         _ret._damage = 10;
         break;
      case 2:
         _ret._mc = new McPistol2();
         _ret._damage = 15;
         break;
   }
   _ret._id = _id;
   return _ret;
}
Но добавляя новый пистолет, нужно константу увеличить, а потом есть в switch новый case добавить. Ну как-то не нравится, и я думаю есть способы лучше. В моем случае была разница только в _mc, поэтому попробовал сделать так:
getDefinitionByName("McPistol" + String(_id));
но понятное дело он мне ошибку, так как то, что я просил, не было вкомпилино во флешку, так как не юзается в коде нигде. Как тогда быть? Надеюсь вопрос понятно поставил).

Старый 14.01.2015, 05:24
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 2  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
Цитата:
не юзается в коде нигде
Просто явно вызвать. Например в классе сразу после импортов написать:
Код AS3:
McPistol1;
McPistol2;
В этом случае эти два класса буду включены в swf.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А зачем каждый раз создавать новый пистолет?
То есть в игре нет какого-то магазина, где представлены все виды оружия?
Я обычно делаю так: просто храню в массиве уже созданные экземпляры каждого вида оружия. Они отображаются в магазине, и они же используются в игре. За исключением тех случаев, когда надо больше одного экземпляра.
Кто-то может сказать, что это бесполезный расход памяти, но на самом деле у этого подхода есть плюсы. Которые особенно заметны, если писать под мобилу, где при создании нового экземпляра часто игра подвисает. Поэтому принял решение создавать все, что нужно сразу. А нужный образец потом гораздо проще дернуть из массива. Каким-нибудь методом с простым перебором
Код AS3:
private var _pistols:Array = [new Pistol1(), new Pistol2(), new Pistol3()];
 
private function getPistolByID(id:int):Pistol {
   for each (var pistol:Pistol in _pistols) {
      if (pistol.id == id) return pistol;
   } 
   return null;
}

Старый 14.01.2015, 09:42
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 4  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
если в swc компильнуть пистолеты и подключить то классы все равно видно не будет?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
если в swc компильнуть пистолеты и подключить то классы все равно видно не будет?
Если они нигде не упомянуты, то по умолчанию они не вкомпилируются, не важно в swc они или в открытом виде

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

Регистрация: Apr 2010
Сообщений: 137
Цитата:
Сообщение от caseyryan Посмотреть сообщение
А зачем каждый раз создавать новый пистолет?
То есть в игре нет какого-то магазина, где представлены все виды оружия?
Я обычно делаю так: просто храню в массиве уже созданные экземпляры каждого вида оружия. Они отображаются в магазине, и они же используются в игре. За исключением тех случаев, когда надо больше одного экземпляра.
Кто-то может сказать, что это бесполезный расход памяти, но на самом деле у этого подхода есть плюсы. Которые особенно заметны, если писать под мобилу, где при создании нового экземпляра часто игра подвисает. Поэтому принял решение создавать все, что нужно сразу. А нужный образец потом гораздо проще дернуть из массива. Каким-нибудь методом с простым перебором
Код AS3:
private var _pistols:Array = [new Pistol1(), new Pistol2(), new Pistol3()];
 
private function getPistolByID(id:int):Pistol {
   for each (var pistol:Pistol in _pistols) {
      if (pistol.id == id) return pistol;
   } 
   return null;
}
Ну вот именно таким я не хочу заниматься
new Pistol1(), new Pistol2(), new Pistol3()
т.е. приходится вручную каждый итем вызывать. Думал может есть способ какой, чтобы если я добавлю новое оружие в ту же библиотеку swc например, то на этом вся моя работа и заканчивалась бы. Т.е. перебираю все возможные мувики в библиотеке, которые называются по правилу "Pistol" + _id, и увеличиваю счетчик до тех пор, пока такие мувики находятся, а когда не находятся, то всё, значит у меня _i итемов, и я не объявлял каждый отдельно, могу получить их по _id. Ну как и говорил, этот метод из-за getDefinitionByName не работает, в любом случае потом приходится писать Pistol1, Pistol2 чтобы компилятор их учел.
Ну раз я не один такой, кто так же методом перебора всех существующих итемов делает, то ладно)

Старый 14.01.2015, 20:33
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 7  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
TurboDizel, у компилятора есть опция -include-libraries
http://help.adobe.com/en_US/flex/usi...9084-7a92.html

в fd во вкладке Сompiler Options называется SWC Include Libraries, там просто прописываешь lib/lib.swc
во flash ide хз, не юзаю

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

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
Подумай над такой идеей, если все пистолеты запихать в один мувик, в разные кадры, вызываешь один мувик пистолет, и потом переключаешь на какой кадр тебе нужно, по сути там не чего сложного нет.
__________________
Книги и желание лучшие учителя.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Ну вот именно таким я не хочу заниматься
Это был просто пример. Если действительно надо автоматом, то сначала как сказал nubideus, а потом
Цитата:
по правилу "Pistol" + _id

Старый 16.01.2015, 22:43
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 10  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
в flash ide если вариантов нет можно юзануть jsfl
Код:
fl.getDocumentDOM().getTimeline().layers[0].frames[0].actionScript = 'stop();';
http://help.adobe.com/en_US/flash/cs..._extending.pdf

но там еще понять надо как отследить добавление клипа в библиотеку.
может быть переопределить методы library.*Item или еще как то

как отследить компиляцию тоже не видать поиском

можно даже файл внешний создать > Chapter 18: FLfile object

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

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

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


 


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


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