Я обещал написать статью о разработанным мною способе легко создавать карты (уровни) для игр.
(чтобы некоторые не сомневались в моих возможностях!)
Статья как мне кажется расщитана для новичков, вроде меня.
Итак, приступим.
Предположим у нас на уровне будут такие объекты: деревья, дома, стены ну и, например фонтаны (У меня слабая фантазия!)
Нарисуем модели этих объектов в 3д редакторе.
Теперь дальше.
Пусть
1 - это дерево
2 - дом
3 - кусок стены
4 - фонтан
Карта будет такая - покроям стена, внутри деревья и дома, а в середине - фонтан.
Теперь открываем блокнот, да обычный блокнот, и пишем та следующее:
33333333333333333333
30000000000000000003
30000011100000000003
30000022000020000003
30000000000000000003
31000000100000000003
30000000000000000003
30000000000000000003
32000000000000000003
30000000400000200003
30000000000000000003
30000000100000000003
30000000000000000003
30000000000000000003
30000000002000000003
30000000000000000003
32000000000100000003
30000100000000000003
30000000000000000003
33333333333333333333
Принципе, можно вместо нулей поставит пробелы, ни те ни другие всё равно не будут читается нашим алгоритмом.
Это будет наша карта.
Сохраняем это в файл типа "level1.map"
Расширение значения не имеет!!!
Теперь далее.
Создадим, где ни будь вначале два массива:
Dim Map(20,20);массив карты
Dim Obg(20,20);массив объектов (домов, деревьев...)
Числа 20 и 20 обозначают длину и ширину карты (циферок в нашем файле), можно сделать больше, но не меньше, (ещё нужно, чтобы они были равны)
Напишем функцию, которая читает карту.
Function ReadMap(mapfile) ;начало функции
mapSize% = 20 ;количество знаков в одной строке
filein = ReadFile(mapfile) ;открываем карту
mapLines = 1 ;с какой строки нужно читать
;пустая строка (самая главная часть алгоритма )
While Not Eof(filein) ;цикл пока не прочитается карта
mapStr$ = ReadLine$( filein ) ;читает строку номер которой хранится в переменой mapStr
For i=1 To MapSize ;цикл с еденички по кол-во строк, которые хранились в mapSize
Map(mapLines,i) = Int( Mid(mapStr,i,1 )) ;вытаскиваем символ из строки mapStr номера i ,преобразуем в целое число и записываем в массив
Next ;конец цикла, прочитана одна строка и записана в массив
mapLines = mapLines + 1 ;водим новую строку в mapLines (следующую)
Wend ;конец цикла, карта прочитана и занесена в массив
CloseFile(filein) ;закрываем файл
End Function ;конец функции
Фух, карта прочтена и занесена в массив Dim Map(20,20). Круто!!! Теперь наша карта в оперативки нашего компа!!!
Теперь надо разобрать комп, вытащить оперативку, разломать микросхему и нарисовать таки нашу карту!!!

Ладно, кодим дальше.
Загружаем модельки и скрываем, чтобы не мешали
global model1=loadmesh("derevo.3ds")
HideEntity model1
global model2=loadmesh("dom.3ds")
HideEntity model2
global model3=loadmesh("stena.3ds")
HideEntity model3
global model4=loadmesh("fontan.3ds")
HideEntity model4
Напишем функцию рисования карты.
Function createMap() ;начало функции
For x=1 To mapSize ;начало цикла x-строки
For y=1 To mapSize ;начало цикла у-номер символа в строке
If Map(x,y) <> 0 ;условие на существующесть
Select Map(x,y) ;начало выбора из массива
Case 1 ;случай когда данное равно 1
Obg(x,y)=CopyEntity(model1) ;копируем модель номер 1
Case 2 ;/---/ 2
Obg(x,y)=CopyEntity(model2) ;/---/ 2
Case 3
Obg(x,y)=CopyEntity(model3)
Case 4
Obg(x,y)=CopyEntity(model4)
End Select ;конецц выбора
PositionEntity Obg(x,y),x*a, b, y*c ;выставляем всё по местам (с а, b и с нужно поиграть! )
EntityType Obg(x,y), typestena ;ставим тип для коллизии (если надо)
EndIf ;вобщем запарился комментировать каждую строку, дальше и так всё ясно!
Next
Next
End Function
вот и всё!
простейший алгоритм загрузки карты готов!
Но все объекты располагаются на одной высоте(b),а если наш левел лежит на терране (ландшафте)???
тогда поменяем строку
PositionEntity aCube(x,y),x*a, b, y*c
на эти:
q=entityx(Obg(x,y))
w=entityy(Obg(x,y))
e=entityz(Obg(x,y))
tera=TerrainY(terrain,q,w,e)
PositionEntity aCube(x,y),x*a, tera, y*c
Теперь наш левел будет находится на терране.
Теперь можно сохранить несколько левелов и по прохождению каждого удалить старый левел и загрузить новый, вызвав эти две функции.
А вот на последок функция удаления старого левела.(без комментариев

)
Function deletemap
For x=1 To mapSize
For y=1 To mapSize
If Map(x,y) <> 0
freeentity Obg(x,y)
endif
next
next
End Function
Если честно эту функцию я не проверял, я её только что придумал!
В следующий раз, может быть, расскажу о визуальном редакторе (короче чтоб ни блокноте всё это дело печатать),
если у самого получится!
The end!!!
З.Ы.: мог что то напутать английский плохо знаю!!!