XNA coasting/easing 位置之间
XNA coasting/easing between positions
游戏概览:
- 二维
- 世界、玩家和相机是分开的
我正在尝试制作一个游戏,其中相机跟随玩家并遵循中间路线(因此移动 x+ 然后 x- 很快导致相机移动很少)并且我已经做到了所以相机有自己的加速,但我不确定如何减速。
相关的值
List<double> offset = new List<double>() { 0, 0 }; //Top left map to top left window (World is related to this)
List<double> smiley = new List<double>() { 0, 0 - 5 }; //Player position inside the map
List<double> smileyPos = new List<double>() { 400, 288 + 11 }; //Where the centre of the screen is for the player
List<double> scvel = new List<double>() { 0, 0 }; //Stores how many pixels to move per frame
int maxvel = 8; //Maximum amount of pixels to move per frame
double acc = 0.5; //acceleration (only)
if (offset[0]+smiley[0] < smileyPos[0])
{
if (scvel[0] <= maxvel)
{
scvel[0] += acc;
}
}
if (offset[0]+smiley[0] > smileyPos[0])
{
if (scvel[0] >= -maxvel)
{
scvel[0] -= acc;
}
}
if (offset[0] + smiley[0] == smileyPos[0])
{
scvel[0] = 0;
}
if (offset[1] + smiley[1] < smileyPos[1])
{
if (scvel[1] <= maxvel)
{
scvel[1] += acc;
}
}
if (offset[1] + smiley[1] > smileyPos[1])
{
if (scvel[1] >= -maxvel)
{
scvel[1] -= acc;
}
}
offset[0] += scvel[0];
offset[1] += scvel[1];
输出:
Camera smoothly moves to the player but orbits the player
我想要的输出:
Camera smoothly eases to the player position with a slight delay to counteract any bumps
我完成相机移动的方式,其中唯一的角度是 45 的倍数 - 我将如何修改此代码以允许相机直接进入玩家并缓入和缓出?
解决方案
offset = Vector2.Lerp(offset, new Vector2((float)(-smiley[0]+smileyPos[0]), (float)(-smiley[1]+smileyPos[1])), (float)0.05);
并且还将 List<int> offset
更改为 Vector2 offset
Looks like a perfect use for Vector2.Lerp(position, goal, amount)
position ==对象当前所在的位置。
目标==您希望对象顺利到达的位置。
数量==覆盖这一帧的方式的百分比。
因此,该数量设置为 0 到 1 之间的某个值。如果将其设置为 .5,则每帧将覆盖到目标距离的一半。如果你考虑一下,由于一半的距离是每帧不断减少的量,它实际上每帧移动得更少,使它看起来像在接近目标时减速。
您可以通过反复试验找到最好的 amount
。很可能是一个较小的数字,例如小于 0.1。
游戏概览:
- 二维
- 世界、玩家和相机是分开的
我正在尝试制作一个游戏,其中相机跟随玩家并遵循中间路线(因此移动 x+ 然后 x- 很快导致相机移动很少)并且我已经做到了所以相机有自己的加速,但我不确定如何减速。
相关的值
List<double> offset = new List<double>() { 0, 0 }; //Top left map to top left window (World is related to this)
List<double> smiley = new List<double>() { 0, 0 - 5 }; //Player position inside the map
List<double> smileyPos = new List<double>() { 400, 288 + 11 }; //Where the centre of the screen is for the player
List<double> scvel = new List<double>() { 0, 0 }; //Stores how many pixels to move per frame
int maxvel = 8; //Maximum amount of pixels to move per frame
double acc = 0.5; //acceleration (only)
if (offset[0]+smiley[0] < smileyPos[0])
{
if (scvel[0] <= maxvel)
{
scvel[0] += acc;
}
}
if (offset[0]+smiley[0] > smileyPos[0])
{
if (scvel[0] >= -maxvel)
{
scvel[0] -= acc;
}
}
if (offset[0] + smiley[0] == smileyPos[0])
{
scvel[0] = 0;
}
if (offset[1] + smiley[1] < smileyPos[1])
{
if (scvel[1] <= maxvel)
{
scvel[1] += acc;
}
}
if (offset[1] + smiley[1] > smileyPos[1])
{
if (scvel[1] >= -maxvel)
{
scvel[1] -= acc;
}
}
offset[0] += scvel[0];
offset[1] += scvel[1];
输出:
Camera smoothly moves to the player but orbits the player
我想要的输出:
Camera smoothly eases to the player position with a slight delay to counteract any bumps
我完成相机移动的方式,其中唯一的角度是 45 的倍数 - 我将如何修改此代码以允许相机直接进入玩家并缓入和缓出?
解决方案
offset = Vector2.Lerp(offset, new Vector2((float)(-smiley[0]+smileyPos[0]), (float)(-smiley[1]+smileyPos[1])), (float)0.05);
并且还将 List<int> offset
更改为 Vector2 offset
Looks like a perfect use for Vector2.Lerp(position, goal, amount)
position ==对象当前所在的位置。
目标==您希望对象顺利到达的位置。
数量==覆盖这一帧的方式的百分比。
因此,该数量设置为 0 到 1 之间的某个值。如果将其设置为 .5,则每帧将覆盖到目标距离的一半。如果你考虑一下,由于一半的距离是每帧不断减少的量,它实际上每帧移动得更少,使它看起来像在接近目标时减速。
您可以通过反复试验找到最好的 amount
。很可能是一个较小的数字,例如小于 0.1。