This effect is done by acceleration and braking instead of just setting the camera speed. Note that I had to extend the Type again and the angle calculation was dropped from the LookAt function.
Public Type tCamera
'Current position
X as Single
Y as Single
'Requested position
DestX as Long
DestY as Long
'Next requested position
NextX as Long
NextY as Long
'Movement
Angle as Single
Speed as Single
'Screen size
w as Long 'W means width
h as Long 'H means height
'Number of tiles that fit on screen
TilesX as Long
TilesY as Long
'Front buffer
FrontDC as Long
End Type
Public Sub LookAt( iX as Long, iY as Long, iSmooth as Boolean )
With Camera
'Set requested position
.NextX = iX
.NextY = iY
If Not iSmooth Then
'Set current position
.X = iX
.Y = iY
'Check position
Clip
End If
End With
End Sub
Public Sub UpdatePosition()
Dim Dist as Long
Dim NewSpeed as Single
Static NextMove as Long
With Camera
'Timing
If NextMove > GetTickCount Then: Exit Sub
NextMove = GetTickCount + 20 'Update at 50 FPS
'Get distance
Dist = Distance( CLng( .X ), CLng( .Y ), .DestX, .DestY )
If ( .DestX = .NextX ) And ( .DestY = .NextY ) Then
'Exit when target reached
If Dist = 0 Then: Exit Sub
'Get speed
NewSpeed = Dist * 0.2
If NewSpeed > 24 Then: NewSpeed = 24
'Apply acceleration
If .Speed < NewSpeed Then: .Speed = .Speed + 1
If .Speed > NewSpeed Then: .Speed = NewSpeed
Else
'Brake
.Speed = .Speed * 0.8
'Change target when slow enough
If .Speed < 1 Then
.Speed = 0
'Set new target
.DestX = .NextX
.DestY = .NextY
'Continue in the next frame
Exit Sub
End If
End If
'Calculate angle
.Angle = GetAngle( .X, .Y, CSng( .DestX ), CSng( .DestY ) )
'Move camera
.X = .X + Cos( .Angle ) * .Speed
.Y = .Y + Sin( .Angle ) * .Speed
Clip
End With
End Sub
And for those who didn't get it all, here's the sample download: