forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Чтение и запись в фаил. (http://forum.boolean.name/showthread.php?t=12556)

Fatal 25.05.2010 10:58

Чтение и запись в фаил.
 
Столкнулся с проблемой записи и загрузки переменных из файла.

Сначала я сохраняю некоторые переменные :

Код:

SaveGame = WriteFile("Save.txt")
WriteString ( SaveGame, EntityX#(player))
WriteString ( SaveGame, EntityY#(player))
WriteString ( SaveGame, EntityZ#(player))
CloseFile( SaveGame )

Затем я загружаю переменные и выставляю игрока в них :

Код:

If TestImage (MouseX(),MouseY(), x1-5,170, button) Then
If MouseHit(1)
LoadGame=ReadFile("Save.txt")
PositionEntity player,ReadString(LoadGame),ReadString(LoadGame),ReadString(LoadGame)
CloseFile(LoadGame)
EndIf

Но игрок помещается не в те коардинаты, в которые я его сохранял. Причем если щелкать загрузку несколько раз, что он будет выставлять его в разные коардинаты! Хотя если выводить коардинаты на экран :

Код:

LoadGame=ReadFile("Save.txt")
DrawText "  " +ReadString(LoadGame)+ "  " +ReadString(LoadGame) + "  " +ReadString(LoadGame) + "  " +ReadString(LoadGame) + "  " +ReadString(LoadGame) ,300,200
CloseFile(LoadGame)

То они правельные. У меня есть пара идей на этот счет. Может быть дело в несовпадении типов или связано с вектором?

impersonalis 25.05.2010 11:16

Ответ: Чтение и запись в фаил.
 
www.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ
LOAD-SAVE
http://forum.boolean.name/showthread.php?t=1014
Цитата:

ВАЖНО: всегда контролируйте себя - если вы для объектов сохраняли сначал х а затем y, то и грузить их надо в том же порядке.
Проблема не в 3д (модеры!). Никто не гарантирует что при вызове F(q(),p()), сначал будет вычислено q(),а затем p(). Для большинства случаев, где распределения выходных занчений функций q() и p() независмы это не критично: ну подумаешь, сначала вызовется p(), а затем q() - передадутся то они в верном порядке. Но в твоём случае - функции зависимы. Допустим, в файле подряд сохранено "1,2,3"
И ты вызываешь:
Код:

PositionEntity player,ReadString(LoadGame),ReadString(LoadGame),ReadString(LoadGame)
Очень может оказаться что блитц грузит параметры с конца. Т.о. он сначала получит занчение для третьего аргумента (прочитает из файла - 1), затем для второго - и т.д. В результате - значения перепутаны.

Fatal 25.05.2010 11:18

Ответ: Чтение и запись в фаил.
 
Проблема в 3Д, коардинаты загружаются правильно, в правельном порядке. НО модель перемешается не туда, куда нужно! Но за инфу спасибо)

impersonalis 25.05.2010 11:22

Ответ: Чтение и запись в фаил.
 
2) используй не стринги, а соотвествующие объекты
2.1) или явно указывай перобразование типов
3) убедись, что записываешь глобальные координаты
3.1) или и пишешь и ставишь - локальные
4) телепатировать не удалось - давай рабочий код

Fatal 25.05.2010 11:26

Ответ: Чтение и запись в фаил.
 
Цитата:

2) используй не стринги, а соотвествующие объекты
Преобразовывать в intger?

Цитата:

3) убедись, что записываешь глобальные координаты
Коардинаты конечно глобальны, выводя текст на экран я их получаю правильно

Рабочий код :

Код:

If TestImage (MouseX(),MouseY(), x1-5,70, button) Then
If MouseHit(1)
SaveGame = OpenFile("Save.txt")

WriteString ( SaveGame, EntityX#(playership))
WriteString ( SaveGame, EntityY#(playership))
WriteString ( SaveGame, EntityZ#(playership))
;WriteString ( SaveGame, Playerfuel#)
;WriteString( SaveGame, PlayerMoney)
;WriteLine( SaveGame, PlayerSpeed#) 
CloseFile( SaveGame )
EndIf
DrawText " Сохранить ",x1+30,55
EndIf
If TestImage (MouseX(),MouseY(), x1-5,170, button) Then
If MouseHit(1)
LoadGame=ReadFile("Save.txt")
PositionEntity playership,ReadString(LoadGame),ReadString(LoadGame),ReadString(LoadGame)

CloseFile(LoadGame)
EndIf
DrawText " Загрузить ",x1+30,155
EndIf
If TestImage (MouseX(),MouseY(), x1-5,270, button) Then
DrawText " Выход ",x1+30,255
EndIf

LoadGame=ReadFile("Save.txt")
DrawText "  " +ReadString(LoadGame)+ "  " +ReadString(LoadGame) + "  " +ReadString(LoadGame),300,200
CloseFile(LoadGame)


RlexGm 25.05.2010 11:57

Ответ: Чтение и запись в фаил.
 
если все координаты грузятся правильно, то возможно у тебя он сталкивается со стенами.У меня было такое.Команда PositionEntity переносит, но если по пути встречается объект, с которым установлена колизия, то он сталкивается с ним. Юзай HideEntity и ShowEntity, а еще лучше сначало позиционируй потом грузи карту в цикле(за 1 проход естественно)

Fatal 25.05.2010 12:00

Ответ: Чтение и запись в фаил.
 
Ща попробую

Fatal 25.05.2010 12:06

Ответ: Чтение и запись в фаил.
 
Спасибо большое. Действительно, дело было в том, что он останавливался при столкновении. Нужно было сделать инферсию загрузки коардинат ( спасибо impersonalis ) и скрыть модель игрока на время его перемещения.

Damp 26.05.2010 09:38

Ответ: Чтение и запись в фаил.
 
PositionEntity player,ReadString(LoadGame),
мне кажется, значние ReadString(LoadGame) не факт, что во float будет преобразовано.
Лучше наверно явно указать:
x#=Float(ReadString(LoadGame))
PositionEntity player,x#,

impersonalis 26.05.2010 10:44

Ответ: Чтение и запись в фаил.
 
Damp, см. пост номер 4
Fatal, смотри ещё:
http://forum.boolean.name/showpost.p...1&postcount=51
51ый пост в теме www.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ
Создаём свой FPS (first person shooter)

Damp 26.05.2010 18:54

Ответ: Чтение и запись в фаил.
 
Ага ) продублировал, можно сказать.

Просто чего-то вспомнилось, в какой-то математике, пока не поставил 3.0 вместо просто 3 (без точки), ничего не получалось, т.е. надо было явно указывать, что имеешь ввиду float даже для просто цифры. Вобщем надо "явно указывай перобразование типов" +1

Nex 27.05.2010 05:20

Ответ: Чтение и запись в фаил.
 
Наверно вместо String лучше использовать WriteLine/ReadLine.

Fatal 28.05.2010 16:42

Ответ: Чтение и запись в фаил.
 
От этого ничего не менялось, я пробовал.

RegIon 11.06.2010 08:39

Ответ: Чтение и запись в фаил.
 
я так гружу:
Код:

Function loadsettings(puth$)


If FileType(puth$)=1
.load
  set=OpenFile(puth$)
  graphsize=ReadLine(set)
  colorit=ReadLine(set)
  volummus=ReadLine(set)
  volumsou=ReadLine(set)
  ;key
  move_up=ReadLine(set)
  move_down=ReadLine(set)
  move_left=ReadLine(set)
  move_right=ReadLine(set)
  move_jump=ReadLine(set)
  move_sest=ReadLine(set)
  key_fun=ReadLine(set)
  key_bar_op=ReadLine(set)
  key_bar_left=ReadLine(set)
  key_bar_right=ReadLine(set)
CloseFile(set)
Else
  in=WriteFile(puth$)
  WriteLine(in,0)
  WriteLine(in,16)
  WriteLine(in,80)
  WriteLine(in,50)
  WriteLine(in,200)
  WriteLine(in,208)
  WriteLine(in,203)
  WriteLine(in,205)
  WriteLine(in,57)
  WriteLine(in,23)
  WriteLine(in,0)
  WriteLine(in,0)
  WriteLine(in,0)
  WriteLine(in,0)
CloseFile(in)
Goto load
EndIf
End Function



Часовой пояс GMT +4, время: 22:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot