Author Topic: Как создать Шутер от 1-го лица (серия уроков)  (Read 4479 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
По поводу 3-го урока.
Если вы хотите использовать не статичноую модель оружия, а модель с анимацией рук и оружия, то нужно во время нажатия игроком ЛКМ (если как в уроке) включать анимацию стрельбы, которая включает в себя отдачу. И в этом условии (где событие мыши "нажатие ЛКМ") поставить else а после него анимацию статичного полдожения рук и оружия.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Online Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 892
  • Reputation 63
Плюсанул. Самое трудное в этом деле- создавать уроки для других: это говорить просто о сложном. Продолжай в том же духе. Во времена программирования на Blitz3D видел подобные уроки в сети, для Blitz3D, естественно. Их продают как курс. Здесь:http://www.blitz-school.info/blitzindex.phtml
У нас возможностей побольше, чем в том старом двиге, (но на 2001-2002 гг. это был шедевр.....)
Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Спасибо. Может тоже как-нибудь за книгу по WS3D возьмусь.  :)
А что? Кто знает?  :)
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Снова изменил план. Решил в 4-м уроке сделать:
4. Улучшенное управление Главным героем (камерой): любыми клавишами + прыжок + анимация шагов
5. Добавим озвучивание: фоновая музыка, звуки выстрела, шагов и др.

Мне это показалосьболее логичным. Сам пример к 4-му уроку я уже сделал, осталось написать урок.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
4-й урок снова получается достаточно большим. Так что его придётся поделить на 2. Про анимацию шагов придётся писать отдельный урок,будет он следующим. Сейчас выложу 4-й.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Урок 4 скачать pdf

Обновлённый код:

Code: [Select]
'' ----------------------------------------------------------------------------
'' Название проекта (игры): MyFPS
'' Автор(ы) проекта:
'' Дата начала создания проекта:
'' Дата окончания проекта:
'' ----------------------------------------------------------------------------
'' Краткое описание.
''
''
'' ----------------------------------------------------------------------------
'' Для удобства уберём подключение заголовков, а также разные пользовательские
'' (т.е. созданные вами) функции в отдельный модуль, который мы подключаем здесь,
'' в самом начале проекта.
#include "MyFunctions.bi"
'' Для удобства и порядка в коде можно убрать переменные, первоначальные настройки
'' и меню в отдельные модули и затем здесь подключить их.
'' ------------------------------------------------------------------------------
'' ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
'' Для порядка в коде лучше разделить объявление переменных по типам, тогда сразу
'' будет видно, где какая переменная.

'' [1.] Для работы со звуками
Dim Sounds_Init As FBSBOOLEAN
Dim as Integer hWave,hSound 'для работы со звуком
Dim PlayTime As Integer = 0     'для начала времени проигрывания звука

'' [2.] Объекты WorldSim3D (Меши, Ноды, Текстуры, Камеры, Селекторы и т.д.)
DIM MapMesh as wMesh
DIM MapNode as wNode
Dim MazeTexture As wTexture
DIM Camera as wCamera
DIM CameraNode as wNode
DIM MapCollision as wSelector
DIM BitmapFont as wFont
DIM Collision_anim as wSelector
DIM KeyEvent as wKEY_EVENT PTR
DIM MouseEvent as wMOUSE_EVENT Ptr

Dim GunMesh As wMesh         'для меша оружия
DIM GunNode as wNode         'для нода оружия
Dim GunTexture As wTexture  'для текстуры оружия


'' [3.] Другие переменные, не связанные напрямую с объектами и звуком. Это могут быть
'' разные флаги, счётчики, математика, а также для отладочных целей.
DIM XPOS as single
DIM YPOS as single
DIM ZPOS as single
DIM metrics as wstring * 256
Dim vX as wVECTOR
DIM vY as wVECTOR
DIM vZ as wVECTOR
DIM i As Integer
Dim flag As Integer

'' [4.] Для работы с текстом, если в проекте много разных сообщений, выводимых на экран, например,
'' тексты для меню, диалогов между персонажами, GUI и т.д.
Dim gameover_mes As String

'' [5.] Для сохранения состояния игры, первоначальных настроек игры, таблицы результатов (рекордов)
'' и т.д.

'' [6.] Другие переменные, не вошедшие в предыдущие разделы.
Dim recoil As Integer = 0
Dim recoil_timer As Integer = 1

Dim keyMapArray(5) as SKeyMap
'' Естественно, в зависимосчти от типа вашего проекта, какие-то разделы переменных вам не понадобятся,
'' а какие-то, наоборот, вы захотите добавить.
'' =============================================================================================
'' Запускаем интерфейс WorldSim3D
wStartAdvanced( wDT_OPENGL, 1024, 720, wBITS_PER_PIXEL_32,_
          wWINDOWED, wSHADOWS, wCAPTURE_EVENTS, wVERTICAL_SYNC_ON )

'' ++++++++++++++++++  ПЕРВОНАЧАЛЬНЫЕ НАСТРОЙКИ ПРОЕКТА  ++++++++++++++++++++++++++++++++++
'' Сюда включается всё, что должно быть выполнено только один раз или инициализировано для
'' последующей работы только один раз. Эта часть кода расположена до главного цикла,
'' который начинается с While wRunning. Также здесь расположены функции, инициализирующие
'' работу объектов WorldSim3D, которые будут продолжать работать и в главном цикле:
'' камеры, аниматоры и другие.
'' Также в этом разделе можно сделать работу меню, ведь обычно послезапуска игры сначала
'' появляется меню, из которого можно уже начать игру.

'' ------------------  ИНИЦИАЛИЗАЦИЯ РАБОТЫ ЗВУКОВ  ---------------------------------------
'' Показана на примере одного звука. Возможно вам не нужно озвучивание или вы предпочитаете
'' пользоваться другой звуковой библиотекой. Тогда просто уберите эту часть кода.
'' Расскомметируйте здесь, если вам нужно озвучивание и ниже.
Sounds_Init = fbs_Init(48000) ' инициализируем работу библиотеки FBSound
if Sounds_Init = false then
  ? "error: fbs_Init() !"
  ? FBS_Get_PlugError()
  beep:sleep:end 1
end if

' загружаем файл звука
Sounds_Init = fbs_Load_OGGFile ("media/Dark_Ambience.ogg",@hWave)
if Sounds_Init = false then
  ? "error: fbs_Load_OGGFile() !"
  beep:sleep:end 1
end If
' создаём звук для работы со всеми возможностями библиотеки FBSound
fbs_Create_Sound (hWave,@hSound)
'/
'' ---------------------------------------------------------------------------------------
' Устанавливаем текст заголовка окна приложения
wSetWindowCaption( "My FPS game" )
' загружаем нужный шрифт из папки ресурсов через функцию wGetFont
BitmapFont = wGetFont ( "media/3.png" )

'' ------- ЗАГРУЗКА ИГРОВЫХ ОБЪЕКТОВ НА СЦЕНУ ---------------------------------------------
'' Загрузку игровых объектов (3D моделей, частиц, скайбоксов и др.) на сцену.
'' [1.] Ноды для 3D моделей
wAddZipFile( "media/BSPmaps/ctfcomp02_hazard.pk3", wIGNORE_CASE, wIGNORE_PATHS )

' load the BSP map from the archive as a mesh object. any polygons in the mesh
' that do not have textures will be removed from the scene!
MapMesh = wGetMesh( "ctfcomp02_hazard.bsp" )

' add the map to the scene as a node. when adding the mesh this call uses a
' mechanism called an octtree that if very efficient at rendering large amounts
' of complext geometry most of which cant be seen, using this call for maps
' will greatly improve your framerates
MapNode = wAddMeshToSceneAsOcttree (MapMesh)

' Загружаем в проект модель оружия
GunMesh = wGetMesh( "media/models/pistol.3ds")

' Загружаем текстуру для модели оружия
GunTexture = wGetTexture ("media/models/pistol.jpg")

' Добавляем на сцену нод только что загруженного оружия
GunNode = wAddMeshToScene(GunMesh)

' применяем текстуру оружия к ноду оружия
wSetNodeMaterialTexture (GunNode, GunTexture, 0)

' пока отключим освещение оружия, а то по умолчанию оно будет неосвещённым (чёрным)
wSetNodeMaterialFlag (GunNode, wMF_LIGHTING, wOFF)

wSetNodePosition (GunNode, 7, -3, 12)
'' [2.] Аниматоры Нодов, например, wAddFlyCircleAnimator, wAddRotationAnimator и др.

'' [3.] Камеры, Ноды для них и первоначальные настройки камер
''Camera = wAddFPSCamera

keyMapArray(1).Action = KA_MOVE_FORWARD
keyMapArray(1).KeyCode = KEY_KEY_W
keyMapArray(2).Action = KA_MOVE_BACKWARD
keyMapArray(2).KeyCode = KEY_KEY_S
keyMapArray(3).Action = KA_STRAFE_LEFT
keyMapArray(3).KeyCode = KEY_KEY_A
keyMapArray(4).Action = KA_STRAFE_RIGHT
keyMapArray(4).KeyCode = KEY_KEY_D
keyMapArray(5).Action = KA_JUMP_UP
keyMapArray(5).KeyCode = KEY_SPACE

Camera = wAddFPSCamera ( _
    wNO_OBJECT, _   ' parent, none
    20.0, _           ' rotate speed
    0.07, _             ' move speed
    -1, _              ' camera ID
    @keyMapArray(1), _ ' the address of the keyMap
    5, _               ' number of entries in the keymap
    0, _               ' no vertical movement
    3.0 )              ' jumpspeed
CameraNode = Camera
wSetNodePosition( CameraNode, 386, 366, 2726 )
wSetNodeRotation( CameraNode, 0, 0, 0 )
wSetCameraClipDistance ( CameraNode, 12000 )

'' [4.] Частицы (огонь, взрыв, снег и т.д. )

wAddChildToParent (GunNode, CameraNode)
'' ------------------ УСТАНОВКА ФИЗИКИ: ПРОВЕРКИ СТОЛКНОВЕНИЙ И ДР. -------------------
'' Это может быть как базовая физика, встроенная в WorldSim3D так и сторонних библиотек,
'' например, ODE, Newton и других.
MapCollision = wGetCollisionGroupFromComplexMesh (MapMesh, MapNode)

wAddCollisionAnimator(_
                        MapCollision,_
                        CameraNode,_
                        30.0,30.0,30.0,_
                        0.0,-9.8,0.0,_
                        0.0,50.0,0.0 )
'' ------------------------------------------------------------------------------------
'' ------------------ ОСВЕЩЕНИЕ -------------------------------------------------------
' добавим в проект яркий свет, освещающий всё вокруг
wSetAmbientLight ( 1, 1, 1 )

'' ------------------ ДРУГИЕ НАСТРОЙКИ или КОД ------------------------------------------------
' Скрываем указатель мыши, если он не нужен
wHideMouse

' -----------------------------------------------------------------------------
'******************************************************************************
'----------------------- ГЛАВНЫЙ ЦИКЛ ВАШЕГО ПРОЕКТА --------------------------
' здесь главный цикл приложения, поэтому
' мы устанавливаем цикл с условием: пока движок работает (функция wRunning)
' внутри цикла постоянно выполняются определённые команды, в основном для отображения сцены
While wRunning
        ' начинаем отрисовку сцены с цветом фона, например зелёный (который устанавливаем числами 0,55,0)
        wBeginScene( 0, 55, 0 )
       
      ' задаём момент времени, когда начать проигрывать звук
      If PlayTime = 1 Then ' начинаем проигрывать на 1-й миллисекунде работы цикла
           ''fbs_Play_Sound (hSound,10) ' Воспроизводим загруженный и созданный звук
           ' 10 означает сколько раз проиграть звук
      EndIf
      PlayTime +=1 'запускаем работу счётчика кадров цикла
     
      '' ------------------------ СОБЫТИЯ КЛАВИАТУРЫ ----------------------------
        ' если события клавиатуры могут быть обработаны, то:
        while wKeyEventAvailable
            ' читаем события клавиатуры.
            KeyEvent = wReadKeyEvent
   
            ' если нажата какая-либо клавиша, связываем с ней событие, оторое мы хотим
            ' чтобы оно произошло. Это может быть что угодно:
            select case as const KeyEvent->key
                case KEY_KEY_D     ' клавиша D
                if KeyEvent->direction = wKEY_DOWN then
                   
                else
                   
                End If
   
                case KEY_KEY_W     ' клавиша W
                if KeyEvent->direction = wKEY_DOWN Then
                   
                else
                   
                End If
                   
                case KEY_KEY_A     ' клавиша A
                if KeyEvent->direction = wKEY_DOWN then
                   
                else
                   
                End If
                   
                case KEY_KEY_S     ' клавиша S
                if KeyEvent->direction = wKEY_DOWN then
                   
                else
                   
                End If
            ' Добавим функцию для закрытия окна через клавишу ESCAPE.
                ' Если клавиатура не исчпользуется, то для этой цели нужно использовать
                ' другую функцию - wCloseESC(), которую можно поместить в конце главного цикла.
                wCloseKEY_ESC()
            end Select
        Wend
       
        '' --------------------------- СОБЫТИЯ МЫШИ -----------------------------------------
        '
        While wMouseEventAvailable
            MouseEvent = wReadMouseEvent
   
            if MouseEvent->action = wME_LMOUSE_PRESSED_DOWN then
                    recoil = 1
            End If
   
        Wend
       
        ' управление отдачей оружия
        If recoil_timer >= 1 And recoil_timer <= 4 Then
                wSetNodePosition (GunNode, 7, -3, 10.5 )
          Else
                wSetNodePosition(GunNode, 7, -3, 10 )
        End If
       
        If recoil = 1 Then recoil_timer +=1 'время отдачи пошло, если игрок нажал ЛКМ
       
        If recoil_timer >= 4 Then
             recoil_timer = 0
              recoil = 0
        EndIf
       
       


      '' ----------------------------------------------------------------------------------   
      '' Завершение отрисовки 3D сцены
        wDrawScene
  '' ------------------------- ОТОБРАЖЕНИЕ ТЕКСТА НА ЭКРАНЕ ---------------------------------
  '' отображаем на экране загруженный ранее шрифт. Это нужно сделать после функции wDrawScene,
  '' т.е. после отрисовки 3D сцены, чтобы выводимый на экран текст отображался поверх объектов
  '' сцены, иначе объекты сцены будут закрывать текст.
  '' последние 4 числа - координаты текста: X,Y левого верхнего угла и X,Y правого нижнего угла
          w2DFontDraw ( BitmapFont, "Press arrows to move around the map and LMB to shoot", 250, 640, 450, 660 )
          ''w2DFontDraw ( BitmapFont, " Make games of your dream with WorldSim3D game engine (Worldsim3D.com)", 300, 600, 450, 620 )
         
        ' заканчиваем отрисовку всего, что на экране и отображаем это
        wEndScene
        wSetFPS   'устанавливаем фреймрейт по умолчанию 60 кадров в секунду
Wend
' -----------------------КОНЕЦ ГЛАВНОГО ЦИКЛА ВАШЕГО ПРОЕКТА ----------------------------------
'**********************************************************************************************

' ---------------------------------------------------------------------------------------------
' Останавливаем работу движка и высвобождаем ресурсы памяти
wStop
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Кто-нибудь там ждёт ещё 5-й урок? А то я подумал, не интересно... :D
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Online Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 892
  • Reputation 63
Ждем.
Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Урок 5. Скачать pdf

Обновлённый кодец:
Code: [Select]
'' ----------------------------------------------------------------------------
'' Название проекта (игры): MyFPS
'' Автор(ы) проекта:
'' Дата начала создания проекта:
'' Дата окончания проекта:
'' ----------------------------------------------------------------------------
'' Краткое описание.
''
''
'' ----------------------------------------------------------------------------
'' Для удобства уберём подключение заголовков, а также разные пользовательские
'' (т.е. созданные вами) функции в отдельный модуль, который мы подключаем здесь,
'' в самом начале проекта.
#include "MyFunctions.bi"
'' Для удобства и порядка в коде можно убрать переменные, первоначальные настройки
'' и меню в отдельные модули и затем здесь подключить их.
'' ------------------------------------------------------------------------------
'' ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
'' Для порядка в коде лучше разделить объявление переменных по типам, тогда сразу
'' будет видно, где какая переменная.

'' [1.] Для работы со звуками
Dim Sounds_Init As FBSBOOLEAN
Dim as Integer hWave,hSound 'для работы со звуком
Dim PlayTime As Integer = 0     'для начала времени проигрывания звука

'' [2.] Объекты WorldSim3D (Меши, Ноды, Текстуры, Камеры, Селекторы и т.д.)
DIM MapMesh as wMesh
DIM MapNode as wNode
Dim MazeTexture As wTexture
DIM Camera as wCamera
DIM CameraNode as wNode
DIM MapCollision as wSelector
DIM BitmapFont as wFont
DIM Collision_anim as wSelector
DIM KeyEvent as wKEY_EVENT PTR
DIM MouseEvent as wMOUSE_EVENT Ptr

Dim GunMesh As wMesh         'для меша оружия
DIM GunNode as wNode         'для нода оружия
Dim GunTexture As wTexture  'для текстуры оружия


'' [3.] Другие переменные, не связанные напрямую с объектами и звуком. Это могут быть
'' разные флаги, счётчики, математика, а также для отладочных целей.
DIM XPOS as single
DIM YPOS as single
DIM ZPOS as single
DIM metrics as wstring * 256
Dim vX as wVECTOR
DIM vY as wVECTOR
DIM vZ as wVECTOR
DIM i As Integer
Dim flag As Integer

'' [4.] Для работы с текстом, если в проекте много разных сообщений, выводимых на экран, например,
'' тексты для меню, диалогов между персонажами, GUI и т.д.
Dim gameover_mes As String

'' [5.] Для сохранения состояния игры, первоначальных настроек игры, таблицы результатов (рекордов)
'' и т.д.

'' [6.] Другие переменные, не вошедшие в предыдущие разделы.
Dim recoil As Integer = 0
Dim recoil_timer As Integer = 1

Dim steps As Integer = 0
Dim steps_timer As Integer = 0

Dim keyMapArray(5) as SKeyMap
'' Естественно, в зависимосчти от типа вашего проекта, какие-то разделы переменных вам не понадобятся,
'' а какие-то, наоборот, вы захотите добавить.
'' =============================================================================================
'' Запускаем интерфейс WorldSim3D
wStartAdvanced( wDT_OPENGL, 1024, 720, wBITS_PER_PIXEL_32,_
          wWINDOWED, wSHADOWS, wCAPTURE_EVENTS, wVERTICAL_SYNC_ON )

'' ++++++++++++++++++  ПЕРВОНАЧАЛЬНЫЕ НАСТРОЙКИ ПРОЕКТА  ++++++++++++++++++++++++++++++++++
'' Сюда включается всё, что должно быть выполнено только один раз или инициализировано для
'' последующей работы только один раз. Эта часть кода расположена до главного цикла,
'' который начинается с While wRunning. Также здесь расположены функции, инициализирующие
'' работу объектов WorldSim3D, которые будут продолжать работать и в главном цикле:
'' камеры, аниматоры и другие.
'' Также в этом разделе можно сделать работу меню, ведь обычно послезапуска игры сначала
'' появляется меню, из которого можно уже начать игру.

'' ------------------  ИНИЦИАЛИЗАЦИЯ РАБОТЫ ЗВУКОВ  ---------------------------------------
'' Показана на примере одного звука. Возможно вам не нужно озвучивание или вы предпочитаете
'' пользоваться другой звуковой библиотекой. Тогда просто уберите эту часть кода.
'' Расскомметируйте здесь, если вам нужно озвучивание и ниже.
Sounds_Init = fbs_Init(48000) ' инициализируем работу библиотеки FBSound
if Sounds_Init = false then
  ? "error: fbs_Init() !"
  ? FBS_Get_PlugError()
  beep:sleep:end 1
end if

' загружаем файл звука
Sounds_Init = fbs_Load_OGGFile ("media/Dark_Ambience.ogg",@hWave)
if Sounds_Init = false then
  ? "error: fbs_Load_OGGFile() !"
  beep:sleep:end 1
end If
' создаём звук для работы со всеми возможностями библиотеки FBSound
fbs_Create_Sound (hWave,@hSound)
'/
'' ---------------------------------------------------------------------------------------
' Устанавливаем текст заголовка окна приложения
wSetWindowCaption( "My FPS game" )
' загружаем нужный шрифт из папки ресурсов через функцию wGetFont
BitmapFont = wGetFont ( "media/3.png" )

'' ------- ЗАГРУЗКА ИГРОВЫХ ОБЪЕКТОВ НА СЦЕНУ ---------------------------------------------
'' Загрузку игровых объектов (3D моделей, частиц, скайбоксов и др.) на сцену.
'' [1.] Ноды для 3D моделей
wAddZipFile( "media/BSPmaps/ctfcomp02_hazard.pk3", wIGNORE_CASE, wIGNORE_PATHS )

' load the BSP map from the archive as a mesh object. any polygons in the mesh
' that do not have textures will be removed from the scene!
MapMesh = wGetMesh( "ctfcomp02_hazard.bsp" )

' add the map to the scene as a node. when adding the mesh this call uses a
' mechanism called an octtree that if very efficient at rendering large amounts
' of complext geometry most of which cant be seen, using this call for maps
' will greatly improve your framerates
MapNode = wAddMeshToSceneAsOcttree (MapMesh)

' Загружаем в проект модель оружия
GunMesh = wGetMesh( "media/models/pistol.3ds")

' Загружаем текстуру для модели оружия
GunTexture = wGetTexture ("media/models/pistol.jpg")

' Добавляем на сцену нод только что загруженного оружия
GunNode = wAddMeshToScene(GunMesh)

' применяем текстуру оружия к ноду оружия
wSetNodeMaterialTexture (GunNode, GunTexture, 0)

' пока отключим освещение оружия, а то по умолчанию оно будет неосвещённым (чёрным)
wSetNodeMaterialFlag (GunNode, wMF_LIGHTING, wOFF)

wSetNodePosition (GunNode, 7, -3, 12)
'' [2.] Аниматоры Нодов, например, wAddFlyCircleAnimator, wAddRotationAnimator и др.

'' [3.] Камеры, Ноды для них и первоначальные настройки камер
''Camera = wAddFPSCamera

keyMapArray(1).Action = KA_MOVE_FORWARD
keyMapArray(1).KeyCode = KEY_KEY_W
keyMapArray(2).Action = KA_MOVE_BACKWARD
keyMapArray(2).KeyCode = KEY_KEY_S
keyMapArray(3).Action = KA_STRAFE_LEFT
keyMapArray(3).KeyCode = KEY_KEY_A
keyMapArray(4).Action = KA_STRAFE_RIGHT
keyMapArray(4).KeyCode = KEY_KEY_D
keyMapArray(5).Action = KA_JUMP_UP
keyMapArray(5).KeyCode = KEY_SPACE

Camera = wAddFPSCamera ( _
    wNO_OBJECT, _   ' parent, none
    20.0, _           ' rotate speed
    0.07, _             ' move speed
    -1, _              ' camera ID
    @keyMapArray(1), _ ' the address of the keyMap
    5, _               ' number of entries in the keymap
    0, _               ' no vertical movement
    3.0 )              ' jumpspeed
CameraNode = Camera
wSetNodePosition( CameraNode, 386, 366, 2726 )
wSetNodeRotation( CameraNode, 0, 0, 0 )
wSetCameraClipDistance ( CameraNode, 12000 )

'' [4.] Частицы (огонь, взрыв, снег и т.д. )

wAddChildToParent (GunNode, CameraNode)
'' ------------------ УСТАНОВКА ФИЗИКИ: ПРОВЕРКИ СТОЛКНОВЕНИЙ И ДР. -------------------
'' Это может быть как базовая физика, встроенная в WorldSim3D так и сторонних библиотек,
'' например, ODE, Newton и других.
MapCollision = wGetCollisionGroupFromComplexMesh (MapMesh, MapNode)

wAddCollisionAnimator(_
                        MapCollision,_
                        CameraNode,_
                        30.0,30.0,30.0,_
                        0.0,-9.8,0.0,_
                        0.0,50.0,0.0 )
'' ------------------------------------------------------------------------------------
'' ------------------ ОСВЕЩЕНИЕ -------------------------------------------------------
' добавим в проект яркий свет, освещающий всё вокруг
wSetAmbientLight ( 1, 1, 1 )

'' ------------------ ДРУГИЕ НАСТРОЙКИ или КОД ------------------------------------------------
' Скрываем указатель мыши, если он не нужен
wHideMouse

' -----------------------------------------------------------------------------
'******************************************************************************
'----------------------- ГЛАВНЫЙ ЦИКЛ ВАШЕГО ПРОЕКТА --------------------------
' здесь главный цикл приложения, поэтому
' мы устанавливаем цикл с условием: пока движок работает (функция wRunning)
' внутри цикла постоянно выполняются определённые команды, в основном для отображения сцены
While wRunning
        ' начинаем отрисовку сцены с цветом фона, например зелёный (который устанавливаем числами 0,55,0)
        wBeginScene( 0, 55, 0 )
       
      ' задаём момент времени, когда начать проигрывать звук
      If PlayTime = 1 Then ' начинаем проигрывать на 1-й миллисекунде работы цикла
           ''fbs_Play_Sound (hSound,10) ' Воспроизводим загруженный и созданный звук
           ' 10 означает сколько раз проиграть звук
      EndIf
      PlayTime +=1 'запускаем работу счётчика кадров цикла
     
      '' ------------------------ СОБЫТИЯ КЛАВИАТУРЫ ----------------------------
        ' если события клавиатуры могут быть обработаны, то:
        while wKeyEventAvailable
            ' читаем события клавиатуры.
            KeyEvent = wReadKeyEvent
   
            ' если нажата какая-либо клавиша, связываем с ней событие, оторое мы хотим
            ' чтобы оно произошло. Это может быть что угодно:
            select case as const KeyEvent->key
                case KEY_KEY_D     ' клавиша D
                if KeyEvent->direction = wKEY_DOWN then
                   steps = 1
                else
                   steps = 0: steps_timer = 0
                End If
   
                case KEY_KEY_W     ' клавиша W
                if KeyEvent->direction = wKEY_DOWN Then
                    steps = 1
                else
                    steps = 0: steps_timer = 0
                End If
                   
                case KEY_KEY_A     ' клавиша A
                if KeyEvent->direction = wKEY_DOWN then
                    steps = 1
                else
                    steps = 0: steps_timer = 0
                End If
                   
                case KEY_KEY_S     ' клавиша S
                if KeyEvent->direction = wKEY_DOWN then
                    steps = 1
                else
                   steps = 0: steps_timer = 0
                End If
            ' Добавим функцию для закрытия окна через клавишу ESCAPE.
                ' Если клавиатура не исчпользуется, то для этой цели нужно использовать
                ' другую функцию - wCloseESC(), которую можно поместить в конце главного цикла.
                wCloseKEY_ESC()
            end Select
        Wend
       
        '' --------------------------- СОБЫТИЯ МЫШИ -----------------------------------------
        '
        While wMouseEventAvailable
            MouseEvent = wReadMouseEvent
   
            if MouseEvent->action = wME_LMOUSE_PRESSED_DOWN then
                    recoil = 1
            End If
   
        Wend
       
        ' управление отдачей оружия
        If recoil_timer >= 1 And recoil_timer <= 4 Then
                wSetNodePosition (GunNode, 7, -3, 10.5 )
          Else
                wSetNodePosition(GunNode, 7, -3, 10 )
        End If
       
        If recoil = 1 Then recoil_timer +=1 'время отдачи пошло, если игрок нажал ЛКМ
       
        If recoil_timer >= 4 Then
             recoil_timer = 0
              recoil = 0
        EndIf
       
        ' управление анимацией шагов
        wGetNodePosition (CameraNode, XPOS, YPOS, ZPOS)

        If steps = 1 Then steps_timer +=1 'время имитации шага пошло, если игрок нажал WASD
       
        If steps_timer > 10 And steps_timer <= 20 Then
                wSetNodePosition (CameraNode, XPOS, YPOS + 1, ZPOS)
        End If
       
        ' Сбрасываем таймер на ноль, чтобы начать следующий шаг     
        If steps_timer > 20 Then
             steps_timer = 0
              steps = 0
        EndIf


      '' ----------------------------------------------------------------------------------   
      '' Завершение отрисовки 3D сцены
        wDrawScene
  '' ------------------------- ОТОБРАЖЕНИЕ ТЕКСТА НА ЭКРАНЕ ---------------------------------
  '' отображаем на экране загруженный ранее шрифт. Это нужно сделать после функции wDrawScene,
  '' т.е. после отрисовки 3D сцены, чтобы выводимый на экран текст отображался поверх объектов
  '' сцены, иначе объекты сцены будут закрывать текст.
  '' последние 4 числа - координаты текста: X,Y левого верхнего угла и X,Y правого нижнего угла
          w2DFontDraw ( BitmapFont, "Press arrows to move around the map and LMB to shoot", 250, 640, 450, 660 )
          ''w2DFontDraw ( BitmapFont, " Make games of your dream with WorldSim3D game engine (Worldsim3D.com)", 300, 600, 450, 620 )
          w2DFontDraw ( BitmapFont, Str (steps), 550, 40, 790, 60 )
        ' заканчиваем отрисовку всего, что на экране и отображаем это
        wEndScene
        wSetFPS   'устанавливаем фреймрейт по умолчанию 60 кадров в секунду
Wend
' -----------------------КОНЕЦ ГЛАВНОГО ЦИКЛА ВАШЕГО ПРОЕКТА ----------------------------------
'**********************************************************************************************

' ---------------------------------------------------------------------------------------------
' Останавливаем работу движка и высвобождаем ресурсы памяти
wStop

Шагайте, только осторожно, кругом враги.  ;D

WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Я на время приостановил написание след. уроков, но зато я продолжаю делать сам проект шутера. Скоро будет готова механика, тогда продолжу уроки.

Скрин из этого проекта. Не обращайте внимания на "дизайн" интерфейса,   :D надписи - просто пока отладочная инфа.
« Last Edit: November 09, 2015, 08:00:58 PM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Marsha

  • Friends
  • Knight
  • *
  • Posts: 128
  • Reputation 11
Замечательно!
Почему-то видео 3-го урока на YouTube предупреждает о содержании и требует авторизоваться. Алек, что же ты там такое записал?  :D

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
У-ум, не помню, может что-то внастройках видео на Ютьюбе что-то не то сделал, а где это?
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Marsha

  • Friends
  • Knight
  • *
  • Posts: 128
  • Reputation 11
Тут.
Мне пишет: "Это видео может оказаться неприемлемым для некоторых пользователей. Выполните вход, чтобы подтвердить свой возраст".
Где-то случайно проставил галочку как на контенте для взрослых?

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Точно. Ну дела?!  :( Сейчас попробую исправить....
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 916
  • Reputation 36
  • Game making is my hobby for life!
Исправил. Оказывается там стояла галочка на опции "ограничение по возрасту" и поэтому можно было войти только через свой аккаунт. Сейчас для всех доступ.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!