[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
FunWorldv2 beta1. Вступительное слово...
SaiLightДата: Среда, 13.01.2010, 16:06 | Сообщение # 11
Ведущий программист
Группа: Администратор
Сообщений: 312
____________________
Активист
____________________
Репутация: 8 ±
Замечания: ±
Quote (GreenDan)
Пока не решу, разбить ли мне игру на несколько уровней или создать один большой.

Тут все зависит от того, сможешь ли ты достаточно оптимизировать код, чтобы большой уровень хорошо просчитывался и не тормозил. Делаешь на Canvas или DirectX/OpenGL?

Меня удивило, что карта записывается с пробелами. У нас (в той игре, что мы сейчас делаем) все символы в массиве идут подряд, поэтому я и удивляюсь. Если в твоем варианте есть дополнительные плюсы, то скажи, какие, но скорее всего - это большее возможное количество текстур, чем у нас.

GreenDanДата: Среда, 13.01.2010, 16:12 | Сообщение # 12
Группа: Проверенные
Сообщений: 146
____________________
Почетный гость
____________________
Репутация: 3 ±
Замечания: ±
Я записываю в файл примерно вот так:
Code
var
   f: Text;
   i,j: integer;
begin
   Assign(f, FileName);
   Rewrite(f);
   for i := 0 to SizeX do
    for j := 0 to SizeY do
     Write(f, matrix[i,j], ' ');
   Close(f);
end;

Просто если не ставить пробелы, то как программа определит потом число. Ну вот если будет записано вот так
11111, то запишется значение 11111 только в первую ячейку массива, а если вот так: 1 1 1 1 1, то запишется в пять ячеек массива по 1.
На Canvas делаю. Тормозить игра не будет, даже если загрузить массив 1024x1024, ведь отображаться будет только видимая область, следовательно для видимой области будут выполняться все операции.


SaiLightДата: Среда, 13.01.2010, 16:21 | Сообщение # 13
Ведущий программист
Группа: Администратор
Сообщений: 312
____________________
Активист
____________________
Репутация: 8 ±
Замечания: ±
Quote (GreenDan)
Просто если не ставить пробелы, то как программа определит потом число.

Ну, у нас не числа, а символы (Char), и программа нормально их читает.

Quote (GreenDan)
Тормозить игра не будет, даже если загрузить массив 1024x1024

Это радует. Главное еще сделай редактор, где можно будет создавать такие большие карты и положи его сюда. Вот заживем тогда. smile

GreenDanДата: Среда, 13.01.2010, 16:27 | Сообщение # 14
Группа: Проверенные
Сообщений: 146
____________________
Почетный гость
____________________
Репутация: 3 ±
Замечания: ±
Так он уже сделан. Ловите =)
P.S. Оформление никакое, но оно и не обязательно. И пожалуйста, не делайте размерность карты меньше 16:8 =)
Есть в нём и маленькие проблемки. Ну сейчас исправлять это необязательно. Сохраняет карту в файл test.map, загружает из test.map, а компилирует в testmap.gmap. Все файлы открываются блокнотом.
Прикрепления: GameEdit.rar (176.1 Kb)




Сообщение отредактировал GreenDan - Среда, 13.01.2010, 16:30
SaiLightДата: Среда, 13.01.2010, 16:48 | Сообщение # 15
Ведущий программист
Группа: Администратор
Сообщений: 312
____________________
Активист
____________________
Репутация: 8 ±
Замечания: ±
Скачал, посмотрел, но так и не понял, чем отличается save от compile. Ну, они создают разные файлы - .map и .gmap, да? Но в чем отличие? Я посмотрел в блокноте: файлы, вроде бы, одинаковые. Да и размер один.

GreenDanДата: Среда, 13.01.2010, 16:54 | Сообщение # 16
Группа: Проверенные
Сообщений: 146
____________________
Почетный гость
____________________
Репутация: 3 ±
Замечания: ±
Кнопка Save создаёт файл для загрузки в редактор, а Compile создаёт файл карты уже для игры. Различия имеются: в .map записывается размерность карты, значения массива, количество объектов для всех изображений, описанных в файле TexturePath, в .gmap записывается размерность карты, изменённые значения массива, перечень изображений, которые используются в данной карте. Попробуй добавить на карту только Grass.bmp, нажми Compile и открой получившийся файл.
Если не секрет, можешь рассказать и показать, как у вас записываются значения элементов массива без пробела?




Сообщение отредактировал GreenDan - Среда, 13.01.2010, 16:55
SaiLightДата: Среда, 13.01.2010, 17:21 | Сообщение # 17
Ведущий программист
Группа: Администратор
Сообщений: 312
____________________
Активист
____________________
Репутация: 8 ±
Замечания: ±
Да какие уж тут секреты. smile

Вот процедура сохранения карты из редактора (над ним мы, вроде, уже закончили работу, хотя, какие-то недочеты еще исправлять все равно придется):

Code
Procedure pSaveLevel(vFileMap: String);
var
      fFileMap: TextFile;
      i, j: Integer;
begin
      AssignFile(fFileMap, vFileMap);
      Rewrite(fFileMap);
      Writeln(fFileMap, vMapName);
      Write(fFileMap, vMapW, ' ');
      Writeln(fFileMap, vMapH);
      for i := 1 to vMapH do begin
        for j := 1 to vMapW do begin
          if (j < vMapW) then
            Write(fFileMap, aPole[j, i])
          else
            Writeln(fFileMap, aPole[j, i]);
          end;
        end;
      CloseFile (fFileMap);
end;

Ну, тут, вроде, все понятно: сначала идет запись в массив размера карты, как и у тебя, а потом - самих элементов. vMapW - ширина карты (не в пикселях, а в ячейках, разумеется), а vMapH - высота (ну или как ее еще называют).

Code
if (j < vMapW) then
            Write(fFileMap, aPole[j, i])
          else
            Writeln(fFileMap, aPole[j, i]);
          end;

Этот код обеспечивает переход на новую строку при записи: если j меньше, чем ширина карты, то Write - запись на одну строку, а если j равна ширине карты, то на текущую строку записывается последний элемент, а затем производится переход на следующую строку.

А вот процедура загрузки карты, взятая из того же редактора:

Code
Procedure pLoadLevel(vFileMap: String);
var
      fFileMap: TextFile;
      i, j: Integer;
begin
      AssignFile(fFileMap, vFileMap);
      Reset(fFileMap);
      Read(fFileMap, vMapW);
      Readln(fFileMap, vMapH);
      SetLength(aPole, vMapW + 30, vMapH + 30);
      for i := 1 to vMapH do begin
        for j := 1 to vMapW do begin
          if (j < vMapW) then
            Read(fFileMap, aPole[j, i])
          else
            Readln(fFileMap, aPole[j, i]);
          end;
        end;
      CloseFile (fFileMap);
end;

Ну, тут, тоже, вроде, все понятно. Сначала загружаются размеры карты (в соответствующие переменные). Эту строку:

Code
SetLength(aPole, vMapW + 30, vMapH + 30);

Я тебе объяснить не могу. Нет, сказать, что здесь к чему, можно, и это не представляет большого труда - здесь задается размер динамического массива. Но вот однажды я обнаружил, что карта у меня загружается неправильно: в некоторых местах текстуры были не видны. Я потратил на это целый день, а на следующий день решение пришло мне в голову: я добавил в код игры процедуру, которая после нажатия на кнопку '1' выводила в отдельный файл то, что находилось в массиве карты. И вот что я обнаружил: если на вход подавался такой массив:

Code
101
111

то на выходе я встречал что-то вроде этого:

Code
10 g:"8&%#&
1 &*% $%$$

И объяснить, почему это происходило, я не могу до сих пор. Есть только догадки, что все дело в типе char, в который то ли не умещались коды всех символов, то ли еще что-то. Но я заметил, что если задать размер массива больше размера карты, то все пойдет гладко, и ошибка будет устранена. Ну, и, недолго думая, я добавил к ширине и высоте по 30 элементов. Быть может, я поступил и неоптимизированно, но в то время моя голова была занята другими проблемами, и такое решение меня вполне устраивало.

GreenDanДата: Среда, 13.01.2010, 17:46 | Сообщение # 18
Группа: Проверенные
Сообщений: 146
____________________
Почетный гость
____________________
Репутация: 3 ±
Замечания: ±
Тип char может содержать в себе только один символ и не более, поэтому и пробелы не нужны, теперь я понял.
Я думаю, что вот эту часть кода:
Code
   for i := 1 to vMapH do begin  
      for j := 1 to vMapW do begin  
        if (j < vMapW) then  
          Write(fFileMap, aPole[j, i])  
        else  
          Writeln(fFileMap, aPole[j, i]);  
        end;

Можно попробовать сменить на такую:
Code
   for i := 1 to vMapH do begin
      for j := 1 to vMapW do Write(fFileMap, aPole[j, i])  
     Writeln(fFileMap);  
   end;

Тоже самое. Элементы записываются от j до vMapW записываются в одну строку. После записи конечного элемента переводим курсор на следующую строку. Попробуй заменить на этот код (=.
Code
   Write(fFileMap, vMapW, ' ');  
    Writeln(fFileMap, vMapH);

Можно заменить на такой код:
WriteLn(fFileMap, vMapW, ' ', vMapH);
Читать вот так:
ReadLn(fFileMap, vMapW, vMapH);
Должно работаеть.
У меня вот так сохраняется в файл:
Code
procedure TMap.SaveMap(FileName: string);
var
   f: Text;
   i,j: integer;
begin
   Assign(f, FileName); Rewrite(f);
   WriteLn(f, SizeX);
   WriteLn(f, SizeY);
   for i := 0 to SizeX do
     for j := 0 to SizeY do
       Write(f, matrix[i,j], ' ');
   WriteLn(f);
   WriteLn(f, Images.Count);
   WriteLn(f);
   for i := 0 to Images.Count do
       WriteLn(f, Images.ObjCount[i]);

   Close(f);
end;

Думаю, здесь всё понятно. Почти аналогичный твоему код =).
Насчёт неправильного отображения, возможно, что всё дело в char, как ты и сказал, я с тобой согласен.


SaiLightДата: Среда, 13.01.2010, 18:10 | Сообщение # 19
Ведущий программист
Группа: Администратор
Сообщений: 312
____________________
Активист
____________________
Репутация: 8 ±
Замечания: ±
Quote (GreenDan)
Можно попробовать сменить на такую:    

for i := 1 to vMapH do begin       
for j := 1 to vMapW do Write(fFileMap, aPole[j, i])       
Writeln(fFileMap);     
end;

У меня был такой код с самого начала, но потом я почему-то сменил его на тот, что стоит сейчас. Бывает иногда так: делаю что-то (часа в 3 ночи обычно), что кажется мне настолько умным, что все, что было до этого я удаляю безвозвратно, ибо тупо. А на следующий день никак не могу понять, зачем же я это сделал... biggrin

GreenDanДата: Среда, 13.01.2010, 18:15 | Сообщение # 20
Группа: Проверенные
Сообщений: 146
____________________
Почетный гость
____________________
Репутация: 3 ±
Замечания: ±
biggrin у меня тоже частенько бывает так.
Насчёт игры: когда примерно выйдет демо-версия?


  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: