forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=124)
-   -   Lib_YALJ :: "Объекты" (http://forum.boolean.name/showthread.php?t=14674)

YellowAfterlife 05.05.2011 23:58

Lib_YALJ :: "Объекты"
 
Вложений: 2
В нескольких словах, эта библиотека реализует динамические массивы объектов с свободным количеством переменных разных типов. Она предназначена для использования в играх, но может быть использована и просто как хранилище динамических массивов.

Мотивация:
С одной стороны, 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)
}


Пример использования:
PHP код:

program YaljTest;
uses yalj;
const
  
// Индексы переменных
  
0;
  
1;
  
hspeed 2;
  
vspeed 3;
var
  
iconinteger;
  
ijtinteger;
  
imgimage;
procedure AddRandomIcon;
begin
  j 
:= AddObject(icon);
  
ObjectSetInt(iconjxRandom(GetWidth));
  
ObjectSetInt(iconjyRandom(GetHeight));
  
ObjectSetInt(iconjhspeedRandom(5)-2);
  
ObjectSetInt(iconjvspeedRandom(5)-2)
end;
begin
  img 
:= LoadImage('/icon.png');
  
icon := AddType(4161); // 4 переменных, 16 объектов изначально, +1 прирост
  
:= GetRelativeTimeMs;
  for 
:= 1 to 16 do AddRandomIcon;
  
repeat
    SetColor
(000);
    
FillRect(00GetWidthGetHeight);
    if 
GetKeyPressed <> 0 then AddRandomIcon;
    
:= ObjectFirst(icon);
    
repeat
      DrawImage
(imgObjectGetInt(iconix)-8ObjectGetInt(iconiy)-8);
      
// Передвигаем по X, цикл вокруг экрана
      
:= ObjectGetInt(iconix);
      
:= ObjectGetInt(iconihspeed);
      while 
< -do := GetWidth 16;
      while 
GetWidth do := GetWidth 16;
      
ObjectSetInt(iconixj);
      
// Аналогично для Y:
      
:= ObjectGetInt(iconiy);
      
:= ObjectGetInt(iconivspeed);
      while 
< -do := GetHeight 16;
      while 
GetHeight do := GetHeight 16;
      
ObjectSetInt(iconiyj);
      
// След. объект:
      
:= ObjectNext(iconi);
    
until i 0;
    
SetColor(25500);
    
DrawText('Time: ' + (GetRelativeTimeMs t) + 'ms'00);
    
:= GetRelativeTimeMs;
    
RePaint;
  
until false;
end

В общем, удачной разработки :)
Если есть какие-то вопросы, спрашивайте.

cherepets 06.05.2011 11:54

Ответ: Lib_YALJ :: "Объекты"
 
Круто. Но я попрежнему предпочитаю создавать массивы int'ов и хранить в них различные индексы для нечисловых значений.

Nerd 19.05.2011 09:58

Ответ: Lib_YALJ :: "Объекты"
 
Автор, умоляю, реализуй сортировку или выложи исходник либы.

alexprey 05.06.2011 20:35

Ответ: Lib_YALJ :: "Объекты"
 
YellowAfterlife, иду тебя ругать!!!! После ресайза объекта сбрасываются все данные, кроме 1 ячейки


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot