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

214 lines
6.6 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 = "cCamera"
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 camera
Private Enum DefaultCameraViews
DefaultView
OverHeadView
SideOverheadView1
SideOverheadView2
OpponentView
CustomView
End Enum
'Here are the constants for the default view
Private Const mnDefaultX As Single = 0
Private Const mnDefaultY As Single = 10
Private Const mnDefaultZ As Single = -25
'Here are the constants for the overhead views
Private Const mnOverheadX As Single = 0
Private Const mnOverheadY As Single = 28
Private Const mnOverheadZ As Single = -1
'Here are the constants for the side overhead views
Private Const mnSide1X As Single = 25
Private Const mnSide1Y As Single = 12.5
Private Const mnSide1Z As Single = 0
Private Const mnSide2X As Single = -25
Private Const mnSide2Y As Single = 12.5
Private Const mnSide2Z As Single = 0
'Here are the constants for the opponent views
Private Const mnOpponentX As Single = 0
Private Const mnOpponentY As Single = 10
Private Const mnOpponentZ As Single = 25
'Local variables for the properties of the puck
Private moPosition As D3DVECTOR 'Current position of the camera
Private moVelocity As D3DVECTOR 'Current velocity of the camera
Private moDest As D3DVECTOR 'Destination of the camera
Private mlCameraTime As Long 'Last time the puck was updated
Private moLastPosition As D3DVECTOR 'Last position of the camera
'The default camera views
Public CameraView 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
'Dest property
Public Property Let Dest(oPos As D3DVECTOR)
moDest = oPos
End Property
Public Property Get Dest() As D3DVECTOR
Dest = moDest
End Property
'Methods
Public Sub UpdatePosition()
Dim RealVelocity As D3DVECTOR
Dim DistancePointX As Single
Dim DistancePointY As Single
Dim DistancePointZ As Single
'Here we will update the position of the camera
'and move it based on the velocity assigned.
If mlCameraTime = 0 Then mlCameraTime = timeGetTime
'First calculate the 'real' velocity (based on the time)
RealVelocity.x = ((timeGetTime - mlCameraTime) / 100) * moVelocity.x
RealVelocity.y = ((timeGetTime - mlCameraTime) / 100) * moVelocity.y
RealVelocity.z = ((timeGetTime - mlCameraTime) / 100) * moVelocity.z
'Let's save our current position
moLastPosition = moPosition
'Now let's see if moving our position will move us past our destination
'if it does, move us to our destination
'First check the X axis
DistancePointX = Sqr((moDest.x - moPosition.x) * (moDest.x - moPosition.x))
If DistancePointX < RealVelocity.x Then
moPosition.x = moDest.x 'We've arrived
moVelocity.x = 0
Else
moPosition.x = moPosition.x + RealVelocity.x 'We haven't got to our destination yet, keep going
End If
'Now check the Y axis
DistancePointY = Sqr((moDest.y - moPosition.y) * (moDest.y - moPosition.y))
If DistancePointY < RealVelocity.y Then
moPosition.y = moDest.y 'We've arrived
moVelocity.y = 0
Else
moPosition.y = moPosition.y + RealVelocity.y 'We haven't got to our destination yet, keep going
End If
'Now check the Z axis
DistancePointZ = Sqr((moDest.z - moPosition.z) * (moDest.z - moPosition.z))
If DistancePointZ < RealVelocity.z Then
moPosition.z = moDest.z 'We've arrived
moVelocity.z = 0
Else
moPosition.z = moPosition.z + RealVelocity.z 'We haven't got to our destination yet, keep going
End If
'Make sure our velocity is going in the right direction
If DistancePointX < Sqr((moDest.x - moPosition.x) * (moDest.x - moPosition.x)) Then
'It's not, reverse it
moVelocity.x = moVelocity.x * -1
End If
If DistancePointY < Sqr((moDest.y - moPosition.y) * (moDest.y - moPosition.y)) Then
'It's not, reverse it
moVelocity.y = moVelocity.y * -1
End If
If DistancePointZ < Sqr((moDest.z - moPosition.z) * (moDest.z - moPosition.z)) Then
'It's not, reverse it
moVelocity.z = moVelocity.z * -1
End If
mlCameraTime = timeGetTime
End Sub
Public Sub NextCameraPosition(ByVal lPlayerID As Long)
If CameraView = CustomView Then
CameraView = DefaultView
Else
CameraView = CameraView + 1
If CameraView = CustomView Then
CameraView = DefaultView
End If
End If
UpdateToNewPosition lPlayerID
End Sub
Public Sub SetCameraPosition(ByVal lCameraPos As Long, ByVal lPlayerID As Long)
CameraView = lCameraPos
If CameraView <> CustomView Then UpdateToNewPosition lPlayerID
End Sub
Private Sub UpdateToNewPosition(ByVal lPlayerID As Long)
Select Case CameraView
Case DefaultView
If lPlayerID = 0 Then
moDest.x = mnDefaultX
moDest.y = mnDefaultY
moDest.z = mnDefaultZ
Else 'Default view should be the opponents view
moDest.x = mnOpponentX
moDest.y = mnOpponentY
moDest.z = mnOpponentZ
End If
Case OpponentView
If lPlayerID = 1 Then
moDest.x = mnDefaultX
moDest.y = mnDefaultY
moDest.z = mnDefaultZ
Else 'Default view should be the opponents view
moDest.x = mnOpponentX
moDest.y = mnOpponentY
moDest.z = mnOpponentZ
End If
Case OverHeadView
moDest.x = mnOverheadX
moDest.y = mnOverheadY
moDest.z = mnOverheadZ
Case SideOverheadView1
moDest.x = mnSide1X
moDest.y = mnSide1Y
moDest.z = mnSide1Z
Case SideOverheadView2
moDest.x = mnSide2X
moDest.y = mnSide2Y
moDest.z = mnSide2Z
End Select
'Set up a default velocity
moVelocity.x = 3
moVelocity.y = 3
moVelocity.z = 3
End Sub
Private Sub Class_Initialize()
CameraView = DefaultView
End Sub