Still having problems with my script.
Here's what I'm trying at present
Sub Player_OnControllerMove(OldActions, NewActions)
If (Not OldActions) And NewActions And ACTION_UP Then DoSpriteAccelerate
If (Not OldActions) And NewActions And ACTION_DOWN Then DoSpriteDeccelerate
If Not (Not OldActions) And (Not NewActions) And ACTION_DOWN Then DoSpriteSteady
If Not (Not OldActions) And (Not NewActions) And ACTION_UP Then DoSpriteSteady
End Sub
Sub DoSpriteAccelerate
Dim DX, DY, oPlayerSprite
Set oPlayerSprite = ProjectObj.GamePlayer.PlayerSprite
With ProjectObj.GamePlayer.PlayerSprite
oPlayerSprite.X =.X + (.Width -oPlayerSprite.Width)/2
oPlayerSprite.Y =.Y + (.Width -oPlayerSprite.Width)/2
GetStateDeltas DX, DY
oPlayerSprite.DX = (DX * oPlayerSprite.rDef.Template.MoveSpeed) * 1.2
oPlayerSprite.DY = (DY * oPlayerSprite.rDef.Template.MoveSpeed) * 1.2
If oPlayerSprite.rDef.Template.StateCount = 36 Then oPlayerSprite.CurState = RectToPolarState(DX, DY)
End With
End Sub
Sub DoSpriteDeccelerate
Dim DX, DY, oPlayerSprite
Set oPlayerSprite = ProjectObj.GamePlayer.PlayerSprite
With ProjectObj.GamePlayer.PlayerSprite
oPlayerSprite.X =.X + (.Width -oPlayerSprite.Width)/2
oPlayerSprite.Y =.Y + (.Width -oPlayerSprite.Width)/2
GetStateDeltas DX, DY
oPlayerSprite.DX = (DX * oPlayerSprite.rDef.Template.MoveSpeed) * .8
oPlayerSprite.DY = (DY * oPlayerSprite.rDef.Template.MoveSpeed) * .8
If oPlayerSprite.rDef.Template.StateCount = 36 Then oPlayerSprite.CurState = RectToPolarState(DX, DY)
End With
End Sub
Sub DoSpriteSteady
Dim DX, DY, oPlayerSprite
Set oPlayerSprite = ProjectObj.GamePlayer.PlayerSprite
With ProjectObj.GamePlayer.PlayerSprite
'oPlayerSprite.X =.X + (.Width -oPlayerSprite.Width)/2
'oPlayerSprite.Y =.Y + (.Width -oPlayerSprite.Width)/2
GetStateDeltas DX, DY
oPlayerSprite.DX = (DX * oPlayerSprite.rDef.Template.MoveSpeed)
oPlayerSprite.DY = (DY * oPlayerSprite.rDef.Template.MoveSpeed)
If oPlayerSprite.rDef.Template.StateCount = 36 Then oPlayerSprite.CurState = RectToPolarState(DX, DY)
End With
End Sub
Function GetStateDeltas(DX, DY)
With ProjectObj.GamePlayer.PlayerSprite
Select Case .rDef.Template.StateType
Case STATE_SINGLE
If Abs(DX) + Abs(DY) > 1 Then
DX = .DX / (Abs(.DX) + Abs(.DY))
DY = .DY / (Abs(.DX) + Abs(.DY))
Else
If Abs(DX) + Abs(DY) < 1 Then DX = 0 : DY = -1
End If
Case STATE_LEFT_RIGHT
DY = 0
If (.CurState Mod 2) = 0 Then DX = -1 Else DX = 1
Case STATE_8_DIRECTION
Select Case (.CurState Mod 8)
Case 0 : DX = 0 : DY = -1
Case 1 : DX = 1 : DY = -1
Case 2 : DX = 1 : DY = 0
Case 3 : DX = 1 : DY = 1
Case 4 : DX = 0 : DY = 1
Case 5 : DX = -1 : DY = 1
Case 6 : DX = -1 : DY = 0
Case 7 : DX = -1 : DY = -1
End Select
Case Else
DX = Cos((.CurState Mod 36) * 3.14159 / 18)
DY = -Sin((.CurState Mod 36) * 3.14159 / 18)
End Select
End With
End Function
Function RectToPolarState(X, Y)
Dim Angle, Pi
Pi = 3.14159
If X <> 0 Then
Angle = Atn(-Y / X)
Else
Angle = -(Pi / 2) * Sgn(Y)
End If
If X < 0 Then
Angle = Pi + Angle
ElseIf Y > 0 Then
Angle = Pi * 2 + Angle
End If
RectToPolarState = ((Angle * 18) / Pi) Mod 36
End Function
HostObj.SinkObjectEvents ProjectObj.GamePlayer, "Player"
HostObj.ConnectEventsNow()
ProjectObj.GamePlayer.Play 16
Unfortunately I can't think of an easy way to adjust the direction of the sprite. I think maybe call a Function with an added value to the angle variable in a custom based off of the Function used in the script wizard. I know this a terribly ugly way to code this, but I still have trouble with how Gamedev interacts with the sprite definitions.