|
FunWorldv2 beta1. Вступительное слово...
| | SaiLight | Дата: Среда, 13.01.2010, 16:06 | Сообщение # 11 |
Ведущий программист
Группа: Администратор
Сообщений: 312 ____________________ Активист ____________________
| Quote (GreenDan) Пока не решу, разбить ли мне игру на несколько уровней или создать один большой. Тут все зависит от того, сможешь ли ты достаточно оптимизировать код, чтобы большой уровень хорошо просчитывался и не тормозил. Делаешь на Canvas или DirectX/OpenGL? Меня удивило, что карта записывается с пробелами. У нас (в той игре, что мы сейчас делаем) все символы в массиве идут подряд, поэтому я и удивляюсь. Если в твоем варианте есть дополнительные плюсы, то скажи, какие, но скорее всего - это большее возможное количество текстур, чем у нас.
| |
|
| GreenDan | Дата: Среда, 13.01.2010, 16:12 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 146 ____________________ Почетный гость ____________________
| Я записываю в файл примерно вот так: 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 ____________________ Активист ____________________
| Quote (GreenDan) Просто если не ставить пробелы, то как программа определит потом число. Ну, у нас не числа, а символы (Char), и программа нормально их читает. Quote (GreenDan) Тормозить игра не будет, даже если загрузить массив 1024x1024 Это радует. Главное еще сделай редактор, где можно будет создавать такие большие карты и положи его сюда. Вот заживем тогда.
| |
|
| GreenDan | Дата: Среда, 13.01.2010, 16:27 | Сообщение # 14 |
Группа: Проверенные
Сообщений: 146 ____________________ Почетный гость ____________________
| Так он уже сделан. Ловите =) P.S. Оформление никакое, но оно и не обязательно. И пожалуйста, не делайте размерность карты меньше 16:8 =) Есть в нём и маленькие проблемки. Ну сейчас исправлять это необязательно. Сохраняет карту в файл test.map, загружает из test.map, а компилирует в testmap.gmap. Все файлы открываются блокнотом.
Сообщение отредактировал GreenDan - Среда, 13.01.2010, 16:30 | |
|
| SaiLight | Дата: Среда, 13.01.2010, 16:48 | Сообщение # 15 |
Ведущий программист
Группа: Администратор
Сообщений: 312 ____________________ Активист ____________________
| Скачал, посмотрел, но так и не понял, чем отличается save от compile. Ну, они создают разные файлы - .map и .gmap, да? Но в чем отличие? Я посмотрел в блокноте: файлы, вроде бы, одинаковые. Да и размер один.
| |
|
| GreenDan | Дата: Среда, 13.01.2010, 16:54 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 146 ____________________ Почетный гость ____________________
| Кнопка Save создаёт файл для загрузки в редактор, а Compile создаёт файл карты уже для игры. Различия имеются: в .map записывается размерность карты, значения массива, количество объектов для всех изображений, описанных в файле TexturePath, в .gmap записывается размерность карты, изменённые значения массива, перечень изображений, которые используются в данной карте. Попробуй добавить на карту только Grass.bmp, нажми Compile и открой получившийся файл. Если не секрет, можешь рассказать и показать, как у вас записываются значения элементов массива без пробела?
Сообщение отредактировал GreenDan - Среда, 13.01.2010, 16:55 | |
|
| SaiLight | Дата: Среда, 13.01.2010, 17:21 | Сообщение # 17 |
Ведущий программист
Группа: Администратор
Сообщений: 312 ____________________ Активист ____________________
| Да какие уж тут секреты. Вот процедура сохранения карты из редактора (над ним мы, вроде, уже закончили работу, хотя, какие-то недочеты еще исправлять все равно придется): 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 10 g:"8&%#& 1 &*% $%$$ И объяснить, почему это происходило, я не могу до сих пор. Есть только догадки, что все дело в типе char, в который то ли не умещались коды всех символов, то ли еще что-то. Но я заметил, что если задать размер массива больше размера карты, то все пойдет гладко, и ошибка будет устранена. Ну, и, недолго думая, я добавил к ширине и высоте по 30 элементов. Быть может, я поступил и неоптимизированно, но в то время моя голова была занята другими проблемами, и такое решение меня вполне устраивало.
| |
|
| GreenDan | Дата: Среда, 13.01.2010, 17:46 | Сообщение # 18 |
Группа: Проверенные
Сообщений: 146 ____________________ Почетный гость ____________________
| Тип 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 ____________________ Активист ____________________
| Quote (GreenDan) Можно попробовать сменить на такую: for i := 1 to vMapH do begin for j := 1 to vMapW do Write(fFileMap, aPole[j, i]) Writeln(fFileMap); end; У меня был такой код с самого начала, но потом я почему-то сменил его на тот, что стоит сейчас. Бывает иногда так: делаю что-то (часа в 3 ночи обычно), что кажется мне настолько умным, что все, что было до этого я удаляю безвозвратно, ибо тупо. А на следующий день никак не могу понять, зачем же я это сделал...
| |
|
| GreenDan | Дата: Среда, 13.01.2010, 18:15 | Сообщение # 20 |
Группа: Проверенные
Сообщений: 146 ____________________ Почетный гость ____________________
| у меня тоже частенько бывает так. Насчёт игры: когда примерно выйдет демо-версия?
| |
|
|
|