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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2010, 20:34   #11
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Тип Byte - это значения от 0 до 255, вы можете записать в один байт одну из 256 разновидности текстур. Достаточно выполнить Ord('t') и у вас в руках ее код 116, нужно обратно? ...пишем Chr(116), в руках символ 't', ищем текстуру в каталоге t.bmp или что там у вас. А можно текстуры так и оставить в коде 116.bmp, и ничего делать больше не потребуется.
Вот у вас один блок данных - это поверхность на весь массив, вы знаете, что на одну текстуру приходится по 1-му байту, ...делаем в процедуре считывания цикл второго порядка, по-X и по-Y, начало отсчета пусть 1, конец MaxX и MaxY, их вы получили из заголовка. Цикл прошелся по файлу и операцией Read записал все байты в массив типа Byte вот так Read(f, Mas[x,y]), или в Char вот так Read(f, b); Mas[x,y] := Chr(b).
Если текстур более 256, то выполните деление по классам. Пусть на текстуру будет выделено 2 байта, первый - тип текстуры (здания, деревья, камни и пр), второй - вид текстуры (здания: дом, таверна, замок), ...и того в цикле появляется два оператора Read подряд, первый записывает вид, второй тип, ...будет 256 каталогов, в которых по 256 видов каждого типа текстур - 65535 штук, нормально? ))
Заметьте, если хранить файлы с именем числовым, то у нас больше вариантов, т.к. ОС не принимает некоторые символы, кроме которых есть и откровенные "иероглифы". Создайте таблицу и пронумеруйте все типы и виды текстур, файлы будите хранить под кодом.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 25.01.2010 в 20:42.
Beermonza вне форума Ответить с цитированием
Старый 31.01.2010, 19:34   #12
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Итак тема урока "как сохранить в файл двухмерный динамический массив"

Смотрим листинг старался сделать как можно больше коментариев.

Код:
Var F: file;
    M: Array of Array of integer; // кому какой массив нужен такой и сделаете
    i,j,t, nx,ny:integer; // Переменные для помощи

Const
 X=25;
 Y=15;
 FileName = 'data.bin';
begin
 // Часть1. Созднаие массива

 SetLength(m,Y);
 // Устанавливаем размер для каждой строчки
 For i := 0 to Y - 1 do
  Begin
   SetLength(m[i],X);
   // Заполним суммой координат (Так для примера)
   for j := 0 to x - 1 do
    m[i,j] := i + j;
  End;

 //Часть2. Сохранить Массив.

 AssignFile(f,filename);
 rewrite(f,1); // размер блока данных - 1 байт
 //так как размеры будут динамические необходимо сохранить их
 t := length(m);
 blockWrite(f,t,4); // Интежер имеет размер 4 байта
 // сохраним построчно весь массив
 for i := 0 to y - 1 do
  Begin
   t := Length(m[i]); //размер в слотах
   // Можно конечно в самом начале было указать это на случай если на карте
   // строчки будут иметь разную длину (например ромб :))
   blockWrite(f,t,4);
   t := Length(m[i]) * sizeof(m[i,0]); //размер в байтах
   // Сохраняем сами данные
   blockwrite(f,m[i,0],t);
  End;
 closeFile(f);

 //Часть3. Освобождение ресурсов

 For i := 0 to y - 1 do
  Begin
   // для надежности еще затрем (в принципе не обязательно, просто для наглядности)
   For j := 0 to x - 1 do
    m[i,j] := 0;
   Setlength(m[i],0);
  End;
 setlength(m,0);

 //Часть4. Чтение массива

 AssignFile(f,filename);
 reset(f,1); // размер блока данных - 1 байт
 //Читаем колличество строк
 blockRead(f,ny,4);
 //Строим массив
 setlength(m,ny);
 // загружаем построчно весь массив
 for i := 0 to ny - 1 do
  Begin
   blockRead(f,nx,4); // размер строки
   // Выделяем память
   Setlength(m[i],nx);
   t := nx * sizeof(m[i,0]);
   // Загружаем сами данные
   blockRead(f,m[i,0],t);
  End;
 closeFile(f);

 // не забывайте убрать за собой
 For i := 0 to y - 1 do
  Begin
   Setlength(m[i],0);
  End;
 setlength(m,0);
end;
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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