Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 21:50   #1
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию Нетипизированные файлы

Скажите пожалуйста, как использовать нетипизированные файлы в игре? Дело в том, что у меня массив уровня динамичен, а также, динамичны еще некоторые переменные, загружаемые из файла. Плюс ко всему, загружается из файла у меня несколько массивов: один из них - с текстурами, другой - с проходимостью и т.д. И таких массивов не 2, а чуть больше, поэтому хранить их все в текстовом файле было бы глупо (я так поdoomал), потому что скорость считывания заметно снизится, ведь придется проходить по одному и тому же циклу несколько раз (массивы в текстовом файле, ведь, будут храниться друг за другом).

Поэтому нужно какое-то другое решение. Кто-то подсказал мне про использование нетипизированных файлов, а как ими пользоваться, я нигде не нашел. Вернее, нашел парочку примеров, но суть их так и не познал. Поэтому, если кто знает суть, то скажите, пожалуйста.
ZotaC вне форума Ответить с цитированием
Старый 22.01.2010, 22:38   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Скажите, сколько времени проходит между считыванием и сохранением данных в один и тот же файл?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.01.2010, 23:04   #3
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Я не уверен, что правильно понял вопрос, но вот считывание данных из файла происходит в начале игры, а в самой игре данные туда не записываются. Запись происходит в редакторе (как и считывание, впрочем, тоже)
ZotaC вне форума Ответить с цитированием
Старый 22.01.2010, 23:49   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Соседняя тема "Чтение и запись карты", ...посмотрите, может это ищется.
Почему спросил про время? ...как правило даже в игре, все манипуляции с данными происходят в оперативной памяти, сохраняются они в некоторый ответственный момент, например, при получении важных параметров, уровня, новых предметов и пр. Это идет отдельной процедурой, в которой по порядку записываются данные в кодированном виде, ...чаще всего типа Byte. Выглядит запись как последовательность символов, все в одну строчку.
Аналогично со считыванием, вначале открывается файл, затем посредством циклов считываются байты данных, ...где какой определить не сложно если имеется четкий шаблон.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.01.2010, 02:32   #5
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Соседняя тема "Чтение и запись карты", ...посмотрите, может это ищется.
Нет, ищется совсем не это. Дело в том, что у меня в игре многие массивы динамичны, а я слышал, что динамические массивы можно записывать только в нетипизированные файлы. В той же теме разговор шел только про типизированные.

Как бы то ни было, поразбирался с нетипизированными файлами на пустом проекте и вот, что получилось:

Код:
var
  Form1: TForm1;
  Map: Array [0..10, 0..10] of Char;
  Textures: Array [0..1] of TBitmap;
  Buf: TBitmap;
  TexNum: Char;
  File: File;
implementation

{$R *.dfm}

//Сохранение
Procedure Save();
var
  i: Byte;
begin
  Rewrite(File);
  for i := 0 to 10 do
    BlockWrite(File, Map[i], 11);
  CloseFile(File);
end;

//Загрузка
Procedure Load();
var
  i: Byte;
begin
  Reset(File);
  for i := 0 to 10 do
    BlockRead(File, Map[i], 11);
  CloseFile(File);
end;

//Загрузка формы
procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Byte;
begin
  for i := 0 to 1 do begin
    Textures[i] := TBitmap.Create;
    Textures[i].LoadFromFile(IntToStr(i) + '.bmp');
  end;
  Buf := TBitmap.Create;
  Buf.Width := Form1.Width;
  Buf.Height := Form1.Height;
  TexNum := '0';
  AssignFile(File, 'My.map');
  for i := 0 to 10 do begin
    for j := 0 to 10 do begin
      Map[j, i] := '0';
    end;
  end;
end;

//Закрытие формы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i: Byte;
begin
  for i := 0 to 1 do
    Textures[i].Free;
  Buf.Free;
end;

//Нажатие кнопок на форме (83 = S, 76 = L, 49 = 1, 50 = 2)
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    83: Save();
    76: Load();
    49: TexNum := '0';
    50: TexNum := '1';
  end;
end;

//Рисование текстур
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (X < 550) and (X > 0) and (Y < 550) and (Y > 0) then
    Map[Round(X / 50), Round(Y / 50)] := TexNum;
end;

//Рисование кадров
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, j: Byte;
begin
  for i := 0 to 10 do begin
    for j := 0 to 10 do begin
      case Map[j, i] of
        '0': Buf.Canvas.Draw(j * 50, i * 50, Textures[0]);
        '1': Buf.Canvas.Draw(j * 50, i * 50, Textures[1]);
      end;
    end;
  end;
  Form1.Canvas.Draw(0, 0, Buf);
end;
Где-то здесь есть ошибка, и, я думаю, что она возникает из-за загрузки или сохранения карты, но вот где она - понять не могу. Программа просто зависает и все.

Последний раз редактировалось ZotaC; 25.01.2010 в 02:36.
ZotaC вне форума Ответить с цитированием
Старый 25.01.2010, 11:14   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Господи...с этими нетипизированными файлами..
поищите примеры на основе TFileStream
там только изменить команды...а принципы те же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.01.2010, 15:34   #7
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

ZotaC, у меня тоже динамические массивы, только не Array [0..10, 0..10] of Char, а самые настоящие динамические PChar или array of array of Byte, вот уж где неизвестен размер, но это не мешает мне сохранять в File Of Byte так как мне вздумается. Файл без заголовка - ущербная куча байт, ...пересмотрите момент сохранения и загрузки, возможно вы пока не понимаете все прелести данного метода.
Записывая код:
Код:
 for i := 0 to 10 do
    BlockRead(File, Map[i], 11);
...вы обрекаете программу на статику, при которой чуть измененные размеры карты уже не будут загружаться без вмешательства в код. Подумайте, ...или опишите характер игры, будут ли большие карты, или есть стандарт, ...судя по записи Array [0..10, 0..10] of Char - стандарт есть, и, следовательно, достаточно простого File Of Byte.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.01.2010, 15:59   #8
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Beermonza, приведенный выше код - всего лишь попытка разобраться с нетипизированными файлами, то есть никакого отношения к игре он не имеет. А в самой игре у меня массивы тоже самые настоящие и динамические - Array of Array of Char. Карты там могут быть как маленькие, так и большие, то есть, если я захочу, то могу (без вмешательства в код) ставить и карту 3х3, и 200х200.

Почему же все утверждают, что здесь нужны нетипизированные файлы, если достаточно, как вы говорите, простого File of Byte? И, если это не принципиально, какой файл использовать, то тогда каков принцип сохранения в File of Byte?
ZotaC вне форума Ответить с цитированием
Старый 25.01.2010, 17:08   #9
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от ZotaC Посмотреть сообщение
Beermonza, приведенный выше код - всего лишь попытка разобраться с нетипизированными файлами, то есть никакого отношения к игре он не имеет. А в самой игре у меня массивы тоже самые настоящие и динамические - Array of Array of Char. Карты там могут быть как маленькие, так и большие, то есть, если я захочу, то могу (без вмешательства в код) ставить и карту 3х3, и 200х200.

Почему же все утверждают, что здесь нужны нетипизированные файлы, если достаточно, как вы говорите, простого File of Byte? И, если это не принципиально, какой файл использовать, то тогда каков принцип сохранения в File of Byte?
Файл все равно состоит из последовательности байт, ничто не мешает мне в него записывать любые данные, хоть строковые, хоть числовые. В конечном счете шаблон на карту все же есть, без этого никак, а раз есть шаблон, значит есть и заголовок, в котором все данные карты, после которого идет блок данных, определенной в заголовке длины, или последовательность блоков.
Сохранение как и считывание идет либо до, либо после игры, где мгновенной работы не требуется, посему все последовательно, байт за байтом.
Напишите по порядку какие типы данных сохраняются/загружаются в/из файла. Проанализируйте, и увидите статичный шаблон, "правило", по которому файл карты может открывать только ваша программа.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.01.2010, 18:57   #10
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Ладно, вот я решил взять File of Byte. Тогда такой вопрос: массив карты у меня типа Char, и при чтении из файла он выдает ошибку: 'Incompatible types: 'Byte' and 'Char''. Тогда у меня возникает предположение, что в этот файл он после каждой записи пишет еще и какой-то разделитель. Так ли это? И если так, то можно ли использовать тип Integer в массиве (при том, что количество текстур у меня превышает 10 штук)?
ZotaC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
НЕТИПИЗИРОВАННЫЕ Файлы Doholyan Паскаль, Turbo Pascal, PascalABC.NET 6 01.08.2009 23:26
типизированные и нетипизированные файлы andrey4623 Общие вопросы Delphi 1 28.12.2007 19:09
ПОМОГИТЕ!! Типизированные и нетипизированные файлы. Zebo Помощь студентам 1 08.06.2007 09:35