Вверх ↑
Этот топик читают: Гость
Ответов: 164
Рейтинг: 5
#1: 2019-11-15 18:45:46 ЛС | профиль | цитата
Кратко говоря, я решил замутить игру по типу террарии, и уже хорошо разбираясь в Hiasm начал работу. Физика, все плюшки и т.д сделаны и настал момент воплотить процесс сохранения и загрузки мира. Я разумеется к элементу GE_GridSpace к точке doSAVE подключил линию, и... оказалось что мир не сохранился (под мир я подразумеваю именно этот элемент, именно его матрица и есть мир). Я подключал всё и переподключал совершенно разными способами , но толку ноль! И тут я решил покопаться в коде и...

    for j := 0 to mw-1 do
begin
_id := Matrix^[i*mw + j].id;
if _Flt^[_id] then
begin
_x := Round(X + j*SizeX);
_y := Round(Y + i*SizeY);
if not( (_x › Obj.x + Obj.Width - Obj.Right)or(_y › Obj.y + Obj.Height - Obj.Bottom)or(_x + SizeX ‹ Obj.X + Obj.Left)or(_y + SizeY ‹ Obj.Y + Obj.Top) ) then
begin
Result := true;
rid := _id;
robj := Matrix^[i*mw + j];
exit;
end;
end;
end;
Result := false;
end;

procedure TGE_GridSpaceObject.Save(const FileName:string);
begin

end;

procedure TGE_GridSpaceObject.Load(const FileName:string);
var //fs:PStream;
lst:PStrList;
i,j:integer;
s:string;
begin
if copy(FileName, length(FileName)-2, 3) = 'txt' then
begin
lst := NewStrList;
lst.LoadFromFile(GetStartDir + FileName);
mw := length(lst.Items[0]);
mh := lst.Count;
GetMem(Matrix, mh*mw*sizeof(TGE_Object));
FillChar(Matrix^, mh*mw*sizeof(TGE_Object), 0);
for i := 0 to lst.Count-1 do
begin
s := lst.Items[i];
for j := 1 to mw do
SetCell(j - 1, i, ord(s[j]) - ord('0'));
end;
lst.free;
end
else
begin
//fs := NewReadFileStream(FileName);
//GetMem(Matrix, fs.Size);
//fs.read(Matrix^, fs.Size);
//fs.Free;
end;
end;

И тут я заметил , что у процедуры сохранения отсутствует код... Ну как это понимать, а? Может есть обновление элемента , где уже добавили удалённую часть кода... Просто я пол часа думал, что я идиот и где-то с матрицей накосячил, а тут оказалось: просто недоделанный элемент!
карма: 0
c, c++, lua
0
vip
#1.1контекстная реклама от партнеров
Ответов: 20
Рейтинг: 5
#2: 2019-11-16 02:36:18 ЛС | профиль | цитата
Как-то так, подставь на место пустышки
procedure TGE_GridSpaceObject.Save(const FileName:string); 
var
lst:PStrList;
i,j:integer;
s:string;
begin
if copy(FileName, length(FileName)-2, 3) = 'txt' then
begin
lst := NewStrList;
for i := 0 to mh-1 do
begin
s := '';
for j := 0 to mw-1 do
s := s + int2str(GetCell(j , i));
lst.Add(s);
end;
lst.SaveToFile(FileName);
lst.free;
end
else
begin
//other format
end;
end;

Редактировалось 7 раз(а), последний 2019-11-16 02:59:33
карма: 0

2
Голосовали:Леонид, Dilma
Ответов: 1925
Рейтинг: 172
#3: 2019-11-16 19:21:05 ЛС | профиль | цитата
А теперь - на SVN!
карма: 9
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#4: 2019-11-17 04:27:44 ЛС | профиль | цитата
А кто-нибудь мне объяснит -- почему расширение файла должно быть именно *.txt?
карма: 22

0
Ответов: 1925
Рейтинг: 172
#5: 2019-11-18 16:01:20 ЛС | профиль | цитата
parara, а откуда вообще этот код? Сам писал?

nesco писал(а):
почему расширение файла должно быть именно *.txt?

Согласен, в данном случае формат не должен зависеть от расширения. Следует сделать, как в

Add(IntegerArray,9589223,511,245)
{
IntArray=[]
}
: добавить св-во FileFormat. Там в коде получается так:

#pas
procedure THIIntegerArray.Save;
begin
if _prop_FileFormat = 0 then
PStream(p).write(Data,sizeof(data))
else string(p^) := int2str(data);
end;
, а не по расширению.
карма: 9
0
Ответов: 20
Рейтинг: 5
#6: 2019-11-18 17:34:19 ЛС | профиль | цитата
3042 писал(а):
parara, а откуда вообще этот код? Сам писал?

по аналоги с открытием, я не пользуюсь этим, лень было разбираться зачем оно так
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#7: 2019-11-18 18:01:38 ЛС | профиль | цитата
parara писал(а):
по аналоги с открытием

А все это безобразие кто-нибудь тестировал после добавления?
карма: 22

0
Ответов: 20
Рейтинг: 5
#8: 2019-11-19 04:16:48 ЛС | профиль | цитата
nesco писал(а):
А все это безобразие кто-нибудь тестировал после добавления?

проверил работу этого безобразия на примере Hiasm\Elements\delphi\Example\Draw\game\GameEngine\Demo.sha
добавив точку сразу после загрузки level.txt на выгрузку под именем level2.txt
Основа этого элемента - Matrix int индексов коллекции спрайтов
Короче работает

Редактировалось 1 раз(а), последний 2019-11-19 04:18:39
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#9: 2019-11-20 13:51:42 ЛС | профиль | цитата
Пофиксил, добавив свойство FileFormat
карма: 22

0
Ответов: 164
Рейтинг: 5
#10: 2019-11-21 21:42:37 ЛС | профиль | цитата
Спасибо за код. Подставил куда нужно , и заработало, а для корректной работы со всеми форматами потом обновлю элемент через Updatор .
карма: 0
c, c++, lua
0
Ответов: 164
Рейтинг: 5
#11: 2019-12-20 10:43:53 ЛС | профиль | цитата
По моему баги с этим элементом не закончились :/

https://drive.google.com/file/d/1-SPkckRR0NDm00WudXMpOyss9GjjWGry/view?usp=sharing
Здесь у нас есть два спрайта - сама матрица и спрайт игрока. Они используют одну и ту же текстуру, но спрайт матрицы рисует текстуру без прозрачности...
карма: 0
c, c++, lua
0
Ответов: 164
Рейтинг: 5
#12: 2019-12-20 15:01:11 ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2019-12-20 15:37:00
карма: 0
c, c++, lua
0
Ответов: 2193
Рейтинг: 673
#13: 2019-12-23 20:54:36 ЛС | профиль | цитата
UtoECat писал(а):
спрайт матрицы рисует текстуру без прозрачности
Так и было реализовано автором элемента. Это не баг и не ошибка.
карма: 10

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)