Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Библиотеки

Ответ
 
Опции темы
Старый 05.05.2011, 23:58   #1
YellowAfterlife
ПроЭктировщик
 
Аватар для YellowAfterlife
 
Регистрация: 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
  
// Индексы переменных
  
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
В общем, удачной разработки
Если есть какие-то вопросы, спрашивайте.
Вложения
Тип файла: zip YaljTest.zip (26.3 Кб, 764 просмотров)
Тип файла: zip Lib_yalj.zip (1.9 Кб, 748 просмотров)
__________________

Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо YellowAfterlife за это полезное сообщение:
.:MaSe:. (23.07.2014), barsunduk (09.05.2011), cherepets (06.05.2011), DIMMON4IK (07.05.2011), im_zorg (06.05.2011), Nerd (13.05.2011), RblSb (22.07.2014), Romanzes (23.08.2011), scimitar (19.06.2011)
Старый 06.05.2011, 11:54   #2
cherepets
Бывалый
 
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений
(для 215 пользователей)
Ответ: Lib_YALJ :: "Объекты"

Круто. Но я попрежнему предпочитаю создавать массивы int'ов и хранить в них различные индексы для нечисловых значений.
(Offline)
 
Ответить с цитированием
Старый 19.05.2011, 09:58   #3
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений
(для 1,471 пользователей)
Ответ: Lib_YALJ :: "Объекты"

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

(Offline)
 
Ответить с цитированием
Старый 05.06.2011, 20:35   #4
alexprey
ПроЭктировщик
 
Регистрация: 22.10.2010
Сообщений: 196
Написано 16 полезных сообщений
(для 30 пользователей)
Ответ: Lib_YALJ :: "Объекты"

YellowAfterlife, иду тебя ругать!!!! После ресайза объекта сбрасываются все данные, кроме 1 ячейки
__________________
Для меня нет ничего не реального в кодинге, но мне лень
gainOS - прорыв в проектировании ОС на MIDlet Pascal
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com