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

Зачем разделять? Это только усложнит.
Псевдокод:
Local entityKind$ ;чтоб знать кому параметры устанавливать, можно int-ом сделать
Local bReadParams% ;флаг - состояние чтения ключевых слов (false) или параметров (true)
Local strLine$, cmdName$,  ;текущая строка, считанная из файла, имя параметра
Local tree.TTree ;ссылка на текущее создаваемое дерево, и так перечисляешь здесь все возможные типы создаваемых объектов. по хорошему тут должен быть тип базового класса, но классов тю-тю в блитце
Local entity% ;можно один указатель на все создаваемые модельки сделать, и его присваивать
Dim cmdParams$(0) ;пустой пока, сюда будем вставлять параметры типа x,y,z. приходится делать глобальный массив, т.к. в блитце нельзя возвращать массив из функций, массивы всегда глобальные. чтоб освободить память пишешь в "любом" месте Dim cmdParams$(0) - размер ноль.
................
strLine = ReadLine(file)
If(bReadParams = False) ;если не параметры, то ключевые слова ищем
	If(strLine = "tree {")
		;тут создаём например
		tree = New TTree
		entityKind = "tree"
		bReadParams = True ;дальше будем параметры читать
		strLine = ReadLine(file) ;чтоб не пропускать цикл сразу следующую строку читаем
	EndIf
	If(bReadParams = True)
		cmdName = GetCmdName(strLine) ;возвращает значение до символа "=", твоя функция
		If(cmdName = "}") ;параметры кончились
			If(entityKind = "tree") 
				tree\ent = entity ;присваиваем дереву
			Else If(.....)
				
			EndIf
			entity = 0 ;временного объекта теперь нет, он стал деревом :)
		Else  ;читаем общие для всех моделек параметры
			GetCmdParams(strLine, ",") ;твоя функция, разбивает то что после "=" по символу, 
			;идущему вторым параметром функции, и записывает в массив, размерность массива внутри функции переопределяется в зависимости
			;от количества найденных символов-разделителей
			;например для параметра "model" массив будет размерностью 1 и содержать путь к модельке (например, ты можешь хоть чё вставить)
			If(cmdName = "model")
				entity = LoadMesh(cmdParams(0))
			EndIf
			;
			If(entity <> 0)
				Else If(cmdName = "position")
					PositionEntity entity,Float(cmdParams(0),Float(cmdParams(1),Float(cmdParams(2)
				Else If(cmdName = "scale")
					ScaleEntity entity,Float(cmdParams(0),Float(cmdParams(1),Float(cmdParams(2)
				Else
					;и т.д.
				EndIf
			EndIf
			;плюс проверка наличия индивидуальных параметров, присущих только деревьям (и другим уникальным объектам)
			If(entityKind = "tree")
				If(cmdName = "enable_wind") ;воздействует ли ветер
					tree\bWindEnable = Int(cmdParams(0))
				EndIf
			EndIf
			
		EndIf
	EndIf
EndIf

Последний раз редактировалось Жека, 11.04.2012 в 13:15. Причина: комментарий к Dim дописал
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (11.04.2012)