C# 基于单击的移动不起作用

C# 基于单击的移动不起作用,c#,xna,C#,Xna,我让玩家朝我点击的地方移动。但当我到达我点击的位置时,精灵只是来回闪烁。我认为这是因为精灵正在经过这一点,回到它,再次经过它,然后不断地返回创造一个“闪烁”。你知道为什么吗 ******已解决********* ***更新代码*** 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用Microsoft.Xna.Framework; 使用Microsoft.Xna.Framework.Audio; 使用Microsoft.Xna.Framew

我让玩家朝我点击的地方移动。但当我到达我点击的位置时,精灵只是来回闪烁。我认为这是因为精灵正在经过这一点,回到它,再次经过它,然后不断地返回创造一个“闪烁”。你知道为什么吗

******已解决********* ***更新代码***

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Audio;
使用Microsoft.Xna.Framework.Content;
使用Microsoft.Xna.Framework.GamerServices;
使用Microsoft.Xna.Framework.Graphics;
使用Microsoft.Xna.Framework.Input;
使用Microsoft.Xna.Framework.Media;
名称空间避免器
{
职业选手
{
公共矢量2位置、距离、鼠标位置;
公众浮标速度;
公众浮动轮换;
公共纹理2D播放器图像;
公共屋;;
公共播放器(纹理2D播放器图像、矢量2位置、浮动速度)
{
this.playerImage=playerImage;
这个位置=位置;
速度=速度;
}
公开作废更新(游戏时间游戏时间)
{
mouseState=Mouse.GetState();
此帧的浮动速度=速度;
if(mouseState.LeftButton==ButtonState.Pressed)
{
mousePosition.X=mouseState.X;
mousePosition.Y=mouseState.Y;
}
if((鼠标位置).Length()<速度)
此帧的速度=0;
if((鼠标位置).Length()>速度)
此帧的速度=2.0f;
距离=鼠标位置-位置;
距离。归一化();
旋转=(浮点)数学Atan2(距离.Y,距离.X);
位置+=该帧的距离*速度;
}
公共作废抽签(SpriteBatch SpriteBatch)
{
spriteBatch.Draw(playerImage,位置,空值,颜色。白色,旋转,新矢量2(playerImage.Width/2,playerImage.Height/2),1.0f,SpriteEffects.None,1f);
}
}
}

你需要一个碰撞器,一个代表你的玩家的
矩形,因此当这个碰撞器包含你的
鼠标位置
或点击坐标(你可以很容易地使用
矩形.包含
方法检测到它)时,你只需将玩家的速度设置为0,避免闪烁


当然,当单击的坐标发生变化时,您必须设置上一个播放器的速度。

如果我没记错的话,标准化向量的总长度应该始终为1(Vector2.length()顺便说一句,返回整个向量2的长度) 一个简单的解决方案是让你的单位降低移动速度,如果在鼠标的范围内,例如

float speedForThisFrame = speed;
if((mousePosition-position).Length() < speed) speedForThisFrame = (mousePosition-position).Length();
此帧的浮点速度=速度;
if((鼠标位置).Length()

然后使用SpeedforThis Frame进行位置偏移。

你的速度是多少?如果你降低速度,行为是否会改变?速度是2f,不,如果我降低速度,它不会改变,闪烁效果仍然会发生place@Jake你应该把答案部分作为你自己问题的实际答案张贴出来。这是StackOverflow的正常做法,也可能会给您带来一些额外的声誉。逻辑似乎是可行的。初始化后,我将“bounds=new Rectangle((int)position.X,(int)position.Y,playerImage.Width,playerImage.Height);”放在播放器构造函数的顶部,然后在更新中我有“if(bounds.Contains((int)mousePosition.X,(int)mousePosition.Y)){speed=0;}”但问题仍然存在。您确定边界已正确初始化吗?您必须确保playerImage也已初始化,否则矩形将没有宽度和高度。尝试使用断点查看程序是否进入bounds.Contains.Ok,那么断点呢?程序是否进入绑定。包含?使用当前代码编辑问题:)现在工作正常。谢谢你的帮助:)太好了!但我仍然不明白为什么我的解决方案不起作用。谢谢你的帮助:)