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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2011, 18:13   #1
Enlightened
Пользователь
 
Регистрация: 15.08.2010
Сообщений: 24
По умолчанию Проблемы со считыванием игровой карты с файла

Привет, друзья!
У меня, как новичка, не знакомого особо с программированием игр, возникли непредвиденные трудности.
Я внимательно просмотрел тему "Уроки по созданию игр для новичков", решил написать собственную игру, рисуется у меня все на канве.
Уровень состоит из тайлов, считываемых с файла 1.txt. Игровая карта у меня - array [0..23, 0..23] of TGameMap, где:
Код:
Type
  TGameMap = object
    TGTexture: TBitmap; //текстура
    TGMove:    Byte;      //показатель проходимости
    TGCode:    char;       //код
end;
Но у меня видов тайлов будет больше количества символов, которые можно закодировать 1 символом. Я решил ввести следующую систему: вместо 1 символа использовать 2, разделяются пробелами, но хранятся уже в string'е. У TGCode изменил char на string. Вот процедура считывание карты с файла, измененная:
Код:
AssignFile (MapFile,'levels\1.txt');
Reset(MapFile);
For y:=0 to 23 do  //здесь y и x - локальные переменные
 begin
 For x:=0 to 23 do
  Begin
  if x<23 then     //тут проверка конца строки - 24 ведь элементов

  begin
   sv:='';             //sv - вспомогательная строка, cv1,cv2,cv3 - символы
   Read(MapFile, cv1); //1 буковка)
   Read(MapFile, cv2); //2 буковка)
   Read(MapFile, cv3); //пробел
   sv:=sv+cv1+cv2+cv3; //образуем строчку типа 'ab '
   MapMas[y,x].TGCode:=sv;
   Case MapMas[y,x].TGCode of
    'gt ' : begin MapMas[y,x].TGTexture:=gt;
         MapMas[y,x].TGMove:=0;
         end;
    'gg ' : begin
         MapMas[y,x].TGTexture:=gg;
         MapMas[y,x].TGMove:=1;
         end;
   end;
   //
   end

   else
   begin
   sv:='';
   Read(MapFile, cv1); //1 буковка
   Read(MapFile, cv2); //2 буковка
   Readln(MapFile, cv3); //пробел и переносим строку
   sv:=sv+cv1+cv2+cv3; //образуем строчку типа 'ab '
   MapMas[y,x].TGCode:=sv;
   Case MapMas[y,x].TGCode of
    'gt ' : begin MapMas[y,x].TGTexture:=gt;
         MapMas[y,x].TGMove:=0;
         end;
    'gg ' : begin
         MapMas[y,x].TGTexture:=gg;
         MapMas[y,x].TGMove:=1;
         end;
   end;   
   end;
 end;
  End;
 CloseFile(MapFile);
На подобный код компилятор стал жаловаться, что у меня несоответствие типов данных в строках с Case - мол, integer и string несовместимы. Но TGCode и строки в кавычках - оба string, где ошибка?

Я сначала решил исправить это довольно-таки китайским способом: в TGameMap добавил TGId, и каждому типу местности присваивал номерок, его уже - в Сase. Cнова ошибка!
Код:
(121) Incompatible types: 'Integer' and 'procedure, untyped pointer or untyped parameter'

Помогите, пожалуйста!
Enlightened вне форума Ответить с цитированием
Старый 13.01.2011, 18:40   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Для того чтобы записать и считать правильно данные с файла вовсе не обязательно отделять каждую виртуальную клетку пробелом. Достаточно в заголовке файла записать размеры карты в клетках по-X и по-Y. Эти данные будет использовать двойной цикл. В теле цикла нужны две подряд идущие команды Read. Переменные, в которые сохраняются оба байта должны быть типа Char (AnsiChar). Следом идет операция загрузки картинки по сборному пути в банк текстур, по первой пустой его ячейке, а в массив карты идет индекс этой ячейки по координатам цикла. Далее цикл переходит на следующие 2 байта в файле, считывает код, загружает картинку, ищет следующую свободную ячейку в банке текстур, сохраняет там, индекс новой текстуры записывает в массив карты по координатам цикла. Операция продолжается пока циклы не закончат считать.

Попробуйте понять, и накидать код сюда, ...если будут проблемы, попробую найти время и помочь.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.01.2011, 18:46   #3
Enlightened
Пользователь
 
Регистрация: 15.08.2010
Сообщений: 24
По умолчанию

Хорошо, сейчас перелопачу код)
Enlightened вне форума Ответить с цитированием
Старый 13.01.2011, 19:07   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Тут все есть для создания правильной структуры: http://www.programmersforum.ru/showt...t=1206&page=27 ...посты #263 - 268.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.01.2011, 19:36   #5
Enlightened
Пользователь
 
Регистрация: 15.08.2010
Сообщений: 24
По умолчанию

все, 45 минут, исправил.
Ваш пост насчет правильной структуры только сейчас обнаружил, дописал так:
Код:
//Читаем с файла:
AssignFile (LogFile,'log.txt');
rewrite(logfile);
AssignFile (MapFile,'levels\1.txt');
Reset(MapFile);
Read (MapFile, x); Readln(MapFile, y);
For j:=0 to y-1 do
 begin
 For i:=0 to x-1 do
  Begin
  if i<23 then begin
   read(MapFile, ch1); read(Mapfile, ch2);
  //----------------
   Case ch1 of
    'g': begin
          Case ch2 of
          {}  't': begin //считали, получается, gt - дерево
          {}       Mapmas[j,i].TGTexture:=gt;
          {}       Mapmas[j,i].TGMove:=0;
          {}      end;
          {}  'g': begin //считали gg - траву
          {}       Mapmas[j,i].TGTexture:=gg;
          {}       Mapmas[j,i].TGMove:=1;
          {}      end;
          end;
         end;
   else Writeln(logfile, 'Ошибка');
   end;
 //--------------
  end
  else
   begin
   {}
   {}  read(MapFile, ch1); readln(Mapfile, ch2);
   {}   Case ch1 of
   {}   'g': begin
   {}         Case ch2 of
   {}         {}  't': begin //считали, получается, gt - дерево
   {}         {}       Mapmas[j,i].TGTexture:=gt;
   {}         {}       Mapmas[j,i].TGMove:=0;
   {}         {}      end;
   {}         {}  'g': begin //считали gg - траву
   {}         {}       Mapmas[j,i].TGTexture:=gg;
   {}         {}       Mapmas[j,i].TGMove:=1;
   {}         {}      end;
   {}         end;
   {}        end;
   {}   else Writeln(logfile, 'Ошибка');
   {}  end;
   {}
   end;
 end;
 end;
 CloseFile(MapFile);
 CloseFile(LogFile);
end;
ch1,ch2 - те 2 ansichar'овские переменные. Как выяснилось, даже TGCode стал в такой системе не нужен - в нужном месте сразу подставляется текстура. Приятно, лишние 1*размер массива байт памяти не бывают лишними .
Спасибо, Beermonza, все работает.

Последний раз редактировалось Enlightened; 13.01.2011 в 19:38.
Enlightened вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сам лабиринт ввести не как постоянную как тут а считыванием с файла Голем Помощь студентам 10 17.07.2010 18:07
Проблемы с отображением содержимого res файла Gamst Общие вопросы Delphi 1 26.05.2010 16:50
проблемы с открытием файла Sparky Общие вопросы C/C++ 1 09.04.2010 19:46
Проблемы с PChar (Считывание из ini файла) Altera Общие вопросы Delphi 9 18.12.2009 20:27
DBGrid. Проблема со считыванием инфы из столбца. Teenager БД в Delphi 6 18.01.2008 15:33