|
05.05.2011, 23:58
|
#1
|
ПроЭктировщик
Регистрация: 19.02.2011
Сообщений: 134
Написано 81 полезных сообщений (для 219 пользователей)
|
Lib_YALJ :: "Объекты"
В нескольких словах, эта библиотека реализует динамические массивы объектов с свободным количеством переменных разных типов. Она предназначена для использования в играх, но может быть использована и просто как хранилище динамических массивов.
Мотивация:
С одной стороны, MP используется для создания игр. Но, казалось бы, как можно создать игру должного уровня, не имя возможности создавать классы и их экземпляры во время выполнения программы?
После траты некоторого времени на попытки хранить данные игры в длинном массиве (используя существующие библиотеки, реализующие динамические массивы), я пришел к выводу, что это не очень эффективно (и не совсем адекватно).
Поэтому я принял решение написать библиотеку, которая бы позволяла создавать и использовать динамические массивы типа, похожего на стандартный record.
Принцип работы:
Структура переменных этой библиотеки выглядит следующим образом:
Тип -> Объект -> Переменная
Тип: содержит список объектов, контроллирует их появление и уничтожение. У типов нет фиксированого размера - они расширяются автоматически, чтобы вместить предоставленное содержимое.
Объект: "единица" библиотеки, содержащаяся в типе и содержащая в себе число переменных. Изначальное количество переменных, для которых будет выделена память, регулируется типом объекта. При этом объект может содержать число переменных большее или меньшее от "стандартного".
Переменная: непосредственное значение "поля" объекта. Может содержать значения нескольких типов (см. документацию).
Документация (или что-то подозрительно похожее на нее):
{
Lib yalj (YellowAfterlife's objects)
Эта библиотека реализует систему динамически расширяемых типов объектов.
Структура: Тип -> Объект -> Переменные
Тип обьединяет объекты одного рода, так же используется для последуего
быстрого доступа к ним и манипуляций.
Объект - основная единица системы, содержащая любое количество переменных.
Переменная - значение одного из типов, содержащихся в объекте. Одно и то же
поле переменной может содержать разные типы переменных в двух разных
объектах, но при этом, для того чтобы получить значение, ее тип должен быть
известен.
Типы
AddType(Variables: Integer, Count: Integer, Boost: Integer): Integer
Добавляет новый тип. Variables указывает на начальное количество переменных
в объектах этого типа. Count указывает начальное макс. количество объектов
этого типа. Boost указывает значение, на которое при надобности расширяется
макс. количество (за раз). Возращает индекс созданного типа.
MakeTypes(Number: Integer): Integer
Ре-инициализирует систему на указанное потенциальное количество типов.
Рекомендуется использовать эту функцию в начале работы программы, чтобы
задать потенциальное количество типов объектов. При вызове этой процедуры
все текущие типы удаляются.
RemoveType(Type: Integer)
Удаляет указанный тип объекта, и все принадлежащие ему объекты. После этого
этот индекс типа может занять другой тип объекта.
ResizeType(Type: Integer, Count: Integer)
Меняет максимальный размер типа, удаляя объекты за диапазоном, если размер
меньше текущего.
TypeLength(Type: Integer)
Возращает длину (макс. количество) обьъектов указанного типа.
TypeCount(Type: Integer)
Подсчитывает количество существующих (созданных) объектов указанного типа.
Объекты
AddObject(Type: Integer): Integer
Добавляет новый объект указанного типа, или 0 если тип не существует.
RemoveObject(Type: Integer, Object: Integer)
Удаляет указанный объект, освобождая занятую им память.
ObjectFirst(Type: Integer): Integer
Возращает первый существующий объект указанного типа либо 0 (нет объекта).
ObjectNext(Type: Integer, Object: Integer): Integer
Возращает следующий после указанного существующий объект, или 0 если
объект был последний в списке. Вместе с предыдущей функцией позволяет
делать что-то подобное For each(...).
ObjectExists(Type: Integer, Object: Integer): Integer
Возращает, существует ли объект с указанным индексом.
ResizeObject(Type: Integer, Object: Integer, Variables: Integer)
Меняет макс. количество переменных в объекте, стирая часть из них, если
размер меньше текущего.
Переменные
ObjectVarExists(Type: Integer, Object: Integer, Var: Integer): Integer
Возращает, установлено ли значение переменной в указанном объекте (1\0)
ObjectVarDelete(Type: Integer, Object: Integer, Var: Integer)
Удаляет значение переменной из указанного объекта
ObjectSet*(Type: Integer, Object: Integer, Var: Integer, Value: &)
Устанавливает переменную указанного типа.
ObjectGet*(Type: Integer, Object: Integer, Var: Integer): &
Возращает значение переменной указанного типа, или нулевое значение если
переменная имеет другой тип или не существует.
Поддерживаемые типы переменных
*Хранимый тип &Передаваемый тип %Описание
Bool Integer (1\0) Логический тип [True\False]
Int Integer Обычный целочисленный тип.
Byte Integer (0..255) Короткий целочисленный тип [0..255]
Char Char\String Один символ ASCII
String Char\String Строка
Image Image Изображение
Пример: ObjectSetInt(MyType, MyObject, MyVar, Value)
или ObjectSetImage(MyType, MyObject, 0, LoadImage('/icon.png'))
или X := ObjectGetInt(MyType, MyObject, 1)
}
Пример использования:
program YaljTest; uses yalj; const // Индексы переменных x = 0; y = 1; hspeed = 2; vspeed = 3; var icon: integer; i, j, t: integer; img: image; procedure AddRandomIcon; begin j := AddObject(icon); ObjectSetInt(icon, j, x, Random(GetWidth)); ObjectSetInt(icon, j, y, Random(GetHeight)); ObjectSetInt(icon, j, hspeed, Random(5)-2); ObjectSetInt(icon, j, vspeed, Random(5)-2) end; begin img := LoadImage('/icon.png'); icon := AddType(4, 16, 1); // 4 переменных, 16 объектов изначально, +1 прирост t := GetRelativeTimeMs; for i := 1 to 16 do AddRandomIcon; repeat SetColor(0, 0, 0); FillRect(0, 0, GetWidth, GetHeight); if GetKeyPressed <> 0 then AddRandomIcon; i := ObjectFirst(icon); repeat DrawImage(img, ObjectGetInt(icon, i, x)-8, ObjectGetInt(icon, i, y)-8); // Передвигаем по X, цикл вокруг экрана j := ObjectGetInt(icon, i, x); j := j + ObjectGetInt(icon, i, hspeed); while j < -8 do j := j + GetWidth + 16; while j > GetWidth + 8 do j := j - GetWidth - 16; ObjectSetInt(icon, i, x, j); // Аналогично для Y: j := ObjectGetInt(icon, i, y); j := j + ObjectGetInt(icon, i, vspeed); while j < -8 do j := j + GetHeight + 16; while j > GetHeight + 8 do j := j - GetHeight - 16; ObjectSetInt(icon, i, y, j); // След. объект: i := ObjectNext(icon, i); until i = 0; SetColor(255, 0, 0); DrawText('Time: ' + (GetRelativeTimeMs - t) + 'ms', 0, 0); t := GetRelativeTimeMs; RePaint; until false; end.
В общем, удачной разработки
Если есть какие-то вопросы, спрашивайте.
__________________
Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
|
(Offline)
|
|
Эти 9 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
|
|
06.05.2011, 11:54
|
#2
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Lib_YALJ :: "Объекты"
Круто. Но я попрежнему предпочитаю создавать массивы int'ов и хранить в них различные индексы для нечисловых значений.
|
(Offline)
|
|
19.05.2011, 09:58
|
#3
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Lib_YALJ :: "Объекты"
Автор, умоляю, реализуй сортировку или выложи исходник либы.
|
(Offline)
|
|
05.06.2011, 20:35
|
#4
|
ПроЭктировщик
Регистрация: 22.10.2010
Сообщений: 196
Написано 16 полезных сообщений (для 30 пользователей)
|
Ответ: Lib_YALJ :: "Объекты"
YellowAfterlife, иду тебя ругать!!!! После ресайза объекта сбрасываются все данные, кроме 1 ячейки
__________________
Для меня нет ничего не реального в кодинге, но мне лень
gainOS - прорыв в проектировании ОС на MIDlet Pascal
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:59.
|