[Вопрос] Запрет ношения предметов одинакового класса/типа
|
|
FatalBlade | Дата: Вторник, 20 Сентября 2011, 21:10:40 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| У меня работает в карте такая система, что если герой поднимает или покупает предмет, который у него уже есть в инвентаре, то он его выбросит на землю. Типа запрет на ношение одинаковых предметов. Позже я переделал это систему, и теперь она даёт запрет не только на одинаковые предметы, но и не одинаковый класс предметов (не считая Charged). Например герой не может носить 2 шлема, 2 оружия, 2 брони.... То есть для каждого поднятого предмета проверяется его Item Class, и айтем классы других предметов в инвентаре, и если они совпадают, то предмет выброситься на землю. Это очень простой триггер, но в нём куча ифзенов, что не очень хорошо. Как это сделать без ифзенов или циклов?
|
|
|
|
Faion | Дата: Среда, 21 Сентября 2011, 01:17:05 | Сообщение # 2 |
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
| Никак. Бтв, циклы и if\then\else не жрут по сути ничего, жрет содержание. В данном случае проверки пустяковые, в них не создаются объекты и тд, просто проверка типа данных. В общем не стоит пытаться создавать велосипед.
Максимум что можно сделать, описать весь алгоритм без цикла, будет самую малость быстрее, но кода писать тонну, так что не вижу смысла=)
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
|
|
|
|
FkoFF | Дата: Среда, 21 Сентября 2011, 08:11:33 | Сообщение # 3 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Faion, я полагаю у него ифзены и циклы не только с проверкой инвентаря но и с принадлежностью каждого класса (через цикл).
т.е внутри класса = 20 предметов, значит цикл будет состоять из 5*20 сравнений.. и да, это нагружает не слабо, учитывая что циклы скорее всего тоже гуевые.
|
|
|
|
FatalBlade | Дата: Среда, 21 Сентября 2011, 09:08:24 | Сообщение # 4 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Quote (Faion) Никак. Бтв, циклы и if\then\else не жрут по сути ничего, жрет содержание. В данном случае проверки пустяковые, в них не создаются объекты и тд, просто проверка типа данных. В общем не стоит пытаться создавать велосипед.
Максимум что можно сделать, описать весь алгоритм без цикла, будет самую малость быстрее, но кода писать тонну, так что не вижу смысла=) Я точно помню кто то на этом форуме писал что у него есть такая наработка, и сделана она с помощью Хэша. Если я правильно понял, то там только 1 ифзен! У меня так и сделано как ты предложил, и это работает, но представь себе что будет если в карту будут играть 10 человек, и некоторых компы могут быть слабее чем у меня... При каждом событие "Юнит приобрёл предмет" будут запускаться куча ифзенов...
Добавлено (21 Сентябрь 2011, 08:25:29) --------------------------------------------- Quote (FkoFF) Faion, я полагаю у него ифзены и циклы не только с проверкой инвентаря но и с принадлежностью каждого класса (через цикл).
т.е внутри класса = 20 предметов, значит цикл будет состоять из 5*20 сравнений.. и да, это нагружает не слабо, учитывая что циклы скорее всего тоже гуевые. Нет нет, у меня без циклов. У меня сверяются все слоты друг с другом, если есть в них предметы одинакового класса. То есть (5+4+3+2+1)*5 = 75 сравнений. Это меньше чем ты написал, но тоже очень много...
Это ещё после того как я немного оптимизировал этот код. Когда я сделал это на ГУИ и перевёл в код я вообще ужаснулся. Там кроме функции для каждого ифзена, были ещё и функции для получения класса предмета в каждом слоте. Причём для КАЖДОГО сравнения по 2 функции. Например если сравниваются слоты 1 и 2, то создаётся функция для получения класса предмета из слота 1, и ещё одна функция для получения класса предмета из слота 2. И потом они сравнивались. То есть если сравнений 15, то функций 30. А ведь эти 15 сравнений происходят 5 раз, то есть сравнений всего 75, а значит функции запускаются 150 раз!!!! И всё это при событии EVENT_PLAYER_UNIT_PICKUP_ITEM.
Сообщение отредактировал FatalBlade - Среда, 21 Сентября 2011, 09:32:32 |
|
|
|
FkoFF | Дата: Среда, 21 Сентября 2011, 16:32:29 | Сообщение # 5 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (FatalBlade) Нет нет, у меня без циклов. У меня сверяются все слоты друг с другом, если есть в них предметы одинакового класса. То есть (5+4+3+2+1)*5 = 75 сравнений. Это меньше чем ты написал, но тоже очень много... Зачем это делается? Если бы я делал - ифзен срабатывал бы 6 раз, ровно столько, сколько и требуется.
|
|
|
|