Авторизироваться
Модератор форума: ADMIN, Nextik  
Нужен тестер РПГ игры (игра большая и серьёзная :) )
12.11.2011 в 13:41 Сообщение #41
Nextik
Программист
Проверенные
Сообщений: 273
Награды: 0
Репутация: 42
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
Награды: 0
Репутация: 42
Offline
а насчет игры по блютузу - тоже сам =) мне нужно максимально эффективно использовать то что сейчас есть у меня
12.11.2011 в 14:00 Сообщение #43
PassCall
Знающий
Проверенные
Сообщений: 88
Награды: 0
Репутация: 4
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
Награды: 0
Репутация: 42
Offline
О_О
12.11.2011 в 14:06 Сообщение #45
Nextik
Программист
Проверенные
Сообщений: 273
Награды: 0
Репутация: 42
Offline
блин, нужно время чтобы переварить то что ты написал
12.11.2011 в 14:13 Сообщение #46
PassCall
Знающий
Проверенные
Сообщений: 88
Награды: 0
Репутация: 4
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
Награды: 0
Репутация: 42
Offline
так, если честно, то мой 15 летний мозг, пытается отторгнуть то что ты написал. Если тебе не сложно, объясни более подробно, мне нужно поучиться у кого-то... =)
12.11.2011 в 16:50 Сообщение #48
PassCall
Знающий
Проверенные
Сообщений: 88
Награды: 0
Репутация: 4
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

Очень похоже на содержимое матрицы карты, не так ли? biggrin

Общий код:

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
Награды: 0
Репутация: 42
Offline
Quote (PassCall)
Перед тем как сохранять в recordstore (эдакая специальная папка, индивидуальная для каждого приложения в телефоне, куда и будут сохраняться "сохраненки")

Для того, чтобы чтото записать в хранилище (это так называется сохраненка), надо сначала его создать (или октрыть).

нее, ну это ты загнул для особо одаренных насчет "сохраненки", я всё таки интеллигентный человек! happy И знаю что такое хранилище... это фильм такой, да? biggrin
Ладно, шучу smile . Я ещё не деградировал до состояния полного дибилизма. Всю основу в MP я знаю, мне нужна практика со строками, char(?!), ну и наподобе таких ф-ий...
Ну, и теперь мне стало более яснее насчет всего этого бардака =)
12.11.2011 в 17:31 Сообщение #50
Nextik
Программист
Проверенные
Сообщений: 273
Награды: 0
Репутация: 42
Offline
Кстати, как показали некоторые эксперименты(которые я втихоря проводил в секретной лаборатории X) , сохранение структурных данных занимает довольно много времени =/
Поэтому если сделать 100 смещений и быстро быстро(шнеля шнеля!) начать записывать, он не заметит? smile . Хотя если сделать сохранение например на ходу, а не полностью всё за один раз, то возможно будет хорошо...
Поиск: