예제 #1
0
        /// <summary>
        /// Отвечает за подписку методов анимации на плашку в зависимости от статуса плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        public void PlateRefresh(Plate plate)
        {
            switch(plate.state)  // В зависимости от статуса привязываем к плашке разные методы анимации
            {
                case State.Open:
                    plate.args = new Object[] { Setting.PlateZoom, true }; // [0] - Zoom, [1] - flag
                    plate.showPlate = sprites.OpenAnime;
                    break;

                case State.Mark:
                    plate.args = new Object[] { 0 };      // [0] - Step
                    plate.showPlate = sprites.MarkAnime;
                    break;

                case State.Drop:
                    double x = plate.point.X - sprites.GetSizePicture.Width / 2;   // Вычисляем вектор от центра экрана
                    double y = plate.point.Y - sprites.GetSizePicture.Height / 2;
                    double dX = x / Math.Sqrt(x * x + y * y);                      // Прирост координат при единичном шаге по вектору
                    double dY = y / Math.Sqrt(x * x + y * y);
                    plate.args = new Object[] { 0, Setting.PlateZoom, dX, dY, solitaire.plates }; // [0] - Step, [1] - Zoom, [2] - Прирост по X, [3] - Прирост по Y, [4] - Костыль для отрисовки затертых плашек, это неправильно
                    plate.showPlate = sprites.DropAnime;
                    break;

                //case State.Hide:
                //    plate.showPlate = sprites.HideAnime;
                //    break;
            }
        }
예제 #2
0
        /// <summary>
        /// Отрисовывает плашку с заданными данными
        /// </summary>
        /// <param name="plate">Плашка</param>
        /// <param name="point">Координаты</param>
        /// <param name="zoomX">Масштаб по X</param>
        /// <param name="zoomY">Масштаб по Y</param>
        public void DominoShow(Plate plate, Point point, float zoomX, float zoomY)
        {
            string sNameL, sNameR;  // Имена спрайтов в списке

            if (plate.state == State.Hide)   // В зависимости от вида плашки инициализируем имена нужных спрайтов
            {
                sNameL = "lh";
                sNameR = "rh";
            }
            else
            {
                sNameL = "l" + plate.numL.ToString();
                sNameR = "r" + plate.numR.ToString();
            }

            SpriteShow(sNameL, point, zoomX, zoomY);  // Рисуем левую половину плашки
            point.Offset((int)(Setting.dSpriteX * zoomX), (int)(Setting.dSpriteY * zoomY));  // Смещаем точку
            SpriteShow(sNameR, point, zoomX, zoomY);  // Рисуем правую половину плашки
        }
예제 #3
0
        /// <summary>
        /// Отрисовует плашку с данными, взятыми из объекта плашки
        /// </summary>
        public void DominoShow(Plate plate)
        {
            string sNameL, sNameR;  // Имена спрайтов в списке

            if (plate.state == State.Hide)   // В зависимости вида плашки инициализируем имена нужных спрайтов
            {
                sNameL = "lh";
                sNameR = "rh";
            }
            else
            {
                sNameL = "l" + plate.numL.ToString();
                sNameR = "r" + plate.numR.ToString();
            }

            Point tempPoint = new Point(plate.point.X, plate.point.Y);

            SpriteShow(sNameL, tempPoint, Setting.PlateZoom);  // Рисуем левую половину плашки
            tempPoint.Offset((int)(Setting.dSpriteX * Setting.PlateZoom), (int)(Setting.dSpriteY * Setting.PlateZoom));  // Смещаем точку
            SpriteShow(sNameR, tempPoint, Setting.PlateZoom);  // Рисуем правую половину плашки
        }
예제 #4
0
        /// <summary>
        /// Устанавливает статус плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        /// <param name="state">Статус</param>
        public void SetState(Plate plate, State state)
        {
            plate.state = state;

            if (plate_СhangeState != null) plate_СhangeState(plate); // Генерируем событие о изменении статуса плашки
        }
예제 #5
0
 /// <summary>
 /// Маркировка плашки
 /// </summary>
 public void MarkPlate(Plate plate)
 {
     // Если плашка открыта
     if (plate.state == State.Open)
         SetState(plate, State.Mark);     // Помечаем ее маркированной
     else if (plate.state == State.Mark)  // Если она уже отмаркированна
             SetState(plate, State.Open); // Снимаем маркировку
 }
예제 #6
0
        /// <summary>
        /// Анимация удаления плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        public void DropAnime(Plate plate)
        {
            int step = (int)plate.args[0];       // Инициализируем аргументы для анимации
            float zoom = (float)plate.args[1];
            double shiftX = (double)plate.args[2];
            double shiftY = (double)plate.args[3];
            Plates plates = (Plates)plate.args[4];

            Point point = new Point(plate.point.X + (int)(shiftX * step), plate.point.Y + (int)(shiftY * step)); // Вычисляем координаты

            ClearPlate(point); // Затираем плашку

            step += 3;
            zoom -= 0.001f;

            point.Offset((int)shiftX, (int)shiftY); // Смещаем координаты

            DominoShow(plate, point, zoom, zoom);   // Рисуем плашку в новых координатах, с новым масштабом

            HideAllDominoShow(plates);

            plate.args[0] = step;  // Сохраняем параметры для следующего шага анимации
            plate.args[1] = zoom;

            // Если достигло края экрана или масштаб нуля
            if( zoom < 0.05 || (point.X + Setting.PlateDistanceX) < 0 || point.X > GetSizePicture.Width ||
                              (point.Y + Setting.PlateDistanceY) < 0 || point.Y > GetSizePicture.Height)
            {
                ClearPlate(point);            // Стираем плашку
                plate.showPlate -= DropAnime; // И отписываем метод анимации
                return;
            }
        }
예제 #7
0
 /// <summary>
 /// Анимация закрывания плашки
 /// </summary>
 /// <param name="plate">Плашка</param>
 internal void HideAnime(Plate plate)
 {
     plate.showPlate = HideDominoShow;
 }
예제 #8
0
 /// <summary>
 /// Стирает плашку с Bitmap
 /// </summary>
 /// <param name="plate">Плашка</param>
 public void ClearPlate(Plate plate)
 {
     ClearSize(new Point(plate.point.X - 6, plate.point.Y - 6), new Size(Setting.PlateDistanceX, Setting.PlateDistanceY));
 }
예제 #9
0
        /// <summary>
        /// Анимация появления плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        public void RollAnime(Plate plate)
        {
            float zoom = (float)plate.args[0];  // Инициализируем аргументы для анимации
            float dZoom = (float)plate.args[1];
            bool flag = (bool)plate.args[2];

            if (flag)  // Если увеличиваем плашку
            {
                if (zoom < (Setting.PlateZoom + 0.009f))
                {
                    ClearPlate(plate);
                    zoom += dZoom;

                    float x = plate.point.X + (Setting.PlateWidth * Setting.PlateZoom - Setting.PlateWidth * zoom) / 2;
                    float y = plate.point.Y + (Setting.PlateHeight * Setting.PlateZoom - Setting.PlateHeight * zoom) / 2;

                    DominoShow(plate, new Point((int)x, (int)y), zoom, zoom);
                }
                else
                    flag = false;
            }
            else   // Если уменьшаем плашку
            {
                if (zoom > Setting.PlateZoom)
                {
                    ClearPlate(plate);
                    zoom -= 0.003f;

                    float x = plate.point.X + (Setting.PlateWidth * Setting.PlateZoom - Setting.PlateWidth * zoom) / 2;
                    float y = plate.point.Y + (Setting.PlateHeight * Setting.PlateZoom - Setting.PlateHeight * zoom) / 2;

                    DominoShow(plate, new Point(plate.point.X, (int)y), Setting.PlateZoom, zoom);
                }
                else
                {
                    plate.showPlate -= RollAnime;  // Анимация закончилась, отписываем метод
                    return;
                }
            }

            plate.args[0] = zoom;  // Сохраняем параметры для следующего шага анимации
            plate.args[1] = dZoom;
            plate.args[2] = flag;
        }
예제 #10
0
        /// <summary>
        /// Анимация открывания плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        public void OpenAnime(Plate plate)
        {
            float zoom = (float)plate.args[0];  // Инициализируем аргументы для анимации
            bool flag = (bool)plate.args[1];
            // Вычисляем смещение плашки по Y
            float y = plate.point.Y + (Setting.PlateHeight * Setting.PlateZoom - Setting.PlateHeight * zoom) / 2;

            if(flag)  // Если уменьшаем толщину плашки
            {
                if (zoom > 0.05f)
                {
                    ClearPlate(plate);
                    zoom -= 0.004f;
                    HideDominoShow(new Point(plate.point.X, (int)y), Setting.PlateZoom, zoom);
                }
                else
                    flag = false;
            }
            else    // Если увеличиваем толщину плашки
            {
                if (zoom < Setting.PlateZoom)
                {
                    ClearPlate(plate);
                    zoom += 0.004f;
                    DominoShow(plate, new Point(plate.point.X, (int)y), Setting.PlateZoom, zoom);
                }
                else
                {
                    plate.showPlate = DominoShow;
                    return;
                }
            }

            plate.args[0] = zoom;  // Сохраняем параметры для следующего шага анимации
            plate.args[1] = flag;
        }
예제 #11
0
        /// <summary>
        /// Анимация маркировки плашки
        /// </summary>
        /// <param name="plate">Плашка</param>
        public void MarkAnime(Plate plate)
        {
            ClearPlate(plate);

            int step = (int)plate.args[0] + 1;
            plate.args[0] = step;
            int shiftX = Convert.ToInt32(Math.Cos(step * Math.PI / 4f) * 2);
            int shiftY = Convert.ToInt32(Math.Sin(step * Math.PI / 4f) * 2);

            DominoShow(plate, new Point(plate.point.X + shiftX, plate.point.Y + shiftY), Setting.PlateZoom, Setting.PlateZoom);
        }
예제 #12
0
 /// <summary>
 /// Отрисовывает закрытую плашку в заданной точке
 /// </summary>
 /// <param name="plate">Координаты плашки</param>
 public void HideDominoShow(Plate  plate)
 {
     SpriteShow("lh", plate.point, Setting.PlateZoom);  // Рисуем левую половину плашки
     SpriteShow("rh", new Point(plate.point.X + (int)(Setting.dSpriteX * Setting.PlateZoom), plate.point.Y + (int)(Setting.dSpriteY * Setting.PlateZoom)), Setting.PlateZoom);  // Рисуем правую половину плашки
 }
예제 #13
0
 public PlatesList(Plate[] plates)
 {
     this.plates = plates;
 }