Показать сообщение отдельно
Старый 04.09.2005, 06:03   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
подготовка
Итак… FPS… конечно же 3D! Запускаем компилятор и смело вбиваем
Graphics3D 800,600,32
SetBuffer BackBuffer()
чуть ниже организовываем цикл, это будет главный цикл программы MAIN LOOP. Оформляйте его любыми операторами цикла, я, лично, сделаю так:
While Not KeyHit(1)=1
Wend
end
тут всё должно быть ясно как день:
цикл крутится пока Не ПрерываниеОтКнопки (Escape)
команда END в данном случае – чистый формализм: после инструкции WEND у нас в коде ничего нет, таким образом, после выхода из цикла программа и так завершится. Но всё же я настоятельно рекомендую не пренебрегать подобными формальностями!
Уже можно давить F5 – и любоваться … космосом… без звёзд…
Теперь займёмся камерой… даже - лучше сразу игроком
Опять же: я настоятельно рекомендую заключать подобные знаковые участки кода в тела функций. Поэтому где-нибудь повыше напишем:
Function create_user()
End Function
Если Вы затрудняетесь определить: «где же это самое то место» - в принципе Блитцу всё равно, но я настоятельно рекомендую объявлять все функции перед главным циклом (а так как это не С++, то и писать тела функций там же), а поскольку в функции будут использоваться команды работы с 3d-объектами объявить их надо после строчек
Graphics3D 800,600,32
SetBuffer BackBuffer()
Надеюсь, с местом определились.
Теперь передаваемые в функцию аргументы… Думаю, удобно будет задавать ими место появления игрока. С другой стороны, практически всегда у нас он появляется в 0,h#,0 – в центре карты на небольшом расстоянии от земли, поэтому пишем следующее:
Function create_user(x#=0,y#=1,z#=0)
End Function
Теперь подумаем о физической модели игрока… В масштабах этого манула, позволительно допустить: игрока никто не видит, и камера как в FPS. Значит не стоит отвлекаться на фактический внешний вид игрока. У нас должна быть точка опоры и над ней (на некотором расстоянии) камера. А это, имхо, самый простой и надёжно работающий способ решения:
user=CreateSphere()
camera=CreateCamera(user)
PositionEntity camera,0,1,-0.5

PositionEntity user,x#,y#,z#
набираем мы в функции. Сам пользователь – это будет сфера (та самая точка) к которой прикреплена камера : в координатах 0,1,-0.5 относительно сферы. Камера прикрепляется сразу после создания, т.к. ей задан родитель (парент) в качестве аргумента. Затем происходит её позиционирование, и затем позиционирование самого игрока.
Запускаем… И снова темнота :sad
А как по-вашему: у нас есть описание действия «создать игрока» и пустой цикл.
Для начал надо вызвать функцию создания перед главным циклом:
create_user()
Затем: ну да – в памяти мы создали и сферку и камеру – а дальше то что? Как минимум надо это всё обработать как геометрические объекты и отрисовать в BackBuffer . Добавим в главном цикле команду:
RenderWorld()
Ещё одна неувязочка: на экране находится при двойной буферизации FrontBuffer, а менять содержимое буферов мы будем командой
Flip
После такой перекройки программа должна выглядеть примерно так:
Graphics3D 800,600,32
SetBuffer BackBuffer()

Function create_user(x#=0,y#=1,z#=0)
 user=CreateSphere()
camera=CreateCamera(user)
PositionEntity camera,0,1,-0.5

PositionEntity user,x#,y#,z#

End Function

create_user()
While Not KeyHit(1)=1
RenderWorld()
Flip
Wend
End
Снова запускаем – и опять темнота… :surpr Но на самом деле всё рисуется – сфера которую вы не видите, потому что «не можете наклонить голову» и… всё – больше в мире пока ничего нет.
Нам нужна земная твердь. И обязательно текстурка для неё. Ведь компьютер без дополнительных инструкций строит идеальные видео образы – абсолютно ровную поверхность земли (на самом деле мелкие неровности пока тоже ничего бы не дали – нет освещения – которое и позволяет видеть объёмную картину мира , без света всё будет казаться «плосокватым») так что вы просто увидите светлый прямоугольник занимающий часть экрана. Для примера – стандартная Блитц-текстура:





Опять же прибегая к упрощениям – земля будет в виде бесконечной ровной поверхности – создадим её плэйном:
terrain=CreatePlane()
затем загрузим текстурку
tertex=LoadTexture("terrain1.jpg")
и наложим её на поверхность
EntityTexture terrain,tertex
ну и для профилактики очистим память из под текстуры – она нам больше не понадобиться:
FreeTexture tertex
Ах да всё это должно быть набрано после инициализации графики но перед циклом.
И ещё немного подумав, объединим вызов ф-ции создания игрока и создание мира в одну функцию:
Graphics3D 800,600,32
SetBuffer BackBuffer()


Function create_user(x#=0,y#=1,z#=0)
 user=CreateSphere()
camera=CreateCamera(user)
PositionEntity camera,0,1,-0.5

PositionEntity user,x#,y#,z#

End Function

Function create_world()
terrain=CreatePlane()
tertex=LoadTexture("terrain1.jpg")
EntityTexture terrain,tertex
FreeTexture tertex
create_user()
End Function

create_world()

While Not KeyHit(1)=1
RenderWorld()
Flip
Wend
End
Та-дам! Запускаем, наслаждаемся :D

ПРОДОЛЖЕНИЕ СЛЕДУЕТ
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием