Author Topic: Переключение анимаций моделей MD2  (Read 842 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 932
  • Reputation 36
  • Game making is my hobby for life!
Переключение анимаций моделей MD2
« on: January 09, 2015, 09:24:31 AM »
Переключение анимаций моделей MD2

В стандартных моделях MD2 - 21 анимация. MD2 модели использовались в таких играх как: Quake 2, SiN, Soldier of Fortune и др. В этом примере, вы можете посмотреть все эти анимации и заодно увидеть как они просто переключаются с помощью функции wPlayNodeMD2Animation.

Внимание! Для отображения сообщений внизу экрана (тип анимации) вам нужен шрифт 1.xml отсюда. В версиях 0.9.2+ он будет в дистрибутиве.

Code: [Select]
'' ----------------------------------------------------------------------------
'' Пример сделал Alec (WorldSim3D developer)
'' ----------------------------------------------------------------------------
'' Пример: Переключение анимаций моделей MD2
'' Пример загружает на сцену BSP карту (Quake 3) и модель в формате MD2.
'' С помощью клавиатуры можно посмотреть все анимации MD2 модели. Так как в
'' этой 3D модели 21 анимация, используются 21 клавиша: все буквы верхнего ряда
'' клавиатуры (Q - P), все среднего ряда (A - L) и 2 нижнего (Z, X).
'' ----------------------------------------------------------------------------

'' Подключаем главную библиотеку движка
#include "WorldSim3D.bi"

'' Глобальные переменные

' Объекты WorldSim3D
DIM MD2Mesh as wMesh
DIM MeshTexture as wTexture
DIM SceneNode as wNode
DIM BSPMesh as wMesh
DIM BSPNode as wNode
DIM OurCamera as wCamera
DIM CameraNode as wNode
DIM Light as wNode
DIM KeyEvent as wKEY_EVENT Ptr
Dim BitmapFont as wFont

Dim As String animation_type = "Стоит" ' первоначальная анимация

' -----------------------------------------------------------------------------
' Запускаем интерфейс WorldSim3D в полноэкранном режиме
wStart( wDT_OPENGL, 800, 600, wBITS_PER_PIXEL_32, wWINDOWED, _
          wSHADOWS, wCAPTURE_EVENTS, wVERTICAL_SYNC_ON )

' Устанавливаем текст заголовка окна приложения
wSetWindowCaption( "Example: MD2 Animations" )
BitmapFont = wGetFont ( "../media/Fonts/1/1.xml" )

wAddZipFile( "../media/BSPmaps/ctfcomp02_hazard.pk3", wIGNORE_CASE, wIGNORE_PATHS )
BSPMesh = wGetMesh( "ctfcomp02_hazard.bsp" )
BSPNode = wAddMeshToSceneAsOcttree( BSPMesh )

' load the MD2 model from example 4 into the scene
MD2Mesh = wGetMesh( "../media/Models/Characters/Lizard/Lizard.md2" )
MeshTexture = wGetTexture( "../media/Models/Characters/Lizard/Lizard.jpg" )
SceneNode = wAddMeshToScene( MD2Mesh )
wSetNodeMaterialTexture( SceneNode, MeshTexture, 0 )
wSetNodePosition( SceneNode, 258, 336, 2849 )
wSetNodeMaterialFlag( SceneNode, wMF_LIGHTING, wON )
wSetNodeScale ( SceneNode, 3.0,3.0,3.0 )
wPlayNodeMD2Animation( SceneNode, wMD2_STAND )

' add a camera into the scene
OurCamera = wAddFPSCamera
CameraNode = OurCamera
wSetNodePosition( CameraNode, 470, 346, 2864 )
wSetCameraTarget( CameraNode, -2504, 288, 2918 )

' switching shadows on is very simple just call the command for the scene node
' that you want to cast shadows
wAddNodeShadow( SceneNode )

' the shadow colour is a global property for the whole scene (however you can
' change it as you move into different areas of your scene) the first
' parameter is the alpha blend for the shadow this shadow is half washed out
' which gives the appearence of ambient light in the room illuminating the
' shadowed surface, the second set of numbers defines the color of the shadow
' which in this case is black
wSetShadowColor( 130, 0, 0, 0 )

' finally we need to add a light into the scene to cast some shadows. when using
' shadows you probably only want one or two lights as they can be time consuming
' the first set of parameters for this light specify the position its created
' at, the second set of parameters define the color - rather than 255 integer
' levels the intensity of red/green/blue is defined from 0 to 1 and finally
' you define the radius of effect of the light
Light = wAddLight( wNO_PARENT, 358, 426, 2749, 0.3,0.3,0.3, 600.0 )

' the second light is an ambient light and illuminates all surfaces in the scene
' uniformly. this is usually a low value that is used to change the lighting
' level across the entire scene
wSetAmbientLight( 0.9, 0.9, 0.9 )


' -----------------------------------------------------------------------------
' ========================== ГЛАВНЫЙ ЦИКЛ ПРОЕКТА ================================
WHILE wRunning
    ' начинаем отрисовку сцены с цветом фона, например зелёный (который устанавливаем числами 0,125,0)
    wBeginScene( 240, 255, 255 )

     
    ' отрисовка сцены
    wDrawScene
   
    ' отображаем на экране текущую анимацию
w2DFontDraw ( BitmapFont, "Анимация:  " + animation_type, 10, 570, 250, 590 )

' события клавиш
        while wKeyEventAvailable
 
            KeyEvent = wReadKeyEvent
   
            select case as const KeyEvent->key
            case KEY_KEY_Q
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_STAND )
                    animation_type = "Стоит"
                endif
            case KEY_KEY_W     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_RUN )
                    animation_type = "Бежит"
                EndIf
            case KEY_KEY_E     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_ATTACK )
                    animation_type = "Атакует"
                EndIf
            case KEY_KEY_R     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_PAIN_A )
                    animation_type = "Испытывает боль, тип 1"
                EndIf
            case KEY_KEY_T     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_PAIN_B )
                    animation_type = "Испытывает боль, тип 2"
                EndIf
            case KEY_KEY_Y     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_PAIN_C )
                    animation_type = "Испытывает боль, тип 3"
                EndIf
            case KEY_KEY_U     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_JUMP )
                    animation_type = "Прыгает"
                EndIf
                case KEY_KEY_I     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_FLIP )
                    animation_type = "Бьёт"
                EndIf
            case KEY_KEY_O     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_SALUTE )
                    animation_type = "Приветствует"
                EndIf
                case KEY_KEY_P     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_FALLBACK )
                    animation_type = "Отступает или уворачивается"
                EndIf
            case KEY_KEY_A     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_WAVE )
                    animation_type = "Махает рукой"
                EndIf
            case KEY_KEY_S     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_POINT )
                    animation_type = "Указывает рукой или бьёт кулаком"
                EndIf
            case KEY_KEY_D     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_CROUCH_STAND )
                    animation_type = "Стоит присев"
                EndIf
            case KEY_KEY_F     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_CROUCH_WALK )
                    animation_type = "Идёт присев"
                EndIf
            case KEY_KEY_G     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_CROUCH_ATTACK )
                    animation_type = "Атакует присев"
                EndIf
                case KEY_KEY_H     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_CROUCH_PAIN )
                    animation_type = "Испытывает боль присев"
                EndIf
            case KEY_KEY_J     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_CROUCH_DEATH )
                    animation_type = "Смерть присев"
                EndIf
            case KEY_KEY_K     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_DEATH_FALLBACK )
                    animation_type = "Умирает падая на спину"
                EndIf
            case KEY_KEY_L     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_DEATH_FALLFORWARD )
                    animation_type = "Умирает падая на живот"
                EndIf
            case KEY_KEY_Z     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_DEATH_FALLBACKSLOW )
                    animation_type = "Умирает медленно падая на спину"
                EndIf
                case KEY_KEY_X     '
                if KeyEvent->direction = wKEY_DOWN then
                    wPlayNodeMD2Animation( SceneNode, wMD2_BOOM )
                    animation_type = "Умер"
                EndIf
            wCloseKEY_ESC()
            end Select
        Wend

    ' заканчиваем отрисовку сцены и отображаем её
    wEndScene
    wSetFPS
Wend

' -----------------------------------------------------------------------------
' Останавливаем работу движка и высвобождаем ресурсы памяти
wStop
« Last Edit: January 09, 2015, 09:29:14 AM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!