Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Glscene   Найти похожие ветки 

 
Trof ©   (2005-01-10 20:49) [0]

Можно ли в glscene хранить уровни в текстовых файлах(но не в ini)? Как
это делается? Тоесть мне нужно загружать в основном фриформы из готовых текстовых файлов. Предположим есть glfreeform1 - как его записать в текстовой файл а потом загрузить в нужный момент? Плиз.


 
miek ©   (2005-01-10 21:40) [1]

Вроде там есть метод SaveToFile, но для актеров он не всегда работает.


 
Мымя   (2005-01-11 02:34) [2]

Если нужны только треугольники, нормали и координаты текстур, то для того есть функция ExtractTriangles . А дальше сохраняй да загружай как хочешь.


 
Trof ©   (2005-01-11 11:41) [3]

Спасибо будем пробовать.


 
Домовенок   (2005-01-11 21:15) [4]

Я делал проще. У меня уровень состоял из 3д моделей заготовленных зарание, в редакторе уровней я делал набор этих моделей как в WarCraft3, и мышкой они растовлялись на поле, после чего сохранялось в файл имя используемой модели, тип (дом, дерево и т.п.), координаты (x, y, z), развороты, наклоны, размеры и другая необходимая информация. Информация об одном объекте в текстовом файле занимала одну строчку.


 
Trof ©   (2005-01-12 15:57) [5]

Домовенок
Вопросик а что за редактор ты использовал, если не секрет а то я совсем замучался ставить  по координатам предметы - почти наугад


 
MsShtaer ©   (2005-02-20 10:37) [6]

Да, вроде можно...


 
Домовенок   (2005-02-20 17:02) [7]

>Trof (12.01.05 15:57) [5]

Свой редактор написал, и мышкой там расставляю объекты, а потом сохраняю и загружаю примерно так как я это описал выше.


 
DeadMeat ©   (2005-02-20 17:23) [8]

Аналогично..
ИМХО так проще...

---
...Death Is Only The Begining...


 
dimodim_REAL   (2005-02-20 23:41) [9]

Редактор легко , а с други т.е сабжем сложно.
Т.е. хранить уровни?


 
Домовенок   (2005-02-21 02:27) [10]

> dimodim_REAL (20.02.05 23:41) [9]

Что-то лично я не понял суть поста.
Уровни в GLScene хранить совсем не сложно.


 
Trof ©   (2005-02-23 16:25) [11]

> Свой редактор написал
Вот на этом то я и стопорнулся!


 
Домовенок   (2005-02-23 18:02) [12]

Ну начнем с того что:

1. "фриформы" ты в текстовых файлах хранить точно не сможешь. В текстовых файлах ты можешь сохранять только окружающею обстановку уровня. То есть расположение всех объектов в сцене. А именно координаты, развороты, и другие необходимые параметры "фриформов".

2. Все модели тебе нужно хранить в своем формате, или просто в отдельной папке которая будет распространяться с игрой/редактором. Из этой папки ты будешь подгружать в сцену необходимые тебе модели в момент считывания файла уровня, и расставлять их по считанным из файла уровня координатам.

3. Текстуры так же необходимо будет хранить отдельно, в виде обычных картинок, что очень не удобно, так как в ручную при загрузке игры приходится прописывать параметры для каждой текстуры, или в родном формате GLMaterialLibrary (SaveToFile), но там, судя по моему опыту, запоминаются отнюдь не все параметры текстуры. Я писал свой формат.

Сохранение уровней

Тут все очень просто, если, к примеру, у тебя есть один GLDummyCube в котором находятся объекты, параметры которых нужно запомнить, то ты просто обращаешься к каждому объекту через цикл и записываешь его параметры в файл. Если у тебя несколько GLDummyCube в которых находятся объекты параметры, которых нужно сохранить, и их количество никогда не меняется, то ты просто должен сделать несколько циклов для каждого DummyCube свой, это самый простой способ сохранения сцены. Чуть сложнее будет уже реализовать сохранение параметров всей сцены, хотя если все правильно организовать, то и здесь особых сложностей не возникнет.

Загрузка уровней

Я делал так: записывал изначально количество строк в текстовом файле, а потом в каждой строке записывал все необходимые параметры, разделяя их любым удобным для меня символом разделителем, по которому потом разбивал одну целую строку на отдельные кусочки. Тем, кому лень писать свой парсер (Parser) строк, обычно сохраняют отдельный параметр с новой строки, что очень не удобно :).

При считывании файла уровня, изначально считывал количество строк, а потом выполнял цилк столько раз сколько в нем было строк. Считывая каждую строку, разбивал её на составляющие и создавал в зависимости от имени объекта (или от другого критерия) новую модель с записанными в строке параметрами.

В файле уровней обычно я хранил следующею информацию:
имя файла модели, имя модели в сцене, x, y, z, rollangle, pichangle, scale.x, scale.y, scale.z и д.р. не столь важные параметры.

Пример такой строки:
BigIsland.MD3 BigIsland 3,49819564819336 3,20661067962646 3,814697265625E-6 0,200000002980232 0 0 22

Редактор

Как написать свой редактор это уже дело каждого. Так как в большинстве случаев пишутся редакторы под определенную игру, и от этого зависят все его возможности. Простые примеры того, как двигать объекты мышкой есть в демках которые поставляются с GLScene.

Думаю, этой информации тебе будет достаточно, что бы примерно представить себе, как можно организовать правильное (удобное) хранение уровней в обычных текстовых файлах. Так же если тебе не лень, то можно вообще написать свой формат хранения уровней, что бы никто не видел той информации, которая там хранится, но это уже отдельный вопрос, ответ на который ты найдешь на любом сайте со статьями по Delphi.


 
Trof ©   (2005-02-24 16:22) [13]

> Домовенок   (23.02.05 18:02) [12]
огромное спасибо, кое-что в моей голове начинает проясняться, ещё полазаю по сайтам о delphi и думаю что-нибудь выйдет.


 
_sHaDe_   (2005-03-06 10:42) [14]

Помогите пожалуста с проблемкой. Пишу редактор.
я добавляю объект на сцену его имя заносится в листбокс, щёлкнув
в листбоксе на имя объекта пробую получить о нём информацию.
Добавляю я объект так:
**********************************************************
Pick:=GLScene1.Objects.AddNewChild(TGLCube);
Pick.Name:="GLCube" + intTostr(Count+1);
Count:=Count+1;
ListBox1.Items.Add(Pick.Name);
**********************************************************
Когда я пытаюсь получить информацию об объекте:
*****************************************************************
Memo1.Lines.Add("Позиция по Х="+ floatTOstr(Pick.Position.X));
*****************************************************************
Он мне говорит либо позицию выделенного объекта(по идее так и должно быть),
либо последнего добавленного. Пробал так
**********************************
pick.Name:= Listbox1.Items.Strings[listBox1.ItemIndex];
*************************************
Но чёто не получается. Короче загвоздка в следущем:
надо щёлкнув на имени объекта в листбоксе сделать так чтобы этот объект стал pick.
Может чё с индексами подумать? Или есть комманда pick.Children[] может можно её как то использовать?


 
DeadMeat ©   (2005-03-06 13:24) [15]

Из того, что я догнал из этого, я так понимаю ты пытаешся обратится к объекту, присвоив ему только имя чтоли?

---
...Death Is Only The Begining...


 
Домовенок   (2005-03-07 00:58) [16]

>_sHaDe_   (06.03.05 10:42) [14]

Мой тебе совет, сделай так:

Функция поиска объекта:

function FindModel(mName: String; DCCube: TGLDummyCube): Integer
var
 i: Integer;
begin
 Result := -1;
 for i := 0 to DCCube.Count-1 do
   if mName = DCCube.Children[i].Name then begin
     Result := i;
     Break;
   end;
end;


Если ты выделяешь ранее добавленный item в ListBox"e делай так в его свойстве OnChange


var
 ModelName: String;
...
 ModelName := ListBox1.Item[ListBox1.ItemIndex];
 Memo1.Lines.Add("Позиция по X="+FloatToStr(TGLActor(GLDummyCube1.Children[FindModel(ModelName, GLDummyCube1)]).Position.X)");
...


Ошибка твоя в том что в Pick.Name у тебя находится данные последнего выбранного (или добавленного) объекта.


 
_sHaDe_   (2005-03-08 11:32) [17]

Спасибо за ответ вчера мне проще подсказали(мож кому понадобиться):
For i:=0 to GlScene1.Objects.count-1 do
If GLScene1.objects.children[i].name=ListBox1.Items.
   strings[listbox1.itemIndex] then Begin
    pick:=GlScene1.Objects.children[i];
      break;
        end;
Работает 100%. Только добавлять объект надо чуть по другому:
Pick:=GLScene1.Objects.AddNewChild(TGLPlane);
  Pick.Name:="TGLPlane" + intTostr(Count+1);
   >Pick.Children[Count+1];<
   Count:=Count+1;
   ListBox1.Items.Add(Pick.Name);
У меня возник такой вопрос как лучше сохранять сцену самому или через: GLScene1.SaveToFile(SaveDialog1.FileName);
И если самому то как.


 
Домовенок   (2005-03-08 12:24) [18]

> _sHaDe_ (08.03.05 11:32) [17]

Да в целом, то что тебе подсказали фактически ничем не отличается от того что я тебе написал ;)

> У меня возник такой вопрос как лучше сохранять сцену самому или через...

Кому как, мне удобнее самому.

> И если самому то как.

Читай выше [12], я писал уже об этом...


 
_sHaDe_   (2005-03-08 13:50) [19]

Не загружается актёр GLScene1.LoadFromTextFile(opendialog4.FileName);
в сохранённой сцене GLScene1.SaveToTextFile(SaveDialog1.FileName);
Есть ли способы решения этой проблемы?


 
Домовенок   (2005-03-08 21:40) [20]

> _sHaDe_ (08.03.05 13:50) [19]

Я сам такой способ сохранения сцены никогда не пользовал. Но на твоем бы месте я заглянул в сохранный файл обычным блокнотом, и посмотрел бы что GLScene туда записал. Сдается мне что он сами модели туда не сохраняет...


 
_sHaDe_   (2005-03-11 17:34) [21]

Он сохраняет путь к ним.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.013 c
14-1116583846
BugMaker
2005-05-20 14:10
2005.06.06
Подскажите, как правильно выделить части URL-адреса?


3-1114659708
Deshifrator
2005-04-28 07:41
2005.06.06
Ошибка метода GetIndexForFields


3-1114431135
normandia
2005-04-25 16:12
2005.06.06
Запрос по месяцам и кварталам


14-1116436236
Yegorchic
2005-05-18 21:10
2005.06.06
Статья про Photoschp CS


14-1116666972
Dels
2005-05-21 13:16
2005.06.06
Тюменские поймут





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский