Показать сообщение отдельно
Старый 11.04.2012, 05:48   #6
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Правильная загрузка конфиг файла

Сообщение от burovalex Посмотреть сообщение
Прикольно!
Мне до такого еще далеко...
Объясните пожалуста, зачем нужна точка в функции CfgLoader_ParseParam.TOneCfgParam(OneLine$)
Т.е. функция пишется специально для этого типа?
После имени любой функции нужно ставить тип возвращаемого ей значения, или ничего не ставить, если не нужно ничего возвращать:
MyIntegerFunction%()   - для интовых якобы можно не ставить, оно по умолчанию int
MyFloatFunction#()
MyStringFunction$()
Т.к. пользовательские типы данных определяются через точку:
myTypeVariable.MyTypeName = new MyTypeName
то чтобы вернуть из функции пользовательский тип, нужно через точку указать его после имени функции.
Вышеуказанная функция возвращает в качестве результата данные типа TOneCfgParam.
Сообщение от burovalex Посмотреть сообщение
И еще, я сейчас пишу загрузчик уровня, прокоментируйте пожалуста какие недостатки и подводные камни могут быть
Мне более удобным кажется хранение уровня в структурированном виде типа такого:
tree {
model="models\tree1.3ds"
scale=x#,y#,z#
position=x#,y#,z#
rotation=x#,y#,z#
и любые параметры тут
}
По такому формату ты проверяешь текущую считанную строку на совпадение с "tree {" и далее пробуешь выцепить все возможные параметры, которые может иметь дерево, пока не дойдёшь до строки, содержащей "}" - на этом перестаёшь дереву что-то искать, начинаешь искать новые ключевые слова: "слово[i] {", и т.д.

Названия параметров отделены от значений символом "=", поэтому считанную строку разбиваешь на две - до равно и после (в блице функция Instr). Значения могут содержать несколько значений, разделить их можно запятой (как выше для x,y,z) или точкой с запятой или ещё чем-нибудь. По этому символу разобьёшь строку и получишь все параметры.

Сохранять такую структуру данных можно сразу из редактора карт.

По коду твоему.
Вместо такого:
Select levelName 
Case levelNameMain 
file=OpenFile("main.lev") 
End Select 

While Not Eof(file)
я бы написал такое:
Local fileName$ = ""
Select levelName 
Case levelNameMain 
fileName = "main.lev"
End Select 

If(FileType(fileName) <> 1) Then RuntimeError("File "+fileName+" not found. Reinstall program.")
file=OpenFile(fileName) 
While Not Eof(file)
Ещё - для перевода строки в число можно писать вот так:
intVal = Int(str$)
floatVal = Float(str$)
если строка начинается не с числа, то получишь ноль. Поэкспериментируй, передавая разные параметры.
(Offline)
 
Ответить с цитированием