本帖最后由 hu314973241 于 2013-07-18 00:52:52 编辑

解决方案 »

  1.   

    双缓冲技术来解决,详细看看这个:http://www.google.ee/search?q=site%3Acnblogs.com%20WinForm%20%E5%8F%8C%E7%BC%93%E5%86%B2
      

  2.   

              
                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缺失精度,楼主技术有限绞尽脑汁都想不出来
      

  3.   

    楼主你想要实现缓动是吧!//算法if(角色.X<目标.X)
       角色.X++;
    else
       角色.X--;if(角色.Y<目标.Y)
       角色.Y++;
    else
       角色.Y--;当然,这个方法应在一个循环当中,比如你已经开启了Timer或者线程 while+application.doevents都可以的..
      

  4.   

    谢谢,实现缓动,不过角色移动的是先斜线后直线走,怎样实现最短距离呢?那再试试这个,刚才写的,很简陋,不知道能不能给你点启发,实现思路是计算向量,单位化向量,再让坐标递增这个增量!    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);
                }
            }
        }
      

  5.   

    //修改下判断条件,否则角色会抖动的
      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);
      

  6.   

    已经实现? 用你给我的if方式的确实现了,但是角色走的是先斜线走后直线走的路径。你没发现我新发的代码吗。。试下在17楼~~~跟你实现的差不多嘛,只不过速度是1而已
    正在研究你17楼代码
    非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼
    按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况
      

  7.   

    已经实现? 用你给我的if方式的确实现了,但是角色走的是先斜线走后直线走的路径。你没发现我新发的代码吗。。试下在17楼~~~跟你实现的差不多嘛,只不过速度是1而已
    正在研究你17楼代码
    非常感谢,已经实现。最后小疑问 怎样修改判断防止抖动?参考19楼
    按照19楼的方法改的,还是会抖动,会出现目标XY与鼠标XY不相等的情况楼主,干脆加一个摩擦力系数(小数),乘到你的速度向量上,最终会一定为零的。
      

  8.   

    楼主虽然结贴了,但是我还是把不抖动的代码发下吧!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;
    }
      

  9.   

    给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊
      

  10.   

    给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊
    OK 非常感谢 不过怎么传文件呢?
      

  11.   

    给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊
    OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->>
       ArliyCoder#gmail.com (请替换#为@)
      

  12.   

    给你分了亲...45~29楼的方法不抖动了,你试过了吗还有你这个游戏完成了记得发个Demo给我啊
    OK 非常感谢 不过怎么传文件呢?哈哈,如果你想共享给所有人,页面上面有“资源”标签,点进去就是管理你上传的资源了,当然,如果你只想分享给我一个人,发附件到我邮件吧,哈哈--->>
       ArliyCoder#gmail.com (请替换#为@)
    发给你邮件了。再次感谢你的耐心帮助
      

  13.   

    您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 
      

  14.   

    您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok!
      

  15.   

    您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok!
    资源共享了, (C# 向量角色移动)
      

  16.   

    您的邮件被收件人([email protected])所在服务商判为垃圾邮件,对方不予接收。 无语!!!!怪不得我从没收到邮件,不知道设置那些东西了,楼主上传到你资源那里ok!
    资源共享了, (C# 向量角色移动)Nice~~