[EOVB] Simple Learning: A Better Character Movement System

~This Tutorial is for beginners; especially as a learning tool.~

Here is a Step - By - Step Tutorial on how to improve the Character Movement in your game.

~Pay attention to what you are truly doing while following the tutorial to gain better insight into editing source code.~

First of all, thanks to, daxterxx for making this Tutorial: http://www.touchofde…oothness-in-eo/

Thanks also go out to, xppxdd for posting this list: http://www.touchofde…imple-need-vb6/

EDIT: I almost forgot ValentineBr who found this: http://www.touchofde…layer-movement/

(REMEMBER TO ALWAYS MAKE A BACK-UP OF YOUR PROJECT BEFORE EDITING IT)

Now, we start off by looking at daxterxx’s Tutorial and in modGameLogic find:

Select Case Player(Index).Moving
	 Case MOVING_WALKING: MovementSpeed = ((ElapsedTime / 1000) * (RUN_SPEED * SIZE_X))
	 Case MOVING_RUNNING: MovementSpeed = ((ElapsedTime / 1000) * (WALK_SPEED * SIZE_X))
	 Case Else: Exit Sub
End Select

Then change it to:

Select Case Player(Index).Moving
	 Case MOVING_WALKING: MovementSpeed = WALK_SPEED
	 Case MOVING_RUNNING: MovementSpeed = RUN_SPEED
Case Else: Exit Sub
End Select

```Look now and see that your values equal exactly what your walking and running rates are. Feel free to check your standard rates before moving on by logging in and moving around a bit.

**STOP!** modGameLogic. **Think** about what you just did. Client Side Only. You just **changed** what your Player MovementSpeed Equals to a Variable. _*****_ _Player_ - Your Sprite in-game. _Movement Speed_ - How fast something moves; in this case your Player. _Equals_ - Describes the relation of complete balance. _Variable_ - A value that is to be used in specific instances to determine a purpose. * _**What do I do next?**_ Find where your WALK_SPEED & RUN_SPEED Variables are located.

Now find in modConstants:

’ Speed moving vars
Public Const WALK_SPEED As Byte = 4
Public Const RUN_SPEED As Byte = 6

Change this to:

’ Speed moving vars
Public Const WALK_SPEED As Byte = 3
Public Const RUN_SPEED As Byte = 5


**Example:** "Public Const WALK_SPEED As Byte = 3" this means that if "Case MOVING_WALKING: MovementSpeed = WALK_SPEED" to put it simply, means MovementSpeed = 3.

**STOP!** modConstants. **Think**, you just changed the Constant Value of the Variables _WALK_SPEED_ & _RUN_SPEED_. Right before, you changed the Value of MovementSpeed in GameLogic. All together, MovementSpeed of your Player Equals _3_ & _5_ respectivly for Walking and Running. _*****_ _Value_ - A set allowance or amount. _Constant Value_ - A Value that never changes. _WALK_SPEED_ - A Variable that you set for the Value of Walking MovementSpeed. _RUN_SPEED_ - A Variable that you set for the Value of Running MovementSpeed. _3_ - The Value of the Variable WALK_SPEED; that is the Value of Walking MovementSpeed. _5_ - The Value of the Variable RUN_SPEED; that is the Value of Running MovementSpeed. _Walking_ - The Term I gave to Case MOVING_WALKING in modGameLogic. _Running_ - The Term I gave to Case MOVING_RUNNING in modGameLogic.

The next step is to change:

’ Check if player is walking, and if so process moving them over
Select Case Player(Index).Moving
Case MOVING_WALKING: MovementSpeed = WALK_SPEED
Case MOVING_RUNNING: MovementSpeed = RUN_SPEED
Case Else: Exit Sub
End Select

To this: (EDIT: Also added ValentineBr's addition)

’ Check if player is walking, and if so process moving them over
Select Case Player(Index).Moving
Case MOVING_WALKING: MovementSpeed = WALK_SPEED + (Player(MyIndex).Stat(Willpower) / 30)
Case MOVING_RUNNING: MovementSpeed = RUN_SPEED + (Player(MyIndex).Stat(Agility) / 15)
Case Else: Exit Sub
End Select

If Player(Index).step = 0 Then Player(Index).step = 1

_*Like this post after testing the increase rates with an Admin if you approve*_

_*That is probably the last formula revision as I find it to be a nice rate & **even with maxed stats you don't cap out the Engine's capabilities**.*_

Now on to xppxdd's Post about changing keys.

From his post I was able to change the "Run" key to CTRL and the "Attack/ Interact" key to Shift & also be able to move with both the Arrow Keys and W, A, S, D Keys. The purpose of this is so that people can essentially play with one hand on the keyboard and one on the mouse. They also have better control if using both hands on the keyboard.

Here's how I did it. In modConstants find:

’ Key constants
Public Const VK_UP As Long = &H26
Public Const VK_DOWN As Long = &H28
Public Const VK_LEFT As Long = &H25
Public Const VK_RIGHT As Long = &H27
Public Const VK_SHIFT As Long = &H10
Public Const VK_RETURN As Long = &HD
Public Const VK_CONTROL As Long = &H11

Add W, A, S, D Keys bettween RIGHT & SHIFT to get this:

’ Key constants
Public Const VK_UP As Long = &H26
Public Const VK_DOWN As Long = &H28
Public Const VK_LEFT As Long = &H25
Public Const VK_RIGHT As Long = &H27
Public Const VK_W As Long = &H57
Public Const VK_S As Long = &H53
Public Const VK_A As Long = &H41
Public Const VK_D As Long = &H44
Public Const VK_SHIFT As Long = &H10
Public Const VK_RETURN As Long = &HD
Public Const VK_CONTROL As Long = &H11


If GetAsyncKeyState(VK_UP) >= 0 Then DirUp = False
If GetAsyncKeyState(VK_DOWN) >= 0 Then DirDown = False
If GetAsyncKeyState(VK_LEFT) >= 0 Then DirLeft = False
If GetAsyncKeyState(VK_RIGHT) >= 0 Then DirRight = False
If GetAsyncKeyState(VK_CONTROL) >= 0 Then ControlDown = False
If GetAsyncKeyState(VK_SHIFT) >= 0 Then ShiftDown = False

Add W, A, S, D here, like so:

If GetAsyncKeyState(VK_UP) >= 0 Then DirUp = False
If GetAsyncKeyState(VK_DOWN) >= 0 Then DirDown = False
If GetAsyncKeyState(VK_LEFT) >= 0 Then DirLeft = False
If GetAsyncKeyState(VK_RIGHT) >= 0 Then DirRight = False
If GetAsyncKeyState(VK_W) >= 0 Then DirUp = False
If GetAsyncKeyState(VK_S) >= 0 Then DirDown = False
If GetAsyncKeyState(VK_A) >= 0 Then DirLeft = False
If GetAsyncKeyState(VK_D) >= 0 Then DirRight = False
If GetAsyncKeyState(VK_CONTROL) >= 0 Then ControlDown = False
If GetAsyncKeyState(VK_SHIFT) >= 0 Then ShiftDown = False


'Move Up
If GetKeyState(vbKeyUp) < 0 Then
DirUp = True
DirDown = False
DirLeft = False
DirRight = False
Exit Sub
Else
DirUp = False
End If
'Move Right
If GetKeyState(vbKeyRight) < 0 Then
DirUp = False
DirDown = False
DirLeft = False
DirRight = True
Exit Sub
Else
DirRight = False
End If
'Move down
If GetKeyState(vbKeyDown) < 0 Then
DirUp = False
DirDown = True
DirLeft = False
DirRight = False
Exit Sub
Else
DirDown = False
End If
'Move left
If GetKeyState(vbKeyLeft) < 0 Then
DirUp = False
DirDown = False
DirLeft = True
DirRight = False
Exit Sub
Else
DirLeft = False
End If

Add the W, A, S, D Keys here as shown:

'Move Up
If GetKeyState(vbKeyUp) < 0 Or GetKeyState(vbKeyW) < 0 Then
DirUp = True
DirDown = False
DirLeft = False
DirRight = False
Exit Sub
Else
DirUp = False
End If
'Move Right
If GetKeyState(vbKeyRight) < 0 Or GetKeyState(vbKeyD) < 0 Then
DirUp = False
DirDown = False
DirLeft = False
DirRight = True
Exit Sub
Else
DirRight = False
End If
'Move down
If GetKeyState(vbKeyDown) < 0 Or GetKeyState(vbKeyS) < 0 Then
DirUp = False
DirDown = True
DirLeft = False
DirRight = False
Exit Sub
Else
DirDown = False
End If
'Move left
If GetKeyState(vbKeyLeft) < 0 Or GetKeyState(vbKeyA) < 0 Then
DirUp = False
DirDown = False
DirLeft = True
DirRight = False
Exit Sub
Else
DirLeft = False
End If


’ Check if player has the shift key down for running
If ShiftDown Then
Player(MyIndex).Moving = MOVING_RUNNING
Else
Player(MyIndex).Moving = MOVING_WALKING
End If

Then change ShiftDown to ControlDown, like so: (Also change the comment to say "control" instead of "shift")

’ Check if player has the control key down for running
If ControlDown Then
Player(MyIndex).Moving = MOVING_RUNNING
Else
Player(MyIndex).Moving = MOVING_WALKING
End If

Then find in Sub CheckAttack:

If ControlDown Then
If InEvent = True Then Exit Sub
Select Case Player(MyIndex).Dir
Case DIR_UP
X = GetPlayerX(MyIndex)
Y = GetPlayerY(MyIndex) - 1
Case DIR_DOWN
X = GetPlayerX(MyIndex)
Y = GetPlayerY(MyIndex) + 1
Case DIR_LEFT
X = GetPlayerX(MyIndex) - 1
Y = GetPlayerY(MyIndex)
Case DIR_RIGHT
X = GetPlayerX(MyIndex) + 1
Y = GetPlayerY(MyIndex)
End Select

Then change ControlDown to ShiftDown as shown:

If ShiftDown Then
If InEvent = True Then Exit Sub
Select Case Player(MyIndex).Dir
Case DIR_UP
X = GetPlayerX(MyIndex)
Y = GetPlayerY(MyIndex) - 1
Case DIR_DOWN
X = GetPlayerX(MyIndex)
Y = GetPlayerY(MyIndex) + 1
Case DIR_LEFT
X = GetPlayerX(MyIndex) - 1
Y = GetPlayerY(MyIndex)
Case DIR_RIGHT
X = GetPlayerX(MyIndex) + 1
Y = GetPlayerY(MyIndex)
End Select

That should be all you have to do! Compile before saving to test if you like the changes or not. Save after testing if you like your changes. && Most of all; ENJOY! ![](http://www.touchofdeathforums.com/community/public/style_emoticons/default/biggrin.png)

~*(Please comment what you think of the Tutorial, Source Mod. & any Bugs/ Glitches/ Problems you find)*~

’ Speed moving vars

Public Const WALK_SPEED As Byte = 2.75

Public Const RUN_SPEED As Byte = 5.5

Bytes can only be whole numbers. Use Singles.

I thought so too, but it seems to work. Now that you mention it, would it just be automatically rounding them?

EDIT: Thanks to - Matthew - for confirming this.

EDIT: (Changed in main post)

From:


' Speed moving vars

Public Const WALK_SPEED As Byte = 2.75

Public Const RUN_SPEED As Byte = 5.5

To:


' Speed moving vars

Public Const WALK_SPEED As Byte = 3

Public Const RUN_SPEED As Byte = 5

EDIT: Get a sticky for this? As it’s extremely useful for everyone & will be updated until 100% refied.

I thought so to, but it seems to work. Would it just be automatically rounding them?

It does.

Log in to reply