在我之前的帖子中,我提到在空闲时间使用XNA库学习C#,情况总是如此;然而,我已经长时间陷入了一些我在麻烦中弄清楚的事情!
这是当前情况的简历,实际上我的角色每2个像素移动2个,这个值存储在我在 Player.cs 中称为“速度”的变量中:
private Texture2D texture;
private Vector2 position, previousPosition;
private Rectangle sourceRect;
private KeyboardState currentInput, previousInput;
private int currentFrame = 0, frameLine = 0;
private float speed = 2f, elapsedTime, animationTime = 128f;
(顺便说一下,我输入的是Azerty键盘的ZQSD; D)
public void Update(GameTime gameTime)
{
currentInput = Keyboard.GetState();
if (currentInput.IsKeyDown(Keys.Z))
{
if (!Map.isColliding(position.X, position.Y - speed))
position.Y -= speed;
this.Animate(gameTime, 3);
}
else if (currentInput.IsKeyDown(Keys.Q))
{
if (!Map.isColliding(position.X - speed, position.Y))
position.X -= speed;
this.Animate(gameTime, 1);
}
else
sourceRect = new Rectangle(32, (32 * frameLine), 32, 32);
previousInput = currentInput;
}
public void Animate(GameTime gameTime, int m_frameLine)
{
elapsedTime += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
frameLine = m_frameLine;
if (elapsedTime > animationTime)
{
if (currentFrame >= 2)
currentFrame = 0;
else
currentFrame++;
elapsedTime = 0;
}
sourceRect = new Rectangle((32 * currentFrame), (32 * frameLine), 32, 32);
}
Map.cs 使用Tile设置构建整个地图,当然因为我很难找到“好”逻辑,所以我一直在观看YouTube上的教程,所以这里是无论如何结果:
现在我可以解释一下我要去哪里了! 我可以正常地穿过地图,碰撞可以工作,但是当角色想要在两个碰撞瓦片之间(例如墙壁之间)时,如果左边或右边有一个单个像素(或者向上和向上),它将无法工作下来,取决于方向):
这是因为角色的速度一次只有两个像素,有时候(大多数时候总是)让他完美地在中间穿过这段文章是有点棘手的。
所以我的问题是,我怎么能处理播放器的位移,以便保持速度,但只停止每32个像素等等?我一直在尝试这么多的可能性,它不再有趣,我陷入了逻辑困境,我肯定会以错误的方式看待,无用......
如果有人可以通过这种情况,从哪里开始或修改什么来启发我,我将非常感谢,也感谢您阅读我!
答案 0 :(得分:1)
如果我理解你的问题,你应该根据玩家的实际位置计算你指定的未来位置,然后转向未来的位置。换句话说:您的玩家的位置存储在Vector2中。因此,您需要根据要移动的位置计算下一个位置。因此,如果你想向右移动,计算actual_position + new Vector2(32,0),左边你需要actual_position + new Vector2(-32,0),顶部为actual_position + new Vector2(0,32),对于bot actual_position + new Vector2(0,-32)。然后只需应用速度,如果玩家达到计算向量,只需停止移动