Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 23.02.2010, 12:13   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Левелы для начинающих

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


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

Последний раз редактировалось den, 23.02.2010 в 15:40.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (24.02.2010)
Старый 23.02.2010, 13:24   #2
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Левелы для начинающих

Сообщение от Den Посмотреть сообщение
З.Ы.: мог что то напутать , английский плохо знаю!!!
Ну, поди, лучше русского.

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

(Offline)
 
Ответить с цитированием
Старый 23.02.2010, 13:43   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Левелы для начинающих

Ну что, ваше мнение улутшилось о моих возможностях?
(Offline)
 
Ответить с цитированием
Старый 23.02.2010, 14:07   #4
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Левелы для начинающих

А зачем вы переместили мою тему в раздел Юмор?
Это тема про лэвэлы, чё тут смешного?
Почему практически все темы которые я сделал либо удоляют либо переносят в раздел Юмор?
(Offline)
 
Ответить с цитированием
Старый 23.02.2010, 22:35   #5
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений
(для 95 пользователей)
Ответ: Левелы для начинающих

Den
Копипастим?
Где то уже я видел ету статью
вроде в сборнике уроков для блиц 13 lessons
__________________
StimuL
Maks
(Offline)
 
Ответить с цитированием
Старый 23.02.2010, 22:36   #6
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений
(для 95 пользователей)
Ответ: Левелы для начинающих

Сообщение от Den Посмотреть сообщение
Ну что, ваше мнение улутшилось о моих возможностях?
Игру сделай, а там и спрашивать не прийдеться
__________________
StimuL
Maks
(Offline)
 
Ответить с цитированием
Старый 24.02.2010, 02:01   #7
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,366
Написано 2,476 полезных сообщений
(для 6,864 пользователей)
Ответ: Левелы для начинающих

KingMaks, юзай правку. Нафиг сообщения плодишь?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com