Итератор |
Сколько ж ограничений в UnrealScript!
Вот, оказывается свой итератор нельзя объявить. Функция-итератор должна быть нативной. Нативную функцию можно объявить только в нативном классе. А нативный класс просто нельзя объявлять...
Но я это обошел.
Создаем функцию, подобную итератору, например:
function RPGInvActor(class<Inventory> BaseClass, out Inventory Inv)
Она подобна итератору:
native final iterator function InventoryActors( class<Inventory> BaseClass, out Inventory Inv );
из класса InventoryManager. Единственное условие - в Inv должна вернуть None, если не нашла.
Теперь вместо foreach используем:
do
{
...
} until( Inv != None);
Естестсвенно RPGInvActor должна при каждом вызове возвращать следующее значение. Этого можно достичь введя переменную в классе, которая сохраняет предыдущее найденное значение:
var Inventory InvCash; //Для итератора
И использовать ее для нахождения следующего айтема в списке для поиска...
Для чего мне все это понадобилось? Для своей реализации инвентаря.
Инвентарь у Эпиков представляет собой обычный односвязный список. Естественно поиск в нем не быстр, естественно Инвентаря в нем много хранить нельзя (Эпики об этом прямо пишут). Более того, хоть это и возможно принципиально, но у Эпиков в инвентарь нельзя добавлять одинаковые предметы.
Ну а в ролевых играх в рюкзаке у героя очень много предметов, очень много одинаковых...
Как это реализовать? - сделать свою структуру для инвентаря. Я сделал комбинированную.
Есть динамический массив, элементы которого - первые элементы в связанных списках. Тип элемента в массиве повторяться не может. А вот в списке, на который указывает элемент массива как раз наоборот - все элементы одного типа.
Рубрики: | 3ds/UDK |
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |