forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Левелы для начинающих (http://forum.boolean.name/showthread.php?t=12012)

den 23.02.2010 12:13

Левелы для начинающих
 
Я обещал написать статью о разработанным мною способе легко создавать карты (уровни) для игр.
(чтобы некоторые не сомневались в моих возможностях!)
Статья как мне кажется расщитана для новичков, вроде меня.
Итак, приступим.
Предположим у нас на уровне будут такие объекты: деревья, дома, стены ну и, например фонтаны (У меня слабая фантазия!)
Нарисуем модели этих объектов в 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!!!


З.Ы.: мог что то напутать английский плохо знаю!!!

.Squid 23.02.2010 13:24

Ответ: Левелы для начинающих
 
Цитата:

Сообщение от Den (Сообщение 138972)
З.Ы.: мог что то напутать , английский плохо знаю!!!

Ну, поди, лучше русского.

Для новичка пойдет. Разбирайся дальше.

den 23.02.2010 13:43

Ответ: Левелы для начинающих
 
Ну что, ваше мнение улутшилось о моих возможностях?;)

den 23.02.2010 14:07

Ответ: Левелы для начинающих
 
А зачем вы переместили мою тему в раздел Юмор?
Это тема про лэвэлы, чё тут смешного?
Почему практически все темы которые я сделал либо удоляют либо переносят в раздел Юмор?
:crazy: :) ;)

KingMaks 23.02.2010 22:35

Ответ: Левелы для начинающих
 
Den
Копипастим?
Где то уже я видел ету статью
вроде в сборнике уроков для блиц 13 lessons

KingMaks 23.02.2010 22:36

Ответ: Левелы для начинающих
 
Цитата:

Сообщение от Den (Сообщение 138982)
Ну что, ваше мнение улутшилось о моих возможностях?;)

Игру сделай, а там и спрашивать не прийдеться:)

Randomize 24.02.2010 02:01

Ответ: Левелы для начинающих
 
KingMaks, юзай правку. Нафиг сообщения плодишь?


Часовой пояс GMT +4, время: 12:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot