подготовка
Итак… 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
А как по-вашему: у нас есть описание действия «создать игрока» и пустой цикл.
Для начал надо вызвать функцию создания перед главным циклом:
Затем: ну да – в памяти мы создали и сферку и камеру – а дальше то что? Как минимум надо это всё обработать как геометрические объекты и отрисовать в BackBuffer . Добавим в главном цикле команду:
Ещё одна неувязочка: на экране находится при двойной буферизации FrontBuffer, а менять содержимое буферов мы будем командой
После такой перекройки программа должна выглядеть примерно так:
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 Но на самом деле всё рисуется – сфера которую вы не видите, потому что «не можете наклонить голову» и… всё – больше в мире пока ничего нет.
Нам нужна земная твердь. И обязательно текстурка для неё. Ведь компьютер без дополнительных инструкций строит идеальные видео образы – абсолютно ровную поверхность земли (на самом деле мелкие неровности пока тоже ничего бы не дали – нет освещения – которое и позволяет видеть объёмную картину мира , без света всё будет казаться «плосокватым») так что вы просто увидите светлый прямоугольник занимающий часть экрана. Для примера – стандартная Блитц-текстура:
Опять же прибегая к упрощениям – земля будет в виде бесконечной ровной поверхности – создадим её плэйном:
затем загрузим текстурку
tertex=LoadTexture("terrain1.jpg")
и наложим её на поверхность
EntityTexture terrain,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
ПРОДОЛЖЕНИЕ СЛЕДУЕТ