Баг-фикс
Я всё-таки почти человек, поэтому ничего странного, что забыл дописать ещё вот что: Код:
Function update_bot() |
Чит-мод :)
Попробуйте включить в функцию обработки игрока строку Код:
If MouseDown(2) create_shot(EntityX(user),EntityY(user),EntityZ(user),EntityPitch(camera),EntityYaw(user),0) |
Релиз
В аттаче полностью рабочая версия описанной здесь программы. Со всеми ресурсами :grins http://boolean.name/archive/code/Example%2...0FPS%20v1.0.rar |
Уход от полного перебора
Как и обещал, расскажу, как улучшить цикл обработки выстрелов. В Блитце есть недокументированные команды Handle и Object. Благодаря команде Handle можно получить "указатель" на объект типа (использование термина "указатель" весьма спорно для Блитца). Например: Код:
P.Player=New Player Код:
P.PLAYER=Object.PLAYER(pHANDLE) Модифицируем функцию create_bot Код:
Function create_bot(x#,y#,z#) содержащего данный объект. Теперь модифим кусок функции update_shot() Код:
Function update_shot() Код:
bhandle=EntityName(bot_h) Код:
bc.bot=Object.bot(bhandle) Код:
FreeEntity bot_h производительность. |
Уход от привязки к FPS
Frames Per Second В текущей версии программы события (а именно: обновление ботов, игрока, выстрелов) будут происходить с частотой вызова соответствующих ф-ций. Т.е. (как видно из записи главного цикла) с частотой прорисовки - ФПС. А значит напрямую будут зависеть от производительности системы. Избавиться можно 2мя способами: :?? 1) Производить обновление N раз в секунду - что приведёт к принудительному занижению высоких ФПС и скачкообразной анимации. :?? 2) Рассчитывать переменные скорости, ускорения и проч. в соответствии с дельтой времени. Что сейчас и сделаем. Так как в следующих версиях алгоритма или уже в этой ( при большом кол-ве ботов) время начала обработки первого и последнего ботов вероятно будет отличаться на целое кол-во мс и так же потому, что глобальные переменные делают программу, имхо, менее удобочитаемой и переносимой, а так же плодят логические ошибки (из-за ошибок при вводе имени) - для каждого бота сделаем собственное время последнего обновления. Код:
Type bot Код:
Function update_bot() Переменная v# должна получиться универсальным значением для всех ПК (однако Вы можете откалибровать её по-точнее). Проделаем операцию ухода... для выстрелов: Код:
Type shot Код:
Function update_shot() Теперь сам игрок. Поскольку мультиплеером в игре и не пахнет - игрок реализован не типизированным объектом и он один. Заведём для его обновления глобальную переменную: Код:
Global user_time Код:
Function update_user() Код:
Const G#=0.1 |
Небесная сфера
Вопреки названию, будем создавать не сферу, а SkyBox - коробку, так как для неё проще изготовить текстуру и смотрится, имхо, она красивее. Возьмём стандартную функцию создания из примеров блитца (\Samples\Blitz 3D Samples\AGore\GrassDemo): Код:
Function MakeSkyBox( file$ ) использование ф-ций: в любой момент вы можете использовать свои наработки в других проектах. Переместимся в функцию create_world() Код:
create_user() программы. Уже сейчас можно посмотреть на результат, правда, сомнительный. Из-за недостаточных размеров skybox`а небо ощутимо квадратное: Отскалим небо Код:
ScaleEntity sky,150,150,150 Вероятно оно за максимальным радиусом ренедера. глянем в create_user - именно здесь мы обрезали расстония рендера, правим: Код:
CameraRange camera,0.1,10000 |
Релиз
В аттаче полностью рабочая версия (уже 2ая)описанной здесь программы. Со всеми ресурсами :grins http://boolean.name/archive/code/Example%2...0FPS%20v2.0.rar |
Живучие боты
Бот, умирающий от одного залпа, - это, кончено весело, но не интересно. Добавим ботам шкалу жизни. Итак, переходим в объявление типа и правим: Код:
Type bot Код:
b\Survivability=100 Код:
ElseIf bot_h<>0 Теперь равновесие сместилось в пользу ботов - за это понизим им скорость передвижения: Код:
Function update_bot() |
Жизнь в коробке
Рано или поздно, надо чётко обазначить границы игрового мира. После добавления в игру SkyBox, это становится необходимо сделать. Модифицируем ф-цию создания неба и сохраним её под новым именем (прототип тоже надо оставить в коде): Код:
Function MakeBox() Код:
border=MakeBox() Теперь поставим этой коробке в соответствие тип для колизии Код:
Const BORDERT=5;for box Код:
EntityAlpha border,.5 Код:
Collisions USERT,BORDERT,2,1 Теперь, если идти в одну сторону, в какой-то момент вы просто упрётесь в стену. Ставим стене нулевую альфу и растягиваем её. Код:
border=MakeBox() |
кодим-кодим
Что-то управление больно казуальным вышло. :unsure: Перенастроим движение на W,S,A,D. Функция update_user() Код:
If KeyDown(30)=1 Then MoveEntity user,-V#,0,0 |
Прыжки и реалистичность физики
давно пора было это сделать Для нормальной реализации кинематики нам понадобится: 1)контроль за отрывом от земли и моментом соприкосновения с ней. Код:
EntityPickMode terrain,2 Код:
Global jump_bool Код:
;физика Код:
Text 10,10,"jump_bool="+jump_bool Запустим. И увидим, что программа работает неверно. jump_bool=1, т.е. условие If pick_ent не срабатывает, т.е. LinePick возвращает 0, т.е. на расстоянии 3 ед. под игроком ничего "не цепляется" командой Pick =( Вообще в этой точке будет как раз соприкосновение сферы игрока и земли, так что надо попробовать увеличить расстояние - методом калибровки подбираем значение=3.6 Код:
pick_ent=LinePick(EntityX(user,1),EntityY(user,1),EntityZ(user,1),0,-3.6,0) Код:
user=CreateSphere() Код:
EntityRadius user,k# Теперь значение jump_bool характеризует состояние игрока - есть или нет сцепления. 2)время невзаимодействия с землёй. перепишем обновление игрока ещё раз Код:
;физика 3)скорости движения для их динамического изменения. Код:
Global user_vy# Код:
pick_ent=LinePick(EntityX(user,1),EntityY(user,1),EntityZ(user,1),0,-3.6,0) Код:
TranslateEntity user,0,user_vy#*delta_t,0 после некоторых раздумий подправим физику: Код:
pick_ent=LinePick(EntityX(user,1),EntityY(user,1),EntityZ(user,1),0,-3.6,0) Однако теперь объект не смещается вниз, пока его не сдвинут вперёд-назад или влево-вправо. Я думаю, логика игры не пострадает, если предположить, что человек, прыгая вверх чуть-чуть смещается вперёд. Код:
TranslateEntity user,0,user_vy#*delta_t,user_vy#*0.01,True |
Релиз
В аттаче обновление кода http://boolean.name/archive/code/ES_FPS_3_codeUp.rar Необходимые ресурсы, можно взять из более ранней версии программы http://boolean.name/archive/code/Example%2...0FPS%20v2.0.rar :glag: |
Можно прочитать вышеизложенное и здесь:
http://blitzetc.boolean.name/fps.htm |
:o
Что-то нето.. Во время игры, точнее стрельбы второй клавишей Рантайм еррор сообщает что не существует Ентити bot_h |
Скачал. Все работает.
Только прыжок нужно более реалистичным сделать: чтобы и при движении вверх ускорение было, а не просто мгновенное перемещение по оси Y. |
Часовой пояс GMT +4, время: 21:42. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot