c#请教 怎样才能让角色移动到鼠标的位置而不是闪过去 本帖最后由 hu314973241 于 2013-07-18 00:52:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 双缓冲技术来解决,详细看看这个:http://www.google.ee/search?q=site%3Acnblogs.com%20WinForm%20%E5%8F%8C%E7%BC%93%E5%86%B2 Point pt = new Point(e.X, e.Y); Point ptImg = new Point(i, j); int X1 = (pt.X - ptImg.X); int Y1 = (pt.Y - ptImg.Y); Point ptDir = new Point(X1, Y1); float fEps = (ptDir.X * ptDir.X + ptDir.Y * ptDir.Y); ix /= fEps; jy /= fEps; float fSpeed = 5.0f; // 移动速度 ix = (ix * fSpeed); jy = (jy * fSpeed); i += (int)ix; j += (int)jy; string si = i.ToString() + ""; string sj = j.ToString() + ""; this.label1.Text = si; this.label2.Text = sj;这是楼主写的代码,float没法直接当坐标使用强转成int缺失精度,楼主技术有限绞尽脑汁都想不出来 楼主你想要实现缓动是吧!//算法if(角色.X<目标.X) 角色.X++;else 角色.X--;if(角色.Y<目标.Y) 角色.Y++;else 角色.Y--;当然,这个方法应在一个循环当中,比如你已经开启了Timer或者线程 while+application.doevents都可以的.. 谢谢,实现缓动,不过角色移动的是先斜线后直线走,怎样实现最短距离呢?那再试试这个,刚才写的,很简陋,不知道能不能给你点启发,实现思路是计算向量,单位化向量,再让坐标递增这个增量! public partial class Form1 : Form { //目标坐标X private int targetX; //目标坐标Y private int targetY; //计时器,实现游戏循环 private Timer loop; //模拟游戏人物角色 private Player player; public Form1() { InitializeComponent(); targetX = 0; targetY = 0; player = new Player(); player.X = 0; player.Y = 0; loop = new Timer(); loop.Interval = 40; loop.Tick += GameLoop; loop.Start(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); player.Render(e.Graphics); } private void GameLoop(object sender, EventArgs e) { if (targetX == (int)player.X && targetY == (int)player.Y) return; float dx = targetX - player.X; float dy = targetY - player.Y; float dd = (float)Math.Sqrt(dx * dx + dy * dy); player.X += (int)dx * (1 / dd); player.Y += (int)dy * (1 / dd); this.Invalidate(); } private void Form1_MouseClick(object sender, MouseEventArgs e) { // // 记录目标坐标 // targetX = e.X; targetY = e.Y; } } /// <summary> /// 模拟角色 /// </summary> public class Player { public float X { get; set; } public float Y { get; set; } public void Render(Graphics g) { using (Brush brush = new SolidBrush(Color.Red)) { g.FillRectangle(brush, X, Y, 10, 10); } } } //修改下判断条件,否则角色会抖动的 if (targetX == (int)player.X || targetY == (int)player.Y) return; float dx = targetX - player.X; float dy = targetY - player.Y; float dd = (float)Math.Sqrt(dx * dx + dy * dy); player.X += dx * (1 / dd); player.Y += dy * (1 / dd); 已经实现? 用你给我的if方式的确实现了,但是角色走的是先斜线走后直线走的路径。你没发现我新发的代码吗。。试下在17楼~~~跟你实现的差不多嘛,只不过速度是1而已正在研究你17楼代码非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况 已经实现? 用你给我的if方式的确实现了,但是角色走的是先斜线走后直线走的路径。你没发现我新发的代码吗。。试下在17楼~~~跟你实现的差不多嘛,只不过速度是1而已正在研究你17楼代码非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况楼主,干脆加一个摩擦力系数(小数),乘到你的速度向量上,最终会一定为零的。 楼主虽然结贴了,但是我还是把不抖动的代码发下吧!float dx = targetX - player.X;float dy = targetY - player.Y;float dd = (float)Math.Sqrt(dx * dx + dy * dy);//这个常量接近物体半径if (dd < 5){ player.X = targetX; player.Y = targetY;}else{ player.X += dx / dd*speed; player.Y += dy / dd*speed;} 给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊 给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊OK 非常感谢 不过怎么传文件呢? 给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->> ArliyCoder#gmail.com (请替换#为@) 给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->> ArliyCoder#gmail.com (请替换#为@)发给你邮件了。再次感谢你的耐心帮助 您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok! 您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok!资源共享了, (C# 向量角色移动) 您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok!资源共享了, (C# 向量角色移动)Nice~~ WebBrowser控件如何解决“无法读取爱保护内存”的错误? C#中窗体间传递参数问题,一个窗体调用另外一个窗体,需要引用被调用窗体的属性作为参数 水晶报表,如何隐藏其内的子报表呢 将下列C++代码转成C# 装MSDN后,却不能打开 求C#三层模式的类库代码 请问C#怎样实现票据套打 请有长期使用C#或Java经验者进 webbrowser控件怎样调用嵌入资源中的网页? 日期在datagrid中的显示格式问题?? timer 控件的问题 C#网页自动填表单
Point pt = new Point(e.X, e.Y);
Point ptImg = new Point(i, j);
int X1 = (pt.X - ptImg.X);
int Y1 = (pt.Y - ptImg.Y);
Point ptDir = new Point(X1, Y1);
float fEps = (ptDir.X * ptDir.X + ptDir.Y * ptDir.Y);
ix /= fEps;
jy /= fEps;
float fSpeed = 5.0f; // 移动速度
ix = (ix * fSpeed);
jy = (jy * fSpeed);
i += (int)ix;
j += (int)jy;
string si = i.ToString() + "";
string sj = j.ToString() + "";
this.label1.Text = si;
this.label2.Text = sj;这是楼主写的代码,float没法直接当坐标使用强转成int缺失精度,楼主技术有限绞尽脑汁都想不出来
角色.X++;
else
角色.X--;if(角色.Y<目标.Y)
角色.Y++;
else
角色.Y--;当然,这个方法应在一个循环当中,比如你已经开启了Timer或者线程 while+application.doevents都可以的..
{
//目标坐标X
private int targetX;
//目标坐标Y
private int targetY;
//计时器,实现游戏循环
private Timer loop;
//模拟游戏人物角色
private Player player;
public Form1()
{
InitializeComponent(); targetX = 0;
targetY = 0; player = new Player();
player.X = 0;
player.Y = 0; loop = new Timer();
loop.Interval = 40;
loop.Tick += GameLoop;
loop.Start();
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
player.Render(e.Graphics);
} private void GameLoop(object sender, EventArgs e)
{
if (targetX == (int)player.X && targetY == (int)player.Y) return; float dx = targetX - player.X;
float dy = targetY - player.Y;
float dd = (float)Math.Sqrt(dx * dx + dy * dy); player.X += (int)dx * (1 / dd);
player.Y += (int)dy * (1 / dd); this.Invalidate();
} private void Form1_MouseClick(object sender, MouseEventArgs e)
{
//
// 记录目标坐标
//
targetX = e.X;
targetY = e.Y;
}
}
/// <summary>
/// 模拟角色
/// </summary>
public class Player
{
public float X { get; set; }
public float Y { get; set; } public void Render(Graphics g)
{
using (Brush brush = new SolidBrush(Color.Red))
{
g.FillRectangle(brush, X, Y, 10, 10);
}
}
}
if (targetX == (int)player.X || targetY == (int)player.Y) return;
float dx = targetX - player.X;
float dy = targetY - player.Y;
float dd = (float)Math.Sqrt(dx * dx + dy * dy);
player.X += dx * (1 / dd);
player.Y += dy * (1 / dd);
正在研究你17楼代码
非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼
按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况
正在研究你17楼代码
非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼
按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况楼主,干脆加一个摩擦力系数(小数),乘到你的速度向量上,最终会一定为零的。
float dy = targetY - player.Y;
float dd = (float)Math.Sqrt(dx * dx + dy * dy);
//这个常量接近物体半径
if (dd < 5)
{
player.X = targetX;
player.Y = targetY;
}
else
{
player.X += dx / dd*speed;
player.Y += dy / dd*speed;
}
OK 非常感谢 不过怎么传文件呢?
OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->>
ArliyCoder#gmail.com (请替换#为@)
OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->>
ArliyCoder#gmail.com (请替换#为@)
发给你邮件了。再次感谢你的耐心帮助
资源共享了, (C# 向量角色移动)
资源共享了, (C# 向量角色移动)Nice~~