Files
Client/Library/dxx8/samples/Multimedia/VBSamples/Demos/AirHockey/modD3D.bas
LGram16 e067522598 Initial commit: ROW Client source code
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>
2025-11-29 16:24:34 +09:00

265 lines
10 KiB
QBasic

Attribute VB_Name = "modD3D"
Option Explicit
Public dx As New DirectX8
Public gfDrawRoomText As Boolean
Public glScreenWidth As Long
Public glScreenHeight As Long
'Extra misc vars
Public gfWireFrame As Boolean
Public Sub Render()
Dim lCount As Long
On Error Resume Next
If g_dev Is Nothing Then Exit Sub
' Clear the backbuffer to a black color
g_dev.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &H0&, 1#, 0
' Setup the world, view, and projection matrices
SetupMatrices
' Begin the scene
g_dev.BeginScene
'Draw everything in either a solid fillmode, or wireframe
If gfWireFrame Then
g_dev.SetRenderState D3DRS_FILLMODE, D3DFILL_WIREFRAME
Else
g_dev.SetRenderState D3DRS_FILLMODE, D3DFILL_SOLID
End If
'Render the room
goRoom.Render g_dev
'Render the table
goTable.Render g_dev
'Now Paddle (0)
goPaddle(0).Render g_dev
'Now Paddle (1)
goPaddle(1).Render g_dev
'And finally the puck
goPuck.Render g_dev
'Now lets draw whatever text we need
'We can draw text (don't draw text if we're currently fading)
If Not goFade.AmFading Then
goTextLittle.BeginText
If gfGameCanBeStarted Then
'If the game can be started, then draw the scores at the top of the screen
If gfMultiplayer Then
If glMyPaddleID = 0 Then
goTextLittle.DrawText gsUserName & ":" & glPlayerScore(0), 10, 5, &HFFFFFF00
Else
goTextLittle.DrawText "Opponent:" & glPlayerScore(0), 10, 5, &HFFFFFFFF
End If
If glMyPaddleID = 1 Then
goTextLittle.DrawText gsUserName & ":" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFF00
Else
goTextLittle.DrawText "Opponent:" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFFFF
End If
Else
goTextLittle.DrawText "Player:" & glPlayerScore(0), 10, 5, &HFFFFFF00
goTextLittle.DrawText "Computer:" & glPlayerScore(1), glScreenWidth - 75, 5, &HFFFFFFFF
End If
Else
'The game can't be started yet (only in multiplayer) Let the host know
goTextLittle.DrawText "Waiting for the game to be started...", (glScreenWidth / 2) - 50, 5, &HFFFFFFFF
End If
'Here is a little helper text letting the user know to press Space
'to launch the puck (will show up after 3 seconds, and stay on for 10 seconds)
If (timeGetTime - glTimePuckScored > glDefaultDelayTime) And gfScored And Not gfGameOver And ((timeGetTime - glTimePuckScored < glDefaultDelayTimeGone + glDefaultDelayTime)) Then
goPuck.DefaultStartPosition
goPuck.Spinning = True
goTextLittle.DrawText "Press <Space> to launch puck...", (glScreenWidth / 2) - 50, 25, &HFF0000FF
End If
'Here is a little helper text letting the user know to press F1
'to turn of the room (will show up after 3 seconds, and stay on for 10 seconds)
If (gfDrawRoomText And goRoom.DrawRoom) And (timeGetTime - glTimeNoRoom < glDefaultDelayTimeGone) Then
goPuck.DefaultStartPosition
goPuck.Spinning = True
goTextLittle.DrawText "You can press F1 to turn off the drawing " & vbCrLf & " of the room, which will increase performance.", -15, glScreenHeight - 50, &HFFFF00FF
End If
If gfGameOver And ((timeGetTime - glTimeGameOver) > glDefaultDelayTime) And ((timeGetTime - glTimeGameOver < glDefaultDelayTimeGone + glDefaultDelayTime)) Then
goTextLittle.DrawText "Press F3 to restart...", (glScreenWidth / 2) - 50, 25, &HFF0000FF
End If
goTextLittle.EndText
goTextBig.BeginText
If gfGameOver Then
If gfMultiplayer Then
If glPlayerScore(glMyPaddleID) > glPlayerScore(Abs(glMyPaddleID - 1)) Then
goTextBig.DrawText "Game over!!" & vbCrLf & "You win!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
Else
goTextBig.DrawText "Game over!!" & vbCrLf & "You lose!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
End If
Else
If glPlayerScore(0) > glPlayerScore(1) Then
goTextBig.DrawText "Game over!!" & vbCrLf & "You win!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
Else
goTextBig.DrawText "Game over!!" & vbCrLf & "You lose!!", (glScreenWidth / 2) - (glScreenWidth / 4), (glScreenHeight / 2) - (glScreenHeight / 4), &HFFDD11AA
End If
End If
End If
If gfMultiplayer And gfNoSendData Then 'We've been disconnected sometime, notify the user
goTextBig.DrawText "The connection with the other" & vbCrLf & "system was lost.", 5, (glScreenHeight / 2) - (glScreenHeight / 4), &HFFFFFF00
End If
goTextBig.EndText
End If
' End the scene
g_dev.EndScene
' Present the backbuffer contents to the front buffer (screen)
D3DUtil_PresentAll 0
End Sub
Public Sub SetupMatrices()
Dim matView As D3DMATRIX
D3DXMatrixLookAtLH matView, goCamera.Position, vec3(0#, 0#, 0#), vec3(0#, 1#, 0#)
g_dev.SetTransform D3DTS_VIEW, matView
Dim matProj As D3DMATRIX
D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, 1, 1, 110
g_dev.SetTransform D3DTS_PROJECTION, matProj
End Sub
Public Sub RestoreDeviceObjects()
' Set miscellaneous render states
With g_dev
' Set world transform
Dim matWorld As D3DMATRIX
D3DXMatrixIdentity matWorld
.SetTransform D3DTS_WORLD, matWorld
' Set the projection matrix
Dim matProj As D3DMATRIX
Dim fAspect As Single
fAspect = 1
D3DXMatrixPerspectiveFovLH matProj, g_pi / 3, fAspect, 1, 1000
.SetTransform D3DTS_PROJECTION, matProj
.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR
.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
.SetTextureStageState 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR
.SetTextureStageState 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
' Set default render states
.SetRenderState D3DRS_DITHERENABLE, 1 'True
.SetRenderState D3DRS_SPECULARENABLE, 0 'False
.SetRenderState D3DRS_ZENABLE, 1 'True
.SetRenderState D3DRS_NORMALIZENORMALS, 1 'True
End With
Set goTextBig = Nothing
Set goTextLittle = Nothing
'Now create a new text object
Set goTextLittle = New cText
goTextLittle.InitText g_d3dx, g_dev, "Times New Roman", 8, True
Set goTextBig = New cText
goTextBig.InitText g_d3dx, g_dev, "Times New Roman", 18, True
End Sub
Public Sub InitDefaultLights(Optional ByVal lNumLights As Long = 2, Optional ByVal fFullAmbiantOnly As Boolean = False)
With g_dev
' Set ambient light
.SetRenderState D3DRS_AMBIENT, &HFFFFFFFF
goFade.AmbientColor = &HFFFFFFFF
goFade.MaxAmbientColor = goFade.AmbientColor
If fFullAmbiantOnly Then Exit Sub
If lNumLights < 1 Then Exit Sub 'Nothing to do
' Set ambient light
'We will slowly lower the ambient light as each new light gets added
.SetRenderState D3DRS_AMBIENT, &HFFBBBBBB
goFade.AmbientColor = &HFFBBBBBB
' Turn on lighting
.SetRenderState D3DRS_LIGHTING, 1
'Turn on two lights one on each end of the table
Dim light As D3DLIGHT8
If lNumLights > 0 Then
With light
.Type = D3DLIGHT_DIRECTIONAL
.diffuse.r = 0
.diffuse.g = 0
.diffuse.b = 0
.Direction.x = 0
.Direction.y = -10
.Direction.z = 0
.Range = 100000#
.Position.x = 0
.Position.y = 3
.Position.z = 0
End With
goFade.LightColor(0) = light
.SetLight 0, light 'let d3d know about the light
.LightEnable 0, 1 'turn it on
goFade.NumLight = 0
End If
If lNumLights > 1 Then
.SetRenderState D3DRS_AMBIENT, &HFFAAAAAA
goFade.AmbientColor = &HFFAAAAAA
'Now turn on the second light if we can
With light
.Type = D3DLIGHT_DIRECTIONAL
.Direction.x = 15
.Direction.y = -10
.Direction.z = -15
.Range = 1000#
.Position.x = -15
.Position.y = 10
.Position.z = 15
End With
goFade.LightColor(1) = light
.SetLight 1, light 'let d3d know about the light
.LightEnable 1, 1 'turn it on
goFade.NumLight = 1
End If
If lNumLights > 3 Then
.SetRenderState D3DRS_AMBIENT, 0
goFade.AmbientColor = 0
'Now turn on the third light if we can
With light
.Type = D3DLIGHT_DIRECTIONAL
.Direction.x = -15
.Direction.y = 10
.Direction.z = 15
.Range = 1000#
.Position.x = 15
.Position.y = -10
.Position.z = -15
End With
goFade.LightColor(2) = light
.SetLight 2, light 'let d3d know about the light
.LightEnable 2, 1 'turn it on
goFade.NumLight = 2
End If
End With
goFade.MaxAmbientColor = goFade.AmbientColor
End Sub