Files
Client/Library/dxx8/samples/Multimedia/VBSamples/Demos/AirHockey/cPaddle.cls
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

269 lines
8.8 KiB
OpenEdge ABL

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "cPaddle"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'Here we will encapsulate all of the code needed for the Paddle
'Local variables for the properties of the Paddle
Private moPosition As D3DVECTOR 'Current position of the Paddle
Private moVelocity As D3DVECTOR 'Current velocity of the Paddle
Private moLastPosition As D3DVECTOR 'Last position of the Paddle
Private moPaddle As CD3DFrame 'D3D Mesh for the Paddle
Private mlPaddleTime As Long 'Last time the Paddle was updated
Private mlTransparantPaddle As Boolean
Public LastVelocityTick As Long 'Last time the paddle's velocity changed
Public PaddleID As Long
'Position property
Public Property Let Position(oPos As D3DVECTOR)
moPosition = oPos
End Property
Public Property Get Position() As D3DVECTOR
Position = moPosition
End Property
'Velocity property
Public Property Let Velocity(oVel As D3DVECTOR)
moVelocity = oVel
End Property
Public Property Get Velocity() As D3DVECTOR
Velocity = moVelocity
End Property
'LastPosition prop
Public Property Let LastPosition(oLastPos As D3DVECTOR)
moLastPosition = oLastPos
End Property
Public Property Get LastPosition() As D3DVECTOR
LastPosition = moLastPosition
End Property
'Transparent property
Public Property Let Transparent(ByVal fTrans As Boolean)
Dim oMesh As CD3DMesh, oMaterial As D3DMATERIAL8
Dim lNumMaterial As Long, lCount As Long
mlTransparantPaddle = fTrans
'now set the property
Set oMesh = moPaddle.FindChildObject("paddle", 0)
lNumMaterial = oMesh.GetMaterialCount
For lCount = 0 To lNumMaterial - 1
oMaterial = oMesh.GetMaterial(lCount)
If fTrans Then
oMaterial.diffuse.a = 0.5
Else
oMaterial.diffuse.a = 1
End If
oMesh.SetMaterial lCount, oMaterial
Next
End Property
Public Property Get Transparent() As Boolean
Transparent = mlTransparantPaddle
End Property
'Methods
Public Sub Init(ByVal sMedia As String, sFile As String)
Set moPaddle = D3DUtil_LoadFromFile(AddDirSep(sMedia) & sFile, Nothing, Nothing)
End Sub
Public Sub UpdateTime()
mlPaddleTime = timeGetTime
End Sub
Public Sub UpdatePosition()
Dim RealVelocity As D3DVECTOR
'Here we will update the position of the paddle
'and move it based on the velocity assigned.
If mlPaddleTime = 0 Then mlPaddleTime = timeGetTime
'First calculate the 'real' velocity (based on the time)
RealVelocity.X = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.X
RealVelocity.Y = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.Y
RealVelocity.z = ((timeGetTime - mlPaddleTime) / 100) * moVelocity.z
'Let's save our current position
moLastPosition = moPosition
moPosition.X = moPosition.X + RealVelocity.X
moPosition.Y = moPosition.Y + RealVelocity.Y
moPosition.z = moPosition.z + RealVelocity.z
mlPaddleTime = timeGetTime
End Sub
Public Sub Render(dev As Direct3DDevice8)
Dim matPaddle As D3DMATRIX
D3DXMatrixIdentity matPaddle
D3DXMatrixTranslation matPaddle, moPosition.X, moPosition.Y, moPosition.z
moPaddle.SetMatrix matPaddle
moPaddle.Render dev
End Sub
Public Sub CleanupFrame()
Set moPaddle = Nothing
End Sub
Public Sub EnsureReality(oldPos As D3DVECTOR, oPuck As cPuck)
Dim vecDif As D3DVECTOR, nDistance As Single
Dim vNewVel As D3DVECTOR, nVel As Single
Dim fMovePaddle As Boolean
'We do *not* want to go 'inside' the puck, don't let it happen
D3DXVec3Subtract vecDif, oPuck.Position, moPosition
nDistance = D3DXVec3Length(vecDif)
If nDistance < (gnPuckRadius + gnPaddleRadius) Then
'Ok, we are within the puck, now who should move? The puck or the paddle?
With moPosition
fMovePaddle = False
If .z < (gnFarWallEdge + (gnPaddleRadius + gnPuckRadius)) Then
fMovePaddle = True
End If
If .z > (gnNearWallEdge - (gnPaddleRadius + gnPuckRadius)) Then
fMovePaddle = True
End If
If .X < (gnSideRightWallEdge + (gnPaddleRadius + gnPuckRadius)) Then
fMovePaddle = True
End If
If .X > (gnSideLeftWallEdge - (gnPaddleRadius + gnPuckRadius)) Then
fMovePaddle = True
End If
End With
If fMovePaddle Then
'Move the paddle back out so it's not hitting the puck
Dim vDir As D3DVECTOR, vScale As D3DVECTOR, vPaddleVel As D3DVECTOR
Dim vPaddleDif As D3DVECTOR
D3DXVec3Subtract vPaddleDif, oPuck.Position, moPosition
D3DXVec3Subtract vPaddleVel, oldPos, moPosition
'Get the direction vector by normalizing the pucks velocity
D3DXVec3Normalize vDir, vPaddleVel
'Scale the length of the two vectors, plus a little more.
D3DXVec3Scale vScale, vDir, D3DXVec3Length(vPaddleDif) '(gnPaddleRadius / 4)
'Move the paddle to it's new location
D3DXVec3Add moPosition, oldPos, vScale
'Else We can ignore the case of the puck needing to move because that will
'happen in checkcollisions call for the puck
End If
End If
End Sub
Public Sub DoComputerAI(oPuck As cPuck)
Dim vOldPos As D3DVECTOR
Dim nTempX As Single, nTempZ As Single
'We'll create a simplistic AI opponent
vOldPos = moPosition
'Let's just set the velocity of the paddle
moLastPosition = moPosition
With moPosition
If Abs(oPuck.Position.X > .X) Then
nTempX = Min(oPuck.Velocity.X, gnComputerMaximumVelocity)
Else
nTempX = Min(oPuck.Velocity.X, -gnComputerMaximumVelocity)
End If
If Abs(oPuck.Position.z - .z) > Abs(oPuck.LastPosition.z - .z) Then
nTempZ = gnComputerMaximumVelocity
Else
nTempZ = -gnComputerMaximumVelocity
End If
End With
moVelocity = vec3(nTempX, 0, nTempZ)
'If the puck is in *front* of the paddle, just move the paddle directly backwards
If moPosition.z < oPuck.Position.z Then
moVelocity = vec3(0, 0, gnComputerMaximumVelocity)
End If
UpdatePosition
EnsureReality vOldPos, oPuck
With moPosition
nTempX = .X
nTempZ = .z
If PaddleID = 0 Then
If nTempZ > -(gnPaddleRadius * 1.5) Then
nTempZ = -(gnPaddleRadius * 1.5)
ElseIf nTempZ < (gnFarWallEdge + (gnPaddleRadius)) Then
nTempZ = (gnFarWallEdge + (gnPaddleRadius))
End If
Else
If nTempZ > (gnNearWallEdge - (gnPaddleRadius)) Then
nTempZ = (gnNearWallEdge - (gnPaddleRadius))
ElseIf nTempZ < (gnPaddleRadius * 1.5) Then
nTempZ = (gnPaddleRadius * 1.5)
End If
End If
If nTempX < (gnSideRightWallEdge + (gnPaddleRadius)) Then
nTempX = (gnSideRightWallEdge + (gnPaddleRadius))
End If
If nTempX > (gnSideLeftWallEdge - (gnPaddleRadius)) Then
nTempX = (gnSideLeftWallEdge - (gnPaddleRadius))
End If
moPosition = vec3(nTempX, moPosition.Y, nTempZ)
End With
End Sub
Public Function FadeMesh(FadeInterval As Single) As Boolean
Dim lNumMaterial As Long
Dim lCount As Long
Dim oMaterial As D3DMATERIAL8
Dim fDoneFading As Boolean
Dim oMesh As CD3DMesh
Dim nInternalInterval As Single
Static lFadeTime As Long
nInternalInterval = FadeInterval
If lFadeTime = 0 Then
lFadeTime = timeGetTime
Exit Function 'We'll do the fade next render pass
End If
nInternalInterval = (((timeGetTime - lFadeTime) / 1000000) * nInternalInterval)
Set oMesh = moPaddle.FindChildObject("paddle", 0)
fDoneFading = True
lNumMaterial = oMesh.GetMaterialCount
For lCount = 0 To lNumMaterial - 1
oMaterial = oMesh.GetMaterial(lCount)
If nInternalInterval > 0 And oMaterial.diffuse.a <= 1 Then
oMaterial.diffuse.a = oMaterial.diffuse.a + nInternalInterval
fDoneFading = False
ElseIf nInternalInterval < 0 And oMaterial.diffuse.a >= -1 Then
oMaterial.diffuse.a = oMaterial.diffuse.a + nInternalInterval
fDoneFading = False
End If
oMesh.SetMaterial lCount, oMaterial
Next
FadeMesh = fDoneFading
End Function
Private Sub Class_Initialize()
Set moPaddle = Nothing
End Sub
Private Sub Class_Terminate()
Set moPaddle = Nothing
End Sub
Private Function Min(ByVal nVal As Single, nVal2 As Single) As Single
If Abs(nVal) < Abs(nVal2) Then
Min = nVal
Else
Min = nVal2
End If
End Function