Сейчас 21:47:32 Четверг, 28 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Запрет ношения предметов одинакового класса/типа
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 раз, ровно столько, сколько и требуется.


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz