-
Notifications
You must be signed in to change notification settings - Fork 3
/
clsShuttle.cls
214 lines (166 loc) · 5.22 KB
/
clsShuttle.cls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "clsShuttle"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Rem *** Player_Shuttle Ship Class ***
Rem *** Purpose: Maintain player shuttle
Enum CONST_SHUTTLEMOVEMENT
SM_NONE = 0
SM_MOVELEFT = 1
SM_MOVERIGHT = 2
SM_MOVEUP = 4
SM_MOVEDOWN = 8
End Enum
Private Const SHUTTLE_ACCELERATION As Single = 0.05
Private Const SHUTTLE_MAXACCELERATION As Single = 4.2
Private Const SHUTTLE_MAXVACCELERATION As Single = SHUTTLE_MAXACCELERATION / 3#
Private m_x As Single ' position
Private m_y As Single
Private m_vx As Single ' velocity
Private m_vy As Single
Private m_ax As Single ' acceleration
Private m_ay As Single
Private m_HitPoints As Long ' shuttle hitpoints
'///////////////////////////////////////////////////////////////////////////////////
'//// Name: ()
'//// Desc:
'///////////////////////////////////////////////////////////////////////////////////
Private Sub Class_Initialize()
Call Me.Create(50, 50)
End Sub
'///////////////////////////////////////////////////////////////////////////////////
'//// Name: Create()
'//// Desc: Setup the ship
'///////////////////////////////////////////////////////////////////////////////////
Public Sub _
Create(xpos As Integer, ypos As Integer)
' set starting position
m_x = rScreen.Right / 2 'xpos
m_y = rScreen.Bottom / 2 'ypos
m_HitPoints = 100
wx = 0
wy = 0
End Sub
'///////////////////////////////////////////////////////////////////////////////////
'//// Name: Update()
'//// Desc: Update ship movement and render it
'///////////////////////////////////////////////////////////////////////////////////
Public Sub _
Update()
Static lTime As Long
Static bMoveShip As Boolean ' advance ship or world position
Static shpDir As enumDirection
Static lFrame As Long
Dim dx As Long
Dim dy As Long
Dim lCurTime As Long
Dim shipmv As CONST_SHUTTLEMOVEMENT
shipmv = SM_NONE
lCurTime = GetTicks()
If (lTime < lCurTime) Then
lTime = 100 + lCurTime
Call mDirectInput.DICheckKeys
If (DIKeyState(DIK_W) = KS_KEYDOWN) Then shipmv = shipmv Or SM_MOVEUP
If (DIKeyState(DIK_S) = KS_KEYDOWN) Then shipmv = shipmv Or SM_MOVEDOWN
If (DIKeyState(DIK_A) = KS_KEYDOWN) Then shipmv = shipmv Or SM_MOVELEFT
If (DIKeyState(DIK_D) = KS_KEYDOWN) Then shipmv = shipmv Or SM_MOVERIGHT
End If
' accelerate shuttle
If (shipmv And SM_MOVELEFT) Then
m_vx = -SHUTTLE_MAXACCELERATION
lFrame = 0
ElseIf (shipmv And SM_MOVERIGHT) Then
m_vx = SHUTTLE_MAXACCELERATION
lFrame = 6
End If
If (shipmv And SM_MOVEUP) Then
m_vy = -SHUTTLE_MAXVACCELERATION
ElseIf (shipmv And SM_MOVEDOWN) Then
m_vy = SHUTTLE_MAXVACCELERATION
End If
' advance vertical position
m_y = m_y + m_vy
' check and advance either world or ship position
If (Not bMoveShip) Then
wx = wx + m_vx
If (wx < 0) Then
shpDir = SO_LEFT
bMoveShip = True
ElseIf (wx > arMS_Offsets(2)) Then
shpDir = SO_RIGHT
bMoveShip = True
End If
Else
m_x = m_x + m_vx
' move shuttle left
If (shpDir = SO_LEFT) Then
If (m_x < 0) Then
m_x = 0
m_vx = 0
ElseIf (m_x > rScreen.Right / 2) Then
m_x = rScreen.Right / 2
bMoveShip = False
End If
' move shuttle right
ElseIf (shpDir = SO_RIGHT) Then
' bound horizontal position
If (m_x > MAX_CX - 50) Then
m_x = MAX_CX - 50
m_vx = 0
ElseIf (m_x < rScreen.Right / 2) Then
m_x = rScreen.Right / 2
bMoveShip = False
End If
End If
End If
' kill velocity
If (m_vx < 0) Then
m_vx = m_vx + SHUTTLE_ACCELERATION
ElseIf (m_vx > 0) Then
m_vx = m_vx - SHUTTLE_ACCELERATION
End If
If (m_vy < 0) Then
m_vy = m_vy + SHUTTLE_ACCELERATION
ElseIf (m_vy > 0) Then
m_vy = m_vy - SHUTTLE_ACCELERATION
End If
' bound coordinates
If (m_y < 0) Then
m_y = 0
m_vy = 0
ElseIf (m_y > VISIBLE_AREA_CY) Then
m_y = VISIBLE_AREA_CY
m_vy = 0
End If
' get blitting coordinates
dx = m_x
dy = m_y
' render ship
Call mGFX.BltFastGFX_HBM(dx, dy, g_Objects.Ship1(lFrame))
End Sub
'///////////////////////////////////////////////////////////////////////////////////
'//// Name: GetX()()
'//// Desc: get horizontal position
'///////////////////////////////////////////////////////////////////////////////////
Public Property Get _
GetX() As Long
GetX = wx + m_x
End Property
'///////////////////////////////////////////////////////////////////////////////////
'//// Name: GetY()()
'//// Desc: get vertical position
'///////////////////////////////////////////////////////////////////////////////////
Public Property Get _
GetY() As Long
GetY = wy + m_y
End Property