|
Нужен тестер РПГ игры (игра большая и серьёзная :) )
|
|
|
12.11.2011 в 13:41
Сообщение #41
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
насчет поля - мало... Ладно, шучу =) У меня проблема с загрузкой блоков после их сохранения у меня есть такие переменные для записи: Code blok_rss:RecordStore; index_blok_posX:array [1..MAX_BLOCK] of integer; index_blok_posY:array [1..MAX_BLOCK] of integer; index_blok_postavlen:array [1..MAX_BLOCK] of integer; index_blok_tip:array [1..MAX_BLOCK] of integer; вот код записи: Code Procedure save_world; var i:integer; in_blok_postavlen:array [1..MAX_BLOCK] of integer; begin //конвертируем данные - показываем SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Конвертирование данных',0,0); repaint; //конвертируем true в 1 и записываем в отдельный массив for i:=1 to MAX_BLOCK do begin if (blok[i].postavlen=true) then begin in_blok_postavlen[i]:=1 end else begin in_blok_postavlen[i]:=0 end; end; //Запись началась - показываем SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Запись пошла поехала...',0,0); repaint; //открываем хранилище блоков blok_rss:=OpenRecordStore('blok_rss'); SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Хранилище открыто...',0,0); repaint; delay(200); for i:=1 to MAX_BLOCK do begin if (blok[i].postavlen=true) then begin index_blok_posX[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].posX); end; if (blok[i].postavlen=true) then begin index_blok_posY[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].posY); end; if (blok[i].postavlen=true) then begin index_blok_tip[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].ID); end; if (blok[i].postavlen=true) then begin index_blok_postavlen[i]:=AddRecordStoreEntry(blok_rss,''+in_blok_postavlen[i]); end; SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Записано:'+(i),0,0); repaint; end; CloseRecordStore(blok_rss);//закрыли хранилище SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Запись закончена...',0,0); repaint; delay(400); end; а вот код загрузки: Code Procedure load_world; var i:integer; strings:array [1..MAX_BLOCK] of string; in_blok_postavlen:array [1..MAX_BLOCK] of integer; begin //Чтение данных SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Чтение из хранилища',0,0); repaint; //Открываем хранилище и читаем и читаем... <img src="http://s21.ucoz.net/sm/23/biggrin.gif" border="0" align="absmiddle" alt="biggrin" /> blok_rss:=OpenRecordStore('blok_rss'); for i:=1 to MAX_BLOCK do begin //postavlen - конвертирование и тут же запись новых данных(не в хранилище) strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_postavlen[i]); in_blok_postavlen[i]:=StringToInteger(strings[i]); if in_blok_postavlen[i]=1 then begin blok[i].postavlen:=true end else begin blok[i].postavlen:=false end; //теперь исходя из того поставлен ли блок, читаем его свтойства... if (blok[i].postavlen=true) then begin //X strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_posX[i]); blok[i].posX:=StringToInteger(strings[i]); //Y strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_posY[i]); blok[i].posY:=StringToInteger(strings[i]); //ID strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_tip[i]); blok[i].ID:=StringToInteger(strings[i]); end; SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Прочитано:'+(i),0,0); repaint; end; CloseRecordStore(blok_rss);//закрыли хранилище end; запись идет нормально, а после того как перезайти в приложение и начать загружать мир, то ничего не загрузиться даже!!! Как будто всё испарилось... А насчет того что в антураже MineCraft - всё сам =) Мне нужно опыта набираться всё таки...
|
|
|
|
|
12.11.2011 в 13:43
Сообщение #42
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
а насчет игры по блютузу - тоже сам =) мне нужно максимально эффективно использовать то что сейчас есть у меня
|
|
|
|
|
12.11.2011 в 14:00
Сообщение #43
|
|
PassCall
Знающий
Проверенные
Сообщений: 88
Offline
|
Бля... слишком много букафф.
Нельзя ли сделать так: procedure save(num:integer); begin deleterecordstore ('savemap_'+integertostring(num));//нужно удалить старую базу иначе каждый раз к ней будут приписываться новые данные, изза чего размер её раздуется до нереальных размеров rs:=OpenRecordStore('savemap_'+integertostring(num));//открывает/создает базу данных for i:=1 to WORLD_HEIGHT do begin S:=''; for j:=1 to WORLD_WIDTH do S:=S+integertostring (map_array[i,j]); temp:=AddRecordStoreEntry (rs,S);//записываем. возвращает номер строчки, в которую и была совершена запись. end; closerecordstore (rs); end;
Для загрузки: procedure load(num:integer); begin rs:=OpenRecordStore('savemap_'+integertostring(num)); for i:=1 to WORLD_HEIGHT do begin S:=readRecordStoreEntry ('savemap_'+integertostring(num),i); for j:=1 to WORLD_WIDTH do map_array[i,j]:=stringtointeger(GetChar(S,j-1)); end; closerecordstore (rs); end;
Вот примерно так. Хотя конечно следовало бы записывать байтами, а не числами, но суть понятна
Сообщение отредактировал PassCall - Суббота, 12.11.2011, 14:02
|
|
|
|
|
12.11.2011 в 14:05
Сообщение #44
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
О_О
|
|
|
|
|
12.11.2011 в 14:06
Сообщение #45
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
блин, нужно время чтобы переварить то что ты написал
|
|
|
|
|
12.11.2011 в 14:13
Сообщение #46
|
|
PassCall
Знающий
Проверенные
Сообщений: 88
Offline
|
А что тут думать =) Допустим в массиве есть 50 строк и 100 столбцов
Следовательно, в хранилище следует записать 50 строк, каждая по 100 символов. Мы собираем из множества символов одну строку: for j:=1 to WORLD_WIDTH do S:=S+integertostring (map_array[i,j]);
А затем записываем её: temp:=AddRecordStoreEntry (rs,S);
После чего возвращаемся к началу чикла, где S:=''; "очищает" строку.
В загрузке почти тоже самое.
|
|
|
|
|
12.11.2011 в 14:17
Сообщение #47
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
так, если честно, то мой 15 летний мозг, пытается отторгнуть то что ты написал. Если тебе не сложно, объясни более подробно, мне нужно поучиться у кого-то... =)
|
|
|
|
|
12.11.2011 в 16:50
Сообщение #48
|
|
PassCall
Знающий
Проверенные
Сообщений: 88
Offline
|
Ладно.
Допустим, у нас такое содержимое матрицы, размером 5х8: 10010000 01010010 10020101 20102010 20102010
где 0 - это пустота 1 - трава 2 - земля и т.д.
Нам надо в таком виде и сохранить (не одной строкой, а пятью), чтобы было удобнее.
Перед тем как сохранять в recordstore (эдакая специальная папка, индивидуальная для каждого приложения в телефоне, куда и будут сохраняться "сохраненки")
Для того, чтобы чтото записать в хранилище (это так называется сохраненка), надо сначала его создать (или октрыть).
НО! Сначала надо удалить старую сохраненку (если её нет то при вызове удаления сохраненки ничего не произойдет). Иначе при сохранении в неё данные будут не перезаписываться, а добавляться новые. Что неправильно. Code Для удаления пишем DeleteRecordStore('имя нашей сохраненки');
Теперь откроем (точнее создадим) её: rs:=OpenRecordStore('имя нашей сохраненки'); [color=gray](незабудь описать rs как recordstore в разделе var!)[/color]
Далее, нам нужно создать 5 строк. в каждой строке 8 символов (размер поля 5х8, не забыл?) Внесем в var новую переменную - S:string;
С помощью её мы "соберем" 8 символов в одну строку.
Итак, делается так
for i:=1 to 5 do//5 строк begin S:='';[color=gray]//очищаем строку, перед тем как создать новую[/color] for j:=1 to 8 do[color=gray]//в каждой строке 8 символов должно быть, не забыл? <_<[/color] S:=S+integertostring(map[i,j]);[color=gray]//Прибавляем к строке номер "почвы" (трава, пуустота, земля, и т.д.). Но прибавить к строке число нельзя, к строке можно прибавить только символ или текст. Для этого превращаем число в текст (integertostring - переводиться буквально как "число в текст")[/color] temp:=AddRecordStoreEntry(rs,S);[color=gray]//записываем в rs (наша сохраненка) строку S (полученная строка). Не забудь описать Temp:integer; в разделе var[/color] end; CloseRecordStore (rs);[color=gray]//закрываем сохраненку во избежании различных багов[/color]
Итак, содержимое сохраненки будет выглядить так: 10010000 01010010 10020101 20102010 20102010
Очень похоже на содержимое матрицы карты, не так ли?
Общий код:
Code DeleteRecordStore('имя нашей сохраненки'); rs:=OpenRecordStore('имя нашей сохраненки'); for i:=1 to 5 do begin S:=''; for j:=1 to 8 do S:=S+integertostring(map[i,j]); temp:=AddRecordStoreEntry(rs,S); end; CloseRecordStore (rs);
Сообщение отредактировал PassCall - Суббота, 12.11.2011, 16:57
|
|
|
|
|
12.11.2011 в 17:27
Сообщение #49
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
Quote (PassCall) Перед тем как сохранять в recordstore (эдакая специальная папка, индивидуальная для каждого приложения в телефоне, куда и будут сохраняться "сохраненки")
Для того, чтобы чтото записать в хранилище (это так называется сохраненка), надо сначала его создать (или октрыть). нее, ну это ты загнул для особо одаренных насчет "сохраненки", я всё таки интеллигентный человек! И знаю что такое хранилище... это фильм такой, да? Ладно, шучу . Я ещё не деградировал до состояния полного дибилизма. Всю основу в MP я знаю, мне нужна практика со строками, char(?!), ну и наподобе таких ф-ий... Ну, и теперь мне стало более яснее насчет всего этого бардака =)
|
|
|
|
|
12.11.2011 в 17:31
Сообщение #50
|
|
Nextik
Программист
Проверенные
Сообщений: 273
Offline
|
Кстати, как показали некоторые эксперименты(которые я втихоря проводил в секретной лаборатории X) , сохранение структурных данных занимает довольно много времени =/ Поэтому если сделать 100 смещений и быстро быстро(шнеля шнеля!) начать записывать, он не заметит? . Хотя если сделать сохранение например на ходу, а не полностью всё за один раз, то возможно будет хорошо...
|
|
|
|