Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1134 lines
36 KiB
Plaintext
1134 lines
36 KiB
Plaintext
VERSION 5.00
|
|
Begin VB.Form frmVBDonuts
|
|
Caption = "VBDonuts"
|
|
ClientHeight = 4440
|
|
ClientLeft = 60
|
|
ClientTop = 345
|
|
ClientWidth = 5355
|
|
Icon = "Donuts.frx":0000
|
|
LinkTopic = "Form1"
|
|
ScaleHeight = 296
|
|
ScaleMode = 3 'Pixel
|
|
ScaleWidth = 357
|
|
StartUpPosition = 3 'Windows Default
|
|
End
|
|
Attribute VB_Name = "frmVBDonuts"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = False
|
|
Attribute VB_PredeclaredId = True
|
|
Attribute VB_Exposed = False
|
|
Option Explicit
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
'
|
|
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
|
|
'
|
|
' File: Donuts.frm
|
|
' Content: This sample shows how 2d can be simulated with Direct3D using
|
|
' transformed and lit vertices.
|
|
'
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
'Set the constant for full screen operation.
|
|
Const FULLSCREENWIDTH = 640
|
|
Const FULLSCREENHEIGHT = 480
|
|
|
|
'Set the number of sprites used in the sample.
|
|
Const NUM_SPRITES = 100
|
|
|
|
'Set the maximum velocity of the sprites.
|
|
Const MAX_VELOCITY = 1.5
|
|
|
|
'Flexible vertex format the describes transformed and lit vertices.
|
|
Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
|
|
|
|
'This structure describes a transformed and lit vertex.
|
|
Private Type TLVERTEX
|
|
x As Single
|
|
y As Single
|
|
z As Single
|
|
rhw As Single
|
|
color As Long
|
|
specular As Long
|
|
tu As Single
|
|
tv As Single
|
|
End Type
|
|
|
|
'A structure that defines all the needed properties
|
|
'of the Sprite.
|
|
Private Type typeSprite
|
|
AnimDimensions As Single 'The dimensions of one frame of animation.
|
|
AnimSpeed As Single 'The speed at which the animation occurs.
|
|
AnimTheta As Single 'The current animation time count.
|
|
FramesPerRow As Long 'How many animation frames are contained in one row in the texture.
|
|
FramesTotal As Long 'Total number of frames for this animation.
|
|
FrameCurrent As Single 'The current animation frame.
|
|
RowOffset As Single 'Offset of the texture start for this sprite.
|
|
SpriteDimensions As Single 'The dimensions of this sprite as will be displayed on the screen in pixels.
|
|
SpriteNum As Long 'The index of this sprite.
|
|
SpriteVerts(3) As TLVERTEX 'Vertex information for this sprite.
|
|
Velocity As D3DVECTOR2 'The velocity of this sprite.
|
|
Location As D3DVECTOR2 'The location of this sprite.
|
|
End Type
|
|
|
|
Dim m_Sprite(NUM_SPRITES) As typeSprite
|
|
|
|
'Dim the DirectX objects/structs the app uses.
|
|
Dim dx As DirectX8
|
|
Dim d3d As Direct3D8
|
|
Dim dev As Direct3DDevice8
|
|
Dim d3dx As D3DX8
|
|
Dim d3dtBackground As Direct3DTexture8
|
|
Dim d3dtSprite As Direct3DTexture8
|
|
Dim m_d3dpp As D3DPRESENT_PARAMETERS
|
|
|
|
'Dim the vertices for the background DirectX logo.
|
|
Dim m_MainVerts(3) As TLVERTEX
|
|
|
|
'Module level boolean that determines whether
|
|
'the app is in fullscreen or windowed.
|
|
Dim m_bWindowed As Boolean
|
|
|
|
'Module level variable to store the caps of the device.
|
|
Dim m_D3DCaps As D3DCAPS8
|
|
|
|
'Module level variable to store the display mode.
|
|
Dim m_d3ddm As D3DDISPLAYMODE
|
|
|
|
'Module level variables to store the window dimensions.
|
|
Dim m_lWindowWidth As Long
|
|
Dim m_lWindowHeight As Long
|
|
|
|
'Variables to store the render surface width and height.
|
|
Dim m_lClientWidth As Long
|
|
Dim m_lClientHeight As Long
|
|
|
|
'Module level variable to store app state.
|
|
Dim m_bRunning As Boolean
|
|
|
|
Private Sub Form_Load()
|
|
|
|
'Show and size the form.
|
|
With Me
|
|
.Show
|
|
.Height = .ScaleY(300, vbPixels, vbTwips)
|
|
.Width = .ScaleX(400, vbPixels, vbTwips)
|
|
End With
|
|
|
|
'Seed the random number generator.
|
|
Call Randomize
|
|
|
|
'Call the sub to initialize the app.
|
|
Call InitApp
|
|
|
|
'Start the main loop of the sample.
|
|
Call MainLoop
|
|
|
|
End Sub
|
|
|
|
Private Sub InitApp()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub initializes the application.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim lErrNum As Long
|
|
|
|
'Store the current window dimensions
|
|
m_lWindowWidth = Me.ScaleWidth
|
|
m_lWindowHeight = Me.ScaleHeight
|
|
|
|
'Call the function that initializes the DirectX8, Direct3D8, and Direct3DDevice8 objects.
|
|
lErrNum = InitD3D(dx, d3d, dev, Me.hwnd)
|
|
If lErrNum Then
|
|
'There was an error. We'll need to exit out at this point.
|
|
Unload Me
|
|
End If
|
|
|
|
'Set the d3dx variable to a new D3DX8 object
|
|
Set d3dx = New D3DX8
|
|
|
|
'Call the function to load any textures.
|
|
Call InitTextures
|
|
|
|
End Sub
|
|
|
|
Private Sub MainLoop()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub is the main loop for the sample.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
m_bRunning = True
|
|
|
|
Do While m_bRunning
|
|
|
|
Call RenderScene
|
|
DoEvents
|
|
|
|
Loop
|
|
|
|
'Exiting app now
|
|
Unload Me
|
|
|
|
End Sub
|
|
|
|
Private Sub RenderScene()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub handles the rendering of the scene.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
On Local Error Resume Next
|
|
|
|
Dim hr As Long
|
|
|
|
'Call TestCooperativeLevel to see what state the device is in.
|
|
hr = dev.TestCooperativeLevel
|
|
|
|
If hr = D3DERR_DEVICELOST Then
|
|
|
|
'If the device is lost, exit and wait for it to come back.
|
|
Exit Sub
|
|
|
|
ElseIf hr = D3DERR_DEVICENOTRESET Then
|
|
|
|
'The device became lost for some reason (probably an alt-tab) and now
|
|
'Reset() needs to be called to try and get the device back.
|
|
hr = 0
|
|
hr = ResetDevice()
|
|
|
|
'If the device failed to be reset, exit the sub.
|
|
If hr Then Exit Sub
|
|
|
|
End If
|
|
|
|
'Make sure the app isn't minimized.
|
|
If Me.WindowState <> vbMinimized Then
|
|
|
|
'The app is ready for rendering.
|
|
With dev
|
|
|
|
'Clear the back buffer
|
|
Call .Clear(0, ByVal 0&, D3DCLEAR_TARGET, &HFF, 0, 0)
|
|
|
|
'Begin the 3d scene
|
|
Call .BeginScene
|
|
|
|
'Set the background texture on the device
|
|
Call .SetTexture(0, d3dtBackground)
|
|
|
|
'Draw the 2 polygons that make up the background
|
|
Call .DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, m_MainVerts(0), Len(m_MainVerts(0)))
|
|
|
|
'Call the sub that renders the sprites
|
|
Call RenderSprites
|
|
|
|
'End the scene
|
|
Call .EndScene
|
|
|
|
'Draw the graphics to the front buffer.
|
|
Call .Present(ByVal 0&, ByVal 0&, 0, ByVal 0&)
|
|
|
|
End With
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub RenderSprites()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub handles the rendering and animation of the sprites.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim i As Long
|
|
Dim TexX As Single, TexY As Single
|
|
|
|
With dev
|
|
|
|
'Set the Sprite texture on the device
|
|
Call .SetTexture(0, d3dtSprite)
|
|
|
|
'Make sure the device supports alpha blending
|
|
If (m_D3DCaps.TextureCaps And D3DPTEXTURECAPS_ALPHA) Then
|
|
|
|
'It does, so turn alpha blending on
|
|
Call .SetRenderState(D3DRS_ALPHABLENDENABLE, 1)
|
|
|
|
End If
|
|
|
|
For i = 0 To UBound(m_Sprite)
|
|
|
|
'Call the sub that updates the Sprite
|
|
Call UpdateSprite(i)
|
|
|
|
'Draw the 2 polygons that make up the Sprite
|
|
Call .DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, m_Sprite(i).SpriteVerts(0), Len(m_Sprite(i).SpriteVerts(0)))
|
|
|
|
Next
|
|
|
|
|
|
'If alpha blending was turned on
|
|
If .GetRenderState(D3DRS_ALPHABLENDENABLE) Then
|
|
|
|
'Turn it back off
|
|
Call .SetRenderState(D3DRS_ALPHABLENDENABLE, 0)
|
|
|
|
End If
|
|
|
|
End With
|
|
|
|
End Sub
|
|
|
|
Private Sub UpdateSprite(ByVal index As Long)
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub updates the sprites texture coordinates and position.
|
|
' Direc3DDevice8.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' [IN]
|
|
' index: The index of the Sprite to update.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim TexX As Single, TexY As Single
|
|
|
|
With m_Sprite(index)
|
|
|
|
'Update the theta for this sprite.
|
|
.AnimTheta = .AnimTheta + .AnimSpeed
|
|
|
|
'If the theta count is greater than one, advance the animation frame.
|
|
If .AnimTheta > 1 Then
|
|
|
|
'Reset theta
|
|
.AnimTheta = 0
|
|
|
|
'Advance the animation frame
|
|
.FrameCurrent = .FrameCurrent + 1
|
|
If .FrameCurrent >= .FramesTotal Then
|
|
.FrameCurrent = 0
|
|
End If
|
|
|
|
End If
|
|
|
|
'Calculate the updated texture coordinates for this Sprite
|
|
TexY = ((.FrameCurrent \ .FramesPerRow) * .AnimDimensions) + .RowOffset
|
|
TexX = (.FrameCurrent Mod .FramesPerRow) * .AnimDimensions
|
|
|
|
'Update the position of the Sprite
|
|
.Location.x = .Location.x + .Velocity.x
|
|
.Location.y = .Location.y + .Velocity.y
|
|
|
|
.SpriteVerts(0).x = .Location.x
|
|
.SpriteVerts(0).y = .Location.y + .SpriteDimensions
|
|
.SpriteVerts(0).tu = TexX
|
|
.SpriteVerts(0).tv = TexY + .AnimDimensions
|
|
|
|
.SpriteVerts(1).x = .Location.x
|
|
.SpriteVerts(1).y = .Location.y
|
|
.SpriteVerts(1).tu = TexX
|
|
.SpriteVerts(1).tv = TexY
|
|
|
|
.SpriteVerts(2).x = .Location.x + .SpriteDimensions
|
|
.SpriteVerts(2).y = .Location.y + .SpriteDimensions
|
|
.SpriteVerts(2).tu = TexX + .AnimDimensions
|
|
.SpriteVerts(2).tv = TexY + .AnimDimensions
|
|
|
|
.SpriteVerts(3).x = .Location.x + .SpriteDimensions
|
|
.SpriteVerts(3).y = .Location.y
|
|
.SpriteVerts(3).tu = TexX + .AnimDimensions
|
|
.SpriteVerts(3).tv = TexY
|
|
|
|
'Check to see if the Sprite hit a wall. If it did, reverse its velocity.
|
|
If .Location.x <= 0 Then
|
|
.Velocity.x = -1 * .Velocity.x
|
|
ElseIf .Location.x + .SpriteDimensions >= m_lClientWidth Then
|
|
.Velocity.x = -1 * .Velocity.x
|
|
End If
|
|
|
|
If .Location.y <= 0 Then
|
|
.Velocity.y = -1 * .Velocity.y
|
|
ElseIf .Location.y + .SpriteDimensions >= m_lClientHeight Then
|
|
.Velocity.y = -1 * .Velocity.y
|
|
End If
|
|
|
|
End With
|
|
|
|
End Sub
|
|
|
|
Private Function InitD3D(dx As DirectX8, d3d As Direct3D8, dev As Direct3DDevice8, ByVal hwnd As Long, Optional ByVal bWindowed As Boolean = True) As Long
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This function creates the following objects: DirectX8, Direct3D8,
|
|
' Direc3DDevice8.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' [IN]
|
|
' hwnd: Handle to a window that will be used as the render target
|
|
' bWindowed: Optional boolean argument that initializes either full screen
|
|
' or windowed. Default is windowed.
|
|
' [OUT]
|
|
' dx: Pass in an uninitialized DirectX8 object.
|
|
' d3d: Pass in an uninitialized Direct3D8 object.
|
|
' dev: Pass in an uninitialized Direct3DDevice8 object.
|
|
'
|
|
' Return value:
|
|
'
|
|
' If an error occurs, it returns the Direct3D error number. In the
|
|
' case that no fullscreen format was found, it returns D3DERR_INVALIDDEVICE.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim DevType As CONST_D3DDEVTYPE
|
|
Dim i As Long, lCount As Long, lErrNum As Long, format As Long
|
|
Dim bFoundMode As Boolean
|
|
|
|
'Turn off error checking. The app will check for errors and handle them.
|
|
On Local Error Resume Next
|
|
|
|
'Store the window mode that was passed in
|
|
m_bWindowed = bWindowed
|
|
|
|
'Initiazlize the DirectX8 object
|
|
Set dx = New DirectX8
|
|
|
|
'Check to make sure that the dx object was created successfully.
|
|
If Err.Number Then
|
|
|
|
'There were problems creating the dx object. Return the error number.
|
|
InitD3D = Err.Number
|
|
Exit Function
|
|
|
|
End If
|
|
|
|
'Create the Direct3D object
|
|
Set d3d = dx.Direct3DCreate
|
|
|
|
'Check to make sure that the d3d object was created successfully.
|
|
If Err.Number Then
|
|
|
|
'There were problems creating the d3d object. Return the error number,
|
|
InitD3D = Err.Number
|
|
Exit Function
|
|
|
|
End If
|
|
|
|
'We'll start by attempting to create a HAL device. This variable
|
|
'will hold the final type of device that we create after we check
|
|
'some capabilities.
|
|
DevType = D3DDEVTYPE_HAL
|
|
|
|
'Get the capabilities of the Direct3D device that we specify. In this case,
|
|
'we'll be using the adapter default (the primiary card on the system).
|
|
Call d3d.GetDeviceCaps(D3DADAPTER_DEFAULT, DevType, m_D3DCaps)
|
|
|
|
'Check for errors. If there is an error, the card more than likely doesn't support at least DX7,
|
|
'so get the caps of the reference device instead.
|
|
If Err.Number Then
|
|
|
|
Err.Clear
|
|
DevType = D3DDEVTYPE_REF
|
|
Call d3d.GetDeviceCaps(D3DADAPTER_DEFAULT, DevType, m_D3DCaps)
|
|
|
|
'If there is *still* an error, then the driver has problems. We'll
|
|
'have to exit at this point, because there isn't anything else we can
|
|
'do.
|
|
If Err.Number Then
|
|
InitD3D = D3DERR_NOTAVAILABLE
|
|
Exit Function
|
|
End If
|
|
|
|
End If
|
|
|
|
'Grab some information about the current display mode.
|
|
Call d3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, m_d3ddm)
|
|
|
|
'Now we'll go ahead and fill the D3DPRESENT_PARAMETERS type.
|
|
With m_d3dpp
|
|
|
|
If bWindowed Then
|
|
|
|
'Make sure that the adapter is in a color bit-depth greater than 8 bits per pixel.
|
|
If m_d3ddm.format = D3DFMT_P8 Or m_d3ddm.format = D3DFMT_A8P8 Then
|
|
'Device is running in some variation of an 8 bit format
|
|
MsgBox " For this sample to run, the primary display needs to be in 16 bit or higher color depth.", vbCritical
|
|
InitD3D = D3DERR_INVALIDDEVICE
|
|
Exit Function
|
|
Else
|
|
'Device is greater than 8 bit. Set the format variable to the current display format.
|
|
format = m_d3ddm.format
|
|
End If
|
|
|
|
'For windowed mode, we just discard any information instead of flipping it.
|
|
.SwapEffect = D3DSWAPEFFECT_DISCARD
|
|
|
|
'Set windowed mode to true.
|
|
.Windowed = 1
|
|
|
|
Else
|
|
|
|
'Call the sub to find the first suitable fullscreen format
|
|
lErrNum = FindMode(FULLSCREENWIDTH, FULLSCREENHEIGHT, format)
|
|
|
|
'If unable to find a suitable mode, the app will have to exit.
|
|
If lErrNum Then
|
|
MsgBox " Unable to find a compatible format to run the sample.", vbCritical
|
|
InitD3D = D3DERR_INVALIDDEVICE
|
|
Exit Function
|
|
End If
|
|
|
|
'We need the backbuffer to flip with the front for fullscreen. This
|
|
'flag enables this.
|
|
.SwapEffect = D3DSWAPEFFECT_FLIP
|
|
|
|
'Set the width and height
|
|
.BackBufferWidth = FULLSCREENWIDTH
|
|
.BackBufferHeight = FULLSCREENHEIGHT
|
|
|
|
End If
|
|
|
|
'Set the backbuffer format
|
|
.BackBufferFormat = format
|
|
|
|
End With
|
|
|
|
'Try to create the device now that we have everything set.
|
|
Set dev = d3d.CreateDevice(D3DADAPTER_DEFAULT, DevType, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, m_d3dpp)
|
|
|
|
'If the creation above failed, try to create a REF device instead.
|
|
If Err.Number Then
|
|
|
|
Err.Clear
|
|
Set dev = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, m_d3dpp)
|
|
|
|
If Err.Number Then
|
|
|
|
'The app still hit an error. Both HAL and REF devices weren't created. The app will have to exit at this point.
|
|
InitD3D = Err.Number
|
|
Exit Function
|
|
|
|
End If
|
|
End If
|
|
|
|
'Store the client dimensions
|
|
If m_bWindowed Then
|
|
m_lClientWidth = Me.ScaleWidth
|
|
m_lClientHeight = Me.ScaleHeight
|
|
Else
|
|
m_lClientWidth = FULLSCREENWIDTH
|
|
m_lClientHeight = FULLSCREENHEIGHT
|
|
End If
|
|
|
|
If InitDevice(dev, hwnd) Then
|
|
|
|
MsgBox "Unable to initialize the device"
|
|
Unload Me
|
|
|
|
End If
|
|
|
|
End Function
|
|
|
|
Private Function InitDevice(dev As Direct3DDevice8, hwnd As Long) As Long
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This function initializes the device with some renderstates, and also
|
|
' sets up the viewport, camera, and world.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' [IN]
|
|
' dev: An existing Direct3DDevice8 object
|
|
' m_d3dpp: A filled D3DPRESENT_PARAMETERS type
|
|
' hwnd: Handle to the target window
|
|
'
|
|
'
|
|
' Return value:
|
|
' If an error occurs, it returns D3DERR_INVALIDCALL.
|
|
'
|
|
'***********************************************************************
|
|
|
|
'On Local Error Resume Next
|
|
Call InitGeometry
|
|
|
|
With dev
|
|
|
|
'Set the vertex shader to an FVF that contains texture coords,
|
|
'and transformed and lit vertex coords.
|
|
Call .SetVertexShader(FVF)
|
|
|
|
'Turn off lighting
|
|
Call .SetRenderState(D3DRS_LIGHTING, 0)
|
|
|
|
'Set the render state that uses the alpha component as the source for blending.
|
|
Call .SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
|
|
|
|
'Set the render state that uses the inverse alpha component as the destination blend.
|
|
Call .SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
|
|
|
|
End With
|
|
|
|
If Err.Number Then InitDevice = D3DERR_INVALIDCALL
|
|
|
|
End Function
|
|
|
|
Private Sub InitGeometry()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub initializes the vertices for all the needed polygons.
|
|
'
|
|
' Parameters:
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim sDimensions As Single
|
|
Dim i As Long
|
|
Static bInit As Boolean
|
|
|
|
' All the polygons that this sample use are made of two triangles that create a rectangle.
|
|
' The textures are painted on these two polygons to create the look of a 2d sprite.
|
|
' All of the polygons are transformed and lit, meaning that Direct3D will perform no
|
|
' lighting calculations, and no coordinate transformation. The application is responsible
|
|
' for doing all of these calculations. Since this is just a 2d simulation, it's very easy
|
|
' to set up the polygons and transform them manually.
|
|
' This illustration shows the placement of each vertex (vn) to draw the rectangle. Notice the
|
|
' order that the vertices are placed. This follows the clockwise winding order rule for culling
|
|
' polygons. If the order was reversed, the polygon wouldn't be rendered by Direct3D. See the "3-D
|
|
' Coordinate Systems and Geometry" section in the docs for more info.
|
|
|
|
' * v1 * v3
|
|
' |\ |
|
|
' | \ |
|
|
' | \ |
|
|
' | \ |
|
|
' | \|
|
|
' * v0 * v2
|
|
|
|
'Initialize the 2 polygons that will display the DirectX logo
|
|
With m_MainVerts(0)
|
|
|
|
'X and Y are the familiar XY values in screen space that this vertex will be placed.
|
|
'This one is going in the bottom left corner of the screen.
|
|
.x = 0: .y = m_lClientHeight
|
|
|
|
'This sets up the texture coordinates for this vertex in the polygon.
|
|
'tu is the X of the texture, tv is the Y of the texture. Texture coordinates
|
|
'are from 0 to 1, 0 being all the way to the left or top, and 1 being all the
|
|
'way to the right or bottom, depending on whether it is the tu or tv element.
|
|
.tu = 0: .tv = 1
|
|
|
|
'rhw is the value that D3D uses to produce scaling. Since this app
|
|
'won't be doing any scaling, this value needs to be 1.
|
|
.rhw = 1
|
|
|
|
'Since the app will handle all lighting, the color value will be used
|
|
'to light the polygon. For this app, the polygon will be fully lit.
|
|
.color = &HFFFFFF
|
|
End With
|
|
|
|
'The rest of the vertices follow the same format, but are placed in different XY coordinates.
|
|
|
|
With m_MainVerts(1)
|
|
.x = 0: .y = 0
|
|
.tu = 0: .tv = 0
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
With m_MainVerts(2)
|
|
.x = m_lClientWidth: .y = m_lClientHeight
|
|
.tu = 1: .tv = 1
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
With m_MainVerts(3)
|
|
.x = m_lClientWidth: .y = 0
|
|
.tu = 1: .tv = 0
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
|
|
For i = 0 To UBound(m_Sprite)
|
|
|
|
With m_Sprite(i)
|
|
|
|
'If this is the first time the sub is called.
|
|
If Not bInit Then
|
|
|
|
'Choose a random Sprite
|
|
.SpriteNum = Int((3) * Rnd)
|
|
|
|
'Set the sprites properties accordingly
|
|
If .SpriteNum = 0 Then
|
|
.FramesPerRow = 8
|
|
.FramesTotal = 29
|
|
.RowOffset = 0
|
|
.AnimDimensions = 0.125
|
|
.SpriteDimensions = 40
|
|
ElseIf .SpriteNum = 1 Then
|
|
.FramesPerRow = 16
|
|
.FramesTotal = 39
|
|
.RowOffset = 0.5
|
|
.AnimDimensions = 0.0625
|
|
.SpriteDimensions = 15
|
|
ElseIf .SpriteNum = 2 Then
|
|
.FramesPerRow = 16
|
|
.FramesTotal = 39
|
|
.RowOffset = 0.6875
|
|
.AnimDimensions = 0.0625
|
|
.SpriteDimensions = 15
|
|
End If
|
|
|
|
'Choose a random starting location, velocity, and animation frame
|
|
.Location.x = (m_lClientWidth - .SpriteDimensions) * Rnd
|
|
.Location.y = (m_lClientHeight - .SpriteDimensions) * Rnd
|
|
.Velocity.x = (((MAX_VELOCITY - -MAX_VELOCITY) * Rnd) + -MAX_VELOCITY)
|
|
.Velocity.y = (((MAX_VELOCITY - -MAX_VELOCITY) * Rnd) + -MAX_VELOCITY)
|
|
.FrameCurrent = Int(.FramesTotal * Rnd)
|
|
|
|
'Calculate the speed at which the animation should occurr. Based on the velocity of the sprite.
|
|
'The higher the velocity, the faster the animation.
|
|
.AnimSpeed = ((Abs(.Velocity.x) + Abs(.Velocity.y)) / 4)
|
|
|
|
Else
|
|
|
|
'The window was resized. Make sure sprites are still in view, move them so they are if neccessary.
|
|
If .Location.x + .SpriteDimensions > m_lClientWidth Then
|
|
.Location.x = m_lClientWidth - .SpriteDimensions - 1
|
|
End If
|
|
|
|
If .Location.y + .SpriteDimensions > m_lClientHeight Then
|
|
.Location.y = m_lClientHeight - .SpriteDimensions - 1
|
|
End If
|
|
|
|
End If
|
|
|
|
'Create the vertices for the Sprite
|
|
With .SpriteVerts(0)
|
|
.x = 0: .y = 0
|
|
.tu = 0: .tv = m_Sprite(i).AnimDimensions
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
With .SpriteVerts(1)
|
|
.x = 0: .y = m_Sprite(i).SpriteDimensions
|
|
.tu = 0: .tv = 0
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
With .SpriteVerts(2)
|
|
.x = m_Sprite(i).SpriteDimensions: .y = 0
|
|
.tu = m_Sprite(i).AnimDimensions: .tv = m_Sprite(i).AnimDimensions
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
With .SpriteVerts(3)
|
|
.x = m_Sprite(i).SpriteDimensions: .y = m_Sprite(i).SpriteDimensions
|
|
.tu = m_Sprite(i).AnimDimensions: .tv = 0
|
|
.rhw = 1
|
|
.color = &HFFFFFF
|
|
End With
|
|
|
|
End With
|
|
|
|
Next
|
|
|
|
'The geometry is initialized. No need to randomize again.
|
|
bInit = True
|
|
|
|
End Sub
|
|
|
|
Private Sub InitTextures()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub loads any textures needed. If for some reason this sub doesn't
|
|
' succeed, we'll just exit the app, because it won't run without the
|
|
' textures being loaded.
|
|
'
|
|
' Parameters:
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
On Local Error Resume Next
|
|
|
|
Dim sFile As String
|
|
|
|
'Locate the path to the media
|
|
sFile = FindMediaDir("dx5_logo.bmp")
|
|
If sFile = "" Then
|
|
sFile = App.Path & "\" & "dx5_logo.bmp"
|
|
Else
|
|
sFile = sFile & "dx5_logo.bmp"
|
|
End If
|
|
|
|
'Check to make sure the media was found
|
|
If Dir(sFile) = vbNullString Then
|
|
MsgBox "Unable to locate sample media."
|
|
Unload Me
|
|
End If
|
|
|
|
'Load the background texture
|
|
Set d3dtBackground = d3dx.CreateTextureFromFile(dev, sFile)
|
|
|
|
'Locate the path to the next media file.
|
|
sFile = FindMediaDir("donuts1.bmp")
|
|
If sFile = "" Then
|
|
sFile = App.Path & "\" & "donuts1.bmp"
|
|
Else
|
|
sFile = sFile & "donuts1.bmp"
|
|
End If
|
|
|
|
'Check to make sure the media was found
|
|
If Dir(sFile) = vbNullString Then
|
|
MsgBox "Unable to locate sample media."
|
|
Unload Me
|
|
End If
|
|
|
|
|
|
'Load the Sprite texture. We need to get alpha information embedded into this
|
|
'surface, so we'll call the more complex CreateTextureFromFileEx() method instead.
|
|
'The main thing we need to do is just let it know we want to use black as the
|
|
'alpha channel. We do this by passing &HFF000000 to the method, and it fills in
|
|
'the high order byte of any pixel that contains black with full alpha so that it
|
|
'becomes transparent when rendered with alpha blending enabled.
|
|
|
|
Set d3dtSprite = d3dx.CreateTextureFromFileEx( _
|
|
dev, _
|
|
sFile, _
|
|
D3DX_DEFAULT, _
|
|
D3DX_DEFAULT, _
|
|
D3DX_DEFAULT, _
|
|
0, _
|
|
D3DFMT_UNKNOWN, _
|
|
D3DPOOL_MANAGED, _
|
|
D3DX_FILTER_POINT, _
|
|
D3DX_FILTER_POINT, _
|
|
&HFF000000, _
|
|
ByVal 0, _
|
|
ByVal 0 _
|
|
)
|
|
|
|
If Err.Number Then
|
|
|
|
'Something happened while loading the texture.
|
|
MsgBox "Error loading texture. Error number: " & Err.Number
|
|
Unload Me
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub SwitchWindowMode()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This sub switches the current display mode between windowed/fullscreen.
|
|
' If it runs into an error, it just exits, leaving the display mode in
|
|
' its current state.
|
|
'
|
|
' Parameters:
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim d3dppEmpty As D3DPRESENT_PARAMETERS
|
|
Dim format As Long
|
|
Dim lErrNum As Long
|
|
|
|
On Local Error Resume Next
|
|
|
|
If m_bWindowed Then
|
|
|
|
'Grab a valid format for this device. If a format
|
|
'for the requested resolution wasn't found, exit the sub.
|
|
If FindMode(FULLSCREENWIDTH, FULLSCREENHEIGHT, format) <> 0 Then Exit Sub
|
|
|
|
'Store the current window mode format
|
|
Call d3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, m_d3ddm)
|
|
|
|
'The app is running windowed currently, switch to fullscreen.
|
|
m_bWindowed = False
|
|
|
|
'Set the present parameters for running full screen
|
|
m_d3dpp = d3dppEmpty
|
|
|
|
With m_d3dpp
|
|
.SwapEffect = D3DSWAPEFFECT_FLIP
|
|
.BackBufferFormat = format
|
|
.BackBufferWidth = FULLSCREENWIDTH
|
|
.BackBufferHeight = FULLSCREENHEIGHT
|
|
.Windowed = 0
|
|
End With
|
|
|
|
'Store the client dimensions
|
|
m_lClientWidth = FULLSCREENWIDTH
|
|
m_lClientHeight = FULLSCREENHEIGHT
|
|
|
|
'Reset the device to the new mode
|
|
lErrNum = ResetDevice
|
|
|
|
'If there is an error resetting the device,
|
|
'just exit the sub.
|
|
If lErrNum Then
|
|
'Store the client dimensions
|
|
m_lClientWidth = Me.ScaleWidth
|
|
m_lClientHeight = Me.ScaleHeight
|
|
m_bWindowed = True
|
|
Exit Sub
|
|
End If
|
|
|
|
Else
|
|
|
|
'Set the present params to reflect windowed operation.
|
|
m_d3dpp = d3dppEmpty
|
|
|
|
With m_d3dpp
|
|
.SwapEffect = D3DSWAPEFFECT_DISCARD
|
|
.BackBufferFormat = m_d3ddm.format
|
|
.Windowed = 1
|
|
End With
|
|
|
|
'Reset the device to the new mode
|
|
lErrNum = ResetDevice
|
|
|
|
'If there is an error, just exit the sub
|
|
If lErrNum Then
|
|
m_bWindowed = False
|
|
Exit Sub
|
|
End If
|
|
|
|
'Now get the device ready again
|
|
Call InitDevice(dev, Me.hwnd)
|
|
|
|
'Resize the form to the size it was previous to going fullscreen.
|
|
Me.Width = m_lWindowWidth * Screen.TwipsPerPixelX
|
|
Me.Height = m_lWindowHeight * Screen.TwipsPerPixelY
|
|
|
|
'The app is now running windowed
|
|
m_bWindowed = True
|
|
|
|
'Store the client dimensions
|
|
m_lClientWidth = Me.ScaleWidth
|
|
m_lClientHeight = Me.ScaleHeight
|
|
|
|
'Resize the window to the old size now.
|
|
Call Form_Resize
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub ResizeWindow()
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This subroutine is called whenever the form is resized. It resets the
|
|
' device to the new size, and re-inits the device.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
Dim d3dppEmpty As D3DPRESENT_PARAMETERS
|
|
|
|
m_lWindowWidth = Me.ScaleWidth
|
|
m_lWindowHeight = Me.ScaleHeight
|
|
m_lClientWidth = m_lWindowWidth
|
|
m_lClientHeight = m_lWindowHeight
|
|
|
|
'Reset the device to the new mode
|
|
Call ResetDevice
|
|
|
|
End Sub
|
|
|
|
Private Function ResetDevice() As Long
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This subroutine is called whenever the app needs to be resized, or the
|
|
' device has been lost.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' None.
|
|
'
|
|
'***********************************************************************
|
|
|
|
On Local Error Resume Next
|
|
|
|
Call dev.Reset(m_d3dpp)
|
|
|
|
If Err.Number Then
|
|
ResetDevice = Err.Number
|
|
Exit Function
|
|
End If
|
|
|
|
'Now get the device ready again
|
|
Call InitDevice(dev, Me.hwnd)
|
|
|
|
End Function
|
|
Private Function FindMode(ByVal w As Long, ByVal h As Long, fmt As Long) As Long
|
|
|
|
'***********************************************************************
|
|
'
|
|
' This function returns a valid back buffer format for the width and height passed in.
|
|
'
|
|
' Parameters:
|
|
'
|
|
' [IN]
|
|
' w is the width of the mode being sought
|
|
' h is the height of the mode being sought
|
|
'
|
|
' [OUT]
|
|
' fmt will be filled in with a valid CONST_D3DFORMAT
|
|
'
|
|
' Return value:
|
|
' If a valid format was not found, D3DERR_INVALIDDEVICE is returned.
|
|
' If an error occurs, it returns D3DERR_INVALIDCALL.
|
|
'***********************************************************************
|
|
|
|
|
|
Dim i As Long, lCount As Long
|
|
Dim d3ddm As D3DDISPLAYMODE
|
|
Dim bFoundMode As Boolean
|
|
|
|
i = 0
|
|
|
|
'Get the number of adapter modes this adapter supports.
|
|
lCount = d3d.GetAdapterModeCount(D3DADAPTER_DEFAULT) - 1
|
|
|
|
'If we encounter an error, return an error code and exit the function.
|
|
If Err.Number Then
|
|
FindMode = D3DERR_INVALIDCALL
|
|
Exit Function
|
|
End If
|
|
|
|
'Next, loop through all the display modes until we find one
|
|
'that matches the parameters passed in.
|
|
For i = 0 To lCount
|
|
|
|
Call d3d.EnumAdapterModes(D3DADAPTER_DEFAULT, i, d3ddm)
|
|
|
|
'Again, catch any unexpected errors.
|
|
If Err.Number Then
|
|
FindMode = Err.Number
|
|
Exit Function
|
|
End If
|
|
|
|
'Check to see if this mode matches what is being sought.
|
|
If d3ddm.Width = w And d3ddm.Height = h Then
|
|
|
|
'Now see if this mode is either a 32bpp or 16bpp mode
|
|
If d3ddm.format = D3DFMT_R8G8B8 Or _
|
|
d3ddm.format = D3DFMT_R5G6B5 Then
|
|
|
|
'We've found a suitable display. Set the flag
|
|
'to reflect this, and exit. No need to look further.
|
|
bFoundMode = True
|
|
|
|
'Set the fmt to the format that was found.
|
|
fmt = d3ddm.format
|
|
|
|
Exit For
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
If bFoundMode Then
|
|
|
|
'Everything checked out OK
|
|
Exit Function
|
|
|
|
Else
|
|
|
|
'Return an error
|
|
FindMode = D3DERR_INVALIDDEVICE
|
|
|
|
End If
|
|
|
|
End Function
|
|
|
|
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
|
|
|
|
If (Shift And vbAltMask) And KeyCode = vbKeyReturn Then
|
|
|
|
'User wants to switch from fullscreen/windowed mode
|
|
Call SwitchWindowMode
|
|
|
|
ElseIf KeyCode = vbKeyEscape Then
|
|
|
|
'User wants to exit the app
|
|
m_bRunning = False
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub Form_Resize()
|
|
|
|
'Call the subroutine that resizes the backbuffer on the device.
|
|
'Make sure the device exists, and the app is windowed.
|
|
If Not dev Is Nothing And m_bWindowed Then
|
|
|
|
'Make sure the app isn't minimized.
|
|
If Me.WindowState <> vbMinimized Then
|
|
|
|
'Make sure the app isn't resized to the point where the sprites could get stuck.
|
|
If Me.ScaleHeight < 100 Or Me.ScaleWidth < 100 Then
|
|
Me.Width = Screen.TwipsPerPixelX * 100
|
|
Me.Height = Screen.TwipsPerPixelY * 100
|
|
End If
|
|
|
|
Call ResizeWindow
|
|
End If
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub Form_Unload(Cancel As Integer)
|
|
|
|
'We need to terminate the app using the End statement,
|
|
'otherwise the form will reload since the app is running
|
|
'in a loop with DoEvents.
|
|
End
|
|
|
|
End Sub
|
|
|