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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 11:41   #1
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию Чтение и запись карты.

Я создаю игру (точнее улучшаю уже). Нужно чтобы в файле было записано:
-Координата Х ячейки
-Координата Y ячейки
-Проходима ли ячейка или нет
-Название текстуры
-Название маски
И из программы читались эти данные, и если надо, при изменении сохранялись.

Можно ли сделать это наподобие двухмерного массива, где столбцы - координаты Y, а строки - Х?...Просто карта размером 40х30, и поэтому линейная запись слишком громоздкая будет...

Заранее благодарен. Жду ответа.
Ckomoroh вне форума Ответить с цитированием
Старый 22.01.2010, 11:57   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
TCell = Record
 CellObject : Byte;
 TexName : String[20];
 MaskName : String[20];
End;

Map : Array[0..19,0..19] of TCell;
А дальше сохранять\читать BlockWrite BlockRead.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 22.01.2010, 11:59   #3
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

А в каком файле это хранить? в txt?

Я именно про файл хочу узнать...как хранить это в программе я знаю...а вот как прочесть и сохранить?...
Ckomoroh вне форума Ответить с цитированием
Старый 22.01.2010, 12:00   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Да какое хотите название придумайте! Там все зависит от того, что Вы укажете в AssignFile! Файл все равно будет содержать бинарные данные.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 22.01.2010, 13:33   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

У меня в игре объекты в текстовом файле хранились приблизительно в таком виде:
Цитата:
TYPE=SIMPLE_OBJECT; ANIMATIONID=Wall; POSITION=620,460; SIZE=40,40;
TYPE=ENEMY; ANIMATIONID=Enemy1; POSITION=420,340; SIZE=40,40;
TYPE=DIAMOND; ANIMATIONID=Diamond; POSITION=340,60; SIZE=40,40; POINTS=50;
TYPE - тип объекта (в зависимости от него создавался объект одного из типов с нужными параметрами)
ANIMATIONID - идентификатор анимации этого объекта (анимации у меня были проиндексированы по строковым переменным)
POSITION - собственно координаты объекта (у меня - его центра)
SIZE - размер прямоугольника, занимаемого объектом (в игре проверялись пересечения прямоугольников главгероя и объектов)
POINTS - сколько очков давалось главгерою за один бриллиант

Соответственно, загружаете файл, возможно, в начале считываете данные в первой строке об игровом поле (например, его размеры). Каждую последующую строку разбираете по Фрейду на составные элементы - ищем позиции строки "TYPE=", затем позицию символа ";" - между ними заключена строка, которую и интерпретируем как строку или как число (координаты еще разбиты запятой).

Вот как-то так у меня это работало.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 22.01.2010, 15:23   #6
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Почитай про двоичные типизированные файлы.
Также можно использовать двоичные нетипизированные файлы, только их сложнее использовать, но можно сохранять динамические данные.
Вадим Буренков вне форума Ответить с цитированием
Старый 22.01.2010, 15:40   #7
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ckomoroh, начните с конкретики, сколько байт вам нужно на каждый тип данных. Например, у вас такая таблица:

1) Координата Х ячейки - 1 байт
2) Координата Y ячейки - 1 байт
3) Проходима ли ячейка или нет - 1 байт
4) Название текстуры - 1 байт
5) Название маски - 1 байт

Считаем блок данных на одну клетку карты - 5 байт. Делаем цикл по числу клеток, цикл 2-го порядка:

Код:
Var
  MapFile: File of Byte;

...

AssignFile(MapFile, {путь});   // инициализация
Reset(MapFile);                   // режим - открыть для чтения

For Y:=0 to MaxY do
  Begin
    For X:=0 to MaxX do
      Begin
        Read(MapFile, {Координата Х});
        Read(MapFile, {Координата Y});
        Read(MapFile, {Проходимость});
        Read(MapFile, {Название текстуры});
        Read(MapFile, {Название маски});
      end;
  end;
MaxY и MaxX - размер карты, ...можно загнать эти данные первыми байтами в файле в "системной строке". Каждый оператор Read будет считывать следующий байт, отсчитав системную строку можно приступать к данным карты.

Перезапись через Write, режим Rewrite(MapFile).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.01.2010, 19:33   #8
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

Я сделал так.... и файл карты весит 9 кб=( :

Код:
type TMPint = packed record
  UtextureX    :array[1..30,1..40] of boolean;     //Есть ли клетка или нет
  UInteger     :array[1..30,1..40] of integer;      //№ текстуры
  UProhodimost :array[1..30,1..40] of string[1]; //Вид проходимости (b - нельзя пройти, s - магазин, k - квест и.т.д.)
end;

var
  mapint:TMPint;
в процедуре сохранения карты (программа - редактор карт для игры)

Код:
var
  F:file of TMPint;
  x,y:byte;
begin
  assignFile(F,'map1.dat');
  Rewrite(F);
  write(F,mapint);
  closefile(F);
end;
Ckomoroh вне форума Ответить с цитированием
Старый 22.01.2010, 19:38   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
и файл карты весит 9 кб=( :
А как Вы думаете, сколько он должен весить?
Код:
30*40*1+30*40*4+30*40*1=...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 22.01.2010, 19:52   #10
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

А ну да...точно...=)
Ckomoroh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11
Запись....Ок. Чтение....Fail :( Alex Cones Общие вопросы Delphi 9 20.11.2009 10:59
VC++ файлы(чтение\запись) ("")(Э_Є)("") Общие вопросы C/C++ 3 16.06.2009 14:05
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22
Запись и чтение сообщений Altera Работа с сетью в Delphi 6 13.04.2008 03:31