Shaky movement at low speeds
by Gregory Martino · in Torque Game Engine · 01/23/2005 (12:05 pm) · 0 replies
Charcaters in our game have two movement modes, regular and aim mode. In aim mode they should move much more slowly. Following the example in the engine of lower underwater speed, I have added another bool, bInAimMode, that puts the player in the slower state.
However the movement is very shaky at low speeds, like 4. Not the character animations, but the terrain moving underneath them looks like it is shaking.
Setting the regular max movement speeds to low values, like 2, does not result in the shaking.
Setting the aim mode speeds to higher values, like 13, does not result in shaking.
Since regular movement speeds can be low without the shaking, I'm wondering what I'm missing when I try to use the aim mode speeds.
Here are the additions/changes I've made
In player.h:
F32 maxAimModeForwardSpeed; ///< Maximum AimMode forward speed when running
F32 maxAimModeBackwardSpeed; ///< Maximum AimMode backward speed when running
F32 maxAimModeSideSpeed; ///< Maximum AimMode side speed when running
In player.cs:
maxForwardSpeed = 8;
maxBackwardSpeed = 4;
maxSideSpeed = 4;
maxUnderwaterForwardSpeed = 8.4;
maxUnderwaterBackwardSpeed = 7.8;
maxUnderwaterSideSpeed = 7.8;
maxAimModeForwardSpeed = 4;
maxAimModeBackwardSpeed = 3;
maxAimModeSideSpeed = 3;
In the engine I followed the example of the underwater flag and used an aim mode boolean to set the movespeed
player.cc:
in updateMove:
if (move->y > 0)
{
if( mWaterCoverage >= 0.9 )
moveSpeed = getMax(mDataBlock->maxUnderwaterForwardSpeed * move->y,
mDataBlock->maxUnderwaterSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxForwardSpeed * move->y,
mDataBlock->maxSideSpeed * mFabs(move->x));
if(bInAimMode)
moveSpeed = getMax(mDataBlock->maxAimModeForwardSpeed * move->y,
mDataBlock->maxAimModeSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxForwardSpeed * move->y,
mDataBlock->maxSideSpeed * mFabs(move->x));
}
else
{
if( mWaterCoverage >= 0.9 )
moveSpeed = getMax(mDataBlock->maxUnderwaterBackwardSpeed * mFabs(move->y),
mDataBlock->maxUnderwaterSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxBackwardSpeed * mFabs(move->y),
mDataBlock->maxSideSpeed * mFabs(move->x));
if(bInAimMode)
moveSpeed = getMax(mDataBlock->maxAimModeBackwardSpeed * mFabs(move->y),
mDataBlock->maxAimModeSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxBackwardSpeed * mFabs(move->y),
mDataBlock->maxSideSpeed * mFabs(move->x));
}
I also added the variables to the field and stream
in initPersistFields():
addField("maxAimModeForwardSpeed", TypeF32, Offset(maxAimModeForwardSpeed, PlayerData));
addField("maxAimModeBackwardSpeed", TypeF32, Offset(maxAimModeBackwardSpeed, PlayerData));
addField("maxAimModeSideSpeed", TypeF32, Offset(maxAimModeSideSpeed, PlayerData));
In packData:
stream->write(maxAimModeForwardSpeed);
stream->write(maxAimModeBackwardSpeed);
stream->write(maxAimModeSideSpeed);
In unpackData:
stream->read(&maxAimModeForwardSpeed);
stream->read(&maxAimModeBackwardSpeed);
stream->read(&maxAimModeSideSpeed);
However the movement is very shaky at low speeds, like 4. Not the character animations, but the terrain moving underneath them looks like it is shaking.
Setting the regular max movement speeds to low values, like 2, does not result in the shaking.
Setting the aim mode speeds to higher values, like 13, does not result in shaking.
Since regular movement speeds can be low without the shaking, I'm wondering what I'm missing when I try to use the aim mode speeds.
Here are the additions/changes I've made
In player.h:
F32 maxAimModeForwardSpeed; ///< Maximum AimMode forward speed when running
F32 maxAimModeBackwardSpeed; ///< Maximum AimMode backward speed when running
F32 maxAimModeSideSpeed; ///< Maximum AimMode side speed when running
In player.cs:
maxForwardSpeed = 8;
maxBackwardSpeed = 4;
maxSideSpeed = 4;
maxUnderwaterForwardSpeed = 8.4;
maxUnderwaterBackwardSpeed = 7.8;
maxUnderwaterSideSpeed = 7.8;
maxAimModeForwardSpeed = 4;
maxAimModeBackwardSpeed = 3;
maxAimModeSideSpeed = 3;
In the engine I followed the example of the underwater flag and used an aim mode boolean to set the movespeed
player.cc:
in updateMove:
if (move->y > 0)
{
if( mWaterCoverage >= 0.9 )
moveSpeed = getMax(mDataBlock->maxUnderwaterForwardSpeed * move->y,
mDataBlock->maxUnderwaterSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxForwardSpeed * move->y,
mDataBlock->maxSideSpeed * mFabs(move->x));
if(bInAimMode)
moveSpeed = getMax(mDataBlock->maxAimModeForwardSpeed * move->y,
mDataBlock->maxAimModeSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxForwardSpeed * move->y,
mDataBlock->maxSideSpeed * mFabs(move->x));
}
else
{
if( mWaterCoverage >= 0.9 )
moveSpeed = getMax(mDataBlock->maxUnderwaterBackwardSpeed * mFabs(move->y),
mDataBlock->maxUnderwaterSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxBackwardSpeed * mFabs(move->y),
mDataBlock->maxSideSpeed * mFabs(move->x));
if(bInAimMode)
moveSpeed = getMax(mDataBlock->maxAimModeBackwardSpeed * mFabs(move->y),
mDataBlock->maxAimModeSideSpeed * mFabs(move->x));
else
moveSpeed = getMax(mDataBlock->maxBackwardSpeed * mFabs(move->y),
mDataBlock->maxSideSpeed * mFabs(move->x));
}
I also added the variables to the field and stream
in initPersistFields():
addField("maxAimModeForwardSpeed", TypeF32, Offset(maxAimModeForwardSpeed, PlayerData));
addField("maxAimModeBackwardSpeed", TypeF32, Offset(maxAimModeBackwardSpeed, PlayerData));
addField("maxAimModeSideSpeed", TypeF32, Offset(maxAimModeSideSpeed, PlayerData));
In packData:
stream->write(maxAimModeForwardSpeed);
stream->write(maxAimModeBackwardSpeed);
stream->write(maxAimModeSideSpeed);
In unpackData:
stream->read(&maxAimModeForwardSpeed);
stream->read(&maxAimModeBackwardSpeed);
stream->read(&maxAimModeSideSpeed);