Пятница, 19 Апреля 2024, 22:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Структура для хранения данных
Структура для хранения данных
AGENTX001Дата: Четверг, 12 Июля 2012, 17:49 | Сообщение # 1
почётный гцупер
Сейчас нет на сайте
Привет=) Собственно возник такой вопрос - а есть ли в дельфине структура для хранения данных, индексируя их строками?
Что-то вроде:
Code

var
   myweapon : string = 'ak47';

...

Procedure Render();
begin
...
   DrawSprite(Hero {: TSprite2D} );
   DrawSprite(Array(myweapon {: string} ) {: TSprite2D} );
end;

Надеюсь идея понятна?)


Сообщение отредактировал AGENTX001 - Четверг, 12 Июля 2012, 17:49
VinchensooДата: Четверг, 12 Июля 2012, 17:49 | Сообщение # 2
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Quote (AGENTX001)
Надеюсь идея понятна?)

Нет. Ассоциативный массив что ли?


AGENTX001Дата: Четверг, 12 Июля 2012, 17:50 | Сообщение # 3
почётный гцупер
Сейчас нет на сайте
Vinchensoo, нет, массив, в котором в качестве индекса можно давать строку))
RUNGOGET2THECHOPAHДата: Четверг, 12 Июля 2012, 17:52 | Сообщение # 4
участник
Сейчас нет на сайте
Гугли Хэш-таблицы.
ArchidoДата: Четверг, 12 Июля 2012, 17:57 | Сообщение # 5
Сэнсэй
Сейчас нет на сайте
Quote (RUNGOGET2THECHOPAH)
нет, массив, в котором в качестве индекса можно давать строку))

Это и есть ассоциативный массив, у тебя просто частный случай. Там же на вики есть пример для Delphi.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
AGENTX001Дата: Четверг, 12 Июля 2012, 21:46 | Сообщение # 6
почётный гцупер
Сейчас нет на сайте
Archido, о, именно он, спасибо))

Добавлено (12.07.2012, 21:46)
---------------------------------------------
А кто-нибудь подскажет статический и кроссплатформенный ассоциативный массив для фри паскаль? А то стандартный на виджетах построен, да и использует ооп...

StageДата: Пятница, 13 Июля 2012, 02:18 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
Вся суть пацанов с gcup. С пеной у рта будут защищать %language_name%, ничего не зная даже о таком примитиве, как обычный словарь.
TimKruzДата: Пятница, 13 Июля 2012, 18:31 | Сообщение # 8
старожил
Сейчас нет на сайте
Quote (AGENTX001)
А кто-нибудь подскажет статический и кроссплатформенный ассоциативный массив для фри паскаль?

Попробуй написать свой, если без него никак не можешь. Используй запись с полями "имя" и "данные", сделай динамический список этих записей, добавление и удаление в него. Ну а функция getbyname(text:string):data будет перебирать список, ища подходящую запись с соответствующей строкой.
Но хранить имя строкой отдельно от данных и искать по имени нерационально... Зачем тебе называть каждый спрайт (tsprite2d) по имени?
Quote (AGENTX001)
да и использует ооп

Чем тебя ООП пугает? Объекты использовать удобно.


AGENTX001Дата: Суббота, 14 Июля 2012, 17:12 | Сообщение # 9
почётный гцупер
Сейчас нет на сайте
to TimKruz: спасибо зо объяснение принципов) называю каждый спрайт строкой так-как это удобно) у меня простенькая 2д игрушка, за быстродействием гнаться нет смысла)
RUNGOGET2THECHOPAHДата: Суббота, 14 Июля 2012, 17:42 | Сообщение # 10
участник
Сейчас нет на сайте
Зря ты так про быстродействие. Искать тупым перебором, имея в качестве ключа строку, очень "неоптимально". Попробуй хотя бы их расположить в лексикографическом порядке (как в словаре), чтобы можно было обращаться за логарифмическое время (бинарным поиском), а не линейное.
ArchidoДата: Суббота, 14 Июля 2012, 18:18 | Сообщение # 11
Сэнсэй
Сейчас нет на сайте
Кстати да, чтобы сортануть TStringList достаточно сделать ему Sorted := true; Только вот, обращаясь к массиву как TStringList.Values[...] бинарного поиска не будет скорее всего, придеться юзать TStringList.Find (...). Ну или унаследоваться и дописать, что нужно smile

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
TimKruzДата: Суббота, 14 Июля 2012, 18:27 | Сообщение # 12
старожил
Сейчас нет на сайте
Quote (AGENTX001)
за быстродействием гнаться нет смысла)

Ну тут не только быстродействие, тут ещё и затраты памяти. Хранить лишние строки... Да и поиск долгий, вместо прямого обращения по ссылке. В любой самой маленькой игре нужно следить за всем. Понятно, что владельцы 8-ядерных монстров с 20 ГБ оперативной памяти и 4-мя видеокартами на борту не заметят разницы, но они и играют в более мощные игры, а вот владельцы старых компьютеров почувствуют разницу. К тому же, следя за быстродействием и расходом памяти приучаешь себя делать так всегда, а это что-то да значит...
Можешь вместо строк использовать ID (просто по номеру) и константы, как-то так:
Code
const
   //ID в банке спрайтов всегда фиксированный,
   //а константы - чтобы не забыть ID конкретного спрайта
   spr_earth=0; //кусок карты, например
   spr_grass=1; //тоже кусок карты
   spr_ak47=47; //предмет
   spr_hero=100; //первый кадр, если анимация - spr_hero+№кадра
   spr_car_01=125; //авто
var
   SpriteBank:array of TSprite2D;
   //динамический массив, перед загрузкой спрайтов устанавливаешь размер,
   //перед выходом высвобождаешь память
procedure DrawMap;
begin
   DrawSprite(SpriteBank[spr_ak47],10,10,0); //спрайт, x, y, угол и т.п.
   DrawSprite(SpriteBank[spr_hero],100,40,90);
end;

Имя константы не занимает места в программе (компилятор заменяет её конкретным значением), а по названию легче понять, какой смысл она несёт.
Ну это один из способов хранения спрайтов, так-то можно по-разному сделать...


masb8ly-GCДата: Воскресенье, 15 Июля 2012, 09:04 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
TimKruz, владельцы 8-ми ядерных процов не играют в более мощные игры)
Просто 8-ми ядерные AMD греются просто ужасно при сильных нагрузках... Вообще не понимаю смысла в них. Мне 6-ти ядерного Intel'а Extreme серии хватает с головой, правда он и стоит в 4 раза дороже, но он и производительное в 4 раза)
Фиксированный ID это хорошо можно например просто создать ассоциативный массив в отдельном файле в котором ID'шником будет номер строки, тогда обращение к строке будет элементарным, хранить все в файле с кодом в виде константы не очень хорошо и удобно. Можно создать, что-то вроде associative.mas и потом вшить его в DLL или в EXE и обращаться уже по внутреннему адресу


Backend Developer ESIS
Client Side Developer Room8Studio
Technical Leader Lucid Reality Labs
Chief Technology Officer The Intruders
Chief Technology Officer RoyalePlay Games
AGENTX001Дата: Понедельник, 16 Июля 2012, 12:29 | Сообщение # 14
почётный гцупер
Сейчас нет на сайте
TimKruz, просто, я чё по строкам хотел, хотелось бы информацию об оружии (и других вещах) хранить отдельно (в ИНИ).
TimKruzДата: Понедельник, 16 Июля 2012, 12:35 | Сообщение # 15
старожил
Сейчас нет на сайте
Quote (AGENTX001)
хотелось бы информацию об оружии (и других вещах) хранить отдельно (в ИНИ).

Ну так и храни информацию в ini, если хочешь... wacko Какая связь между ассоциативными массивами со спрайтами и информацией о вещах в ini?


Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Структура для хранения данных
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг