示例#1
0
文件: Eyes.cs 项目: sazae657/TnkEyes
        void DrawEyes(TPoint mouse)
        {
            var newpupil = new[] { new TPoint(), new TPoint() };
            int num;

            if (TPointEqual(mouse, eyes.Mouse))
            {
                if (delays[eyes.Update + 1] != 0)
                {
                    ++eyes.Update;
                }
                return;
            }
            ComputePupils(mouse, newpupil);
            for (num = 0; num < 2; num++)
            {
                DrawEye(newpupil[num], num);
            }

            eyes.Mouse  = mouse;
            eyes.Update = 0;
        }
示例#2
0
文件: Eyes.cs 项目: sazae657/TnkEyes
 bool TPointEqual(TPoint a, TPoint b) => (TEqual(a.X, b.X) && TEqual(a.Y, b.Y));
示例#3
0
文件: Eyes.cs 项目: sazae657/TnkEyes
        TPoint ComputePupil(int num, TPoint mouse, TRectangle screen)
        {
            double cx, cy;
            double dist;
            double angle;
            double dx, dy;
            double cosa, sina;
            TPoint ret = new TPoint();

            cx = EYE_X(num); dx = mouse.X - cx;
            cy = EYE_Y(num); dy = mouse.Y - cy;
            if (dx != 0 || dy != 0)
            {
                angle = Math.Atan2((double)dy, (double)dx);
                cosa  = Math.Cos(angle);
                sina  = Math.Sin(angle);
                dist  = BALL_DIST;
                if (null != screen)
                {
                    double x0, y0, x1, y1;
                    var    a = new double[4];
                    x0   = screen.X - cx;
                    y0   = screen.Y - cy;
                    x1   = x0 + screen.Width;
                    y1   = y0 + screen.Height;
                    a[0] = Math.Atan2(y0, x0);
                    a[1] = Math.Atan2(y1, x0);
                    a[2] = Math.Atan2(y1, x1);
                    a[3] = Math.Atan2(y0, x1);
                    if (AngleBetween(angle, a[0], a[1]))
                    {
                        dist *= dx / x0;
                    }
                    else if (AngleBetween(angle, a[1], a[2]))
                    {
                        dist *= dy / y1;
                    }
                    else if (AngleBetween(angle, a[2], a[3]))
                    {
                        dist *= dx / x1;
                    }
                    else if (AngleBetween(angle, a[3], a[0]))
                    {
                        dist *= dy / y0;
                    }
                    if (dist > BALL_DIST)
                    {
                        dist = BALL_DIST;
                    }
                }

                if (dist > Math.Sqrt(Math.Pow(dx, 2.0) + Math.Pow(dy, 2.0)))
                {
                    cx += dx;
                    cy += dy;
                }
                else
                {
                    cx += dist * cosa;
                    cy += dist * sina;
                }
            }
            ret.X = cx;
            ret.Y = cy;
            return(ret);
        }