Показать сообщение отдельно
Старый 12.03.2012, 22:48   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Загрузка картинок

Надеюсь, не опоздал!
Простыня та-ды-дыщь:

Функция загрузки (она только составляет список имеющихся картинок в директории):
InputFolder имя директории
del_prev флаг - удалить ли уже прочитанную ранее инфу
возвращаемое значение - кол-во найденных (за этот вызов функции) файлов
Function InputDirRead%(InputFolder$,del_prev%=True)
	If del_prev Then Delete Each tFILE
	Local D%=ReadDir(InputFolder)
	Local FileName$
	Local FullFileName$
	Local TotalC%=0
	While True
		FileName=NextFile(D)
		If FileName="" Exit
		FullFileName=InputFolder+"\"+FileName
		If FileType(FullFileName)=1
			Local EXT3$,EXT4$
			;будем рассматривать лишь файлы с расширением длиной 3 и 4 символа
			EXT4=Upper(Right(FileName,4))
			EXT3=Upper(Right(FileName,3))
			Local EXT$=""
;туто можно настроить поддеркжу форматов - сделано топорно, ибо под жёсткое ТЗ
			If EXT3="BMP" Or EXT3="JPG" Or EXT3="PNG" Or EXT3="GIF"
				EXT=EXT3
			ElseIf EXT4="JPEG"
;меня бесит расширение JPEG, потому в информацию о файле пропишу его как JPG
				EXT="JPG"
			EndIf
;если расширение определено - информация о файле будет добавлена
			If EXT<>""
				Local F.tFILE=New tFILE
				F\FullFileName=FullFileName
				F\FileUEXT=EXT
				F\FileShortName=FileName
				F\ID=TotalC+1
				TotalC=TotalC+1
			EndIf
		EndIf
	Wend
	CloseDir(D)
	Return TotalC
End Function
Собственно экземпляр инфы о файле:
Type tFILE
	Field FullFileName$;абсолютное (с именем папки, переданной в функцию загрузки) имя файла
	Field FileUEXT$;расширение файла (в верхнем регистре)
	Field FileShortName$;имя файла (с расширением)
	Field ID%;индекс файла при чтении (после перемешивания первый прочитанный файл может оказаться в конце)
End Type
это тоже понадобиться (сюда мы потом переместим структуры для более удобной работы)
Dim LIST.tFILE(0)
После работы - очищаем информацию
Function InputDirDeRead()
	For f.tFILE=Each tFILE
		Delete f
	Next
	Dim LIST(0)
End Function
Функция выгрузки считанной инфы в массив, для работы (перемешивание)
cnt -кол-во объектов (чтобы их не пересчитывать)
Function tFILE2LIST(cnt%)
	Dim LIST(cnt)
	Local i=1
	For f.tFILE=Each tFILE
		LIST(i)=f
		i=i+1
	Next 
End Function
После выгрузки в массив, вызываем эту функцию для перемешивания содержимого
cnt -кол-во объектов
Function LISTrandomize(cnt%)
	If cnt<2 Return
	Local tmp.tFILE
	Local factor%=cnt*2.0;количество перестановок - побирается на вкус; у меня - кол-во файлов х 2
	
	Local A%=1;первый файл будет гарантировано участвовать в перемешивании
	Local B%=Rand(1,cnt);практика показала, что 1-ый файл слишком часто оставался нетронутым
	For i=1 To factor
;такая модель перестановок может (с уменьшающейся вероятностью вообще ничего не переставить)
; см подробнее: http://forum.boolean.name/showthread.php?t=15658
		tmp=LIST(A)
		LIST(A)=LIST(B)
		LIST(B)=tmp
		A%=Rand(1,cnt)
		B%=Rand(1,cnt)
	Next
End Function
Получить файл
I -индекс текущего файла
Function GetNextFile.tFILE(I%)
;думаешь: чо за тупая функция? просто у меня файл перед взятием его получал дополнительную информацию в свои поля
	Return LIST(I)
End Function
Демо:
Dim LIST.tFILE(0)
Global TCnt=InputDirRead("Pic");загрузим информацию о файла в папке Pic
TCnt=TCnt+InputDirRead("Pic2",False);догрузим информацию из папки Pic2
;...

Global ReadIndx%=TCnt+1;текущий читаемый индекс
tFILE2LIST(TCnt);выгружаем информацию в массив (вернее - указатели* сохраняются в массив для удобства: удалять экземпляры нельзя пока)
;...

While True;некоторый цикл получения случайных картинок
	If ReadIndx>TCnt;если уже перебрали весь список - перемешаем его заново и начнём сначала
		LISTrandomize(TCnt)
		ReadIndx=1
	EndIf
	Local file.tFILE=GetNextFile(ReadIndx);получить указатель* на структуру, содержащую информацию о файле
ReadIndx=ReadIndx+1
;...
Wend
InputDirDeRead();очистим
Собственно, выполнишь 15 итераций цикла из демки. На каждой итерации грузишь файл
Loadtexture(file\FullFileName)
и накладываешь на N-ый меш.
И да:
Нужно сделать так, что бы из папки брались картинки и рандомно применялись к моделям картин, причем если картинок больше чем нужно, брались наугад из них 15 без повторений, а если меньше, в случайном порядке повторялись.
Причем файлы картинок могут называться как угодно.
Причём повторяться (в случае "а если меньше") они будут минимальное число раз. Т.е. если у тебя 14 картинок (а мешей - 15), то повторений будет 2 (на двух мешах одна и та же текстура).

Ну - а у меша, сделать именованный полигон, с корректно выставленными uv координатами. Загрузить меш, раскопировать его на 15 объектов - всё очевидно.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
Arles (15.03.2012), Gector (11.06.2012), Harter (13.03.2012), LLI.T.A.L.K.E.R. (13.03.2012), mauNgerS (13.03.2012), m_512 (12.03.2012), m_s (18.05.2012), Randomize (13.03.2012), St_AnGer (12.03.2012)