private void AddKardGamer(KardGamer gam, int kolKard)//раздача карт { for (int i = 0; i < kolKard; i++) { if (koloda.GetKard().Count > i) { GetAnimateCard(koloda.X, koloda.Y, gam.X + gam.Dist * i, gam.Y, speed: 20); gam.AddKard(koloda.GetKardIndex(i)); koloda.DelKard(i); } } MoveKard = null; }
/// <summary> /// анимирует карты /// </summary> /// <param name="xStart"></param> коорднаты начала анимации /// <param name="yStart"></param> /// <param name="xEnd"></param>коорднаты конца анимации /// <param name="yEnd"></param> /// <param name="step"></param>параметр для количества шагов анимации (чем больше, тем меньше шагов) /// <param name="speed"></param>скорость движения private void GetAnimateCard(int xStart, int yStart, int xEnd, int yEnd, int step = 40, int speed = 50) // возвращает верхнюю карту с удалением ее из стопки и анимацией перемещения { MoveKard = new KardGamer(); MoveKard.AddKard(new Kard((Bitmap)Properties.Resources.ResourceManager.GetObject("_36"))); MoveKard.X = xStart; MoveKard.Y = yStart; int dx = MoveKard.X - xEnd; int dy = MoveKard.Y - yEnd; double distance = Math.Sqrt(dx * dx + dy * dy); // расстояние от колоды до последней карты в стопке - приемнике (по Пифагору) int count = (int)(distance / step); // количество шагов if (count > 0) { dx = dx / count; // размер шага dy = dy / count; } for (int i = 0; i < count; i++) // перемещаем и показываем { MoveKard.X -= dx; MoveKard.Y -= dy; frm.Refresh(); // просто Invalidate() здесь не проходит Thread.Sleep(speed); } }
public bool IsCaptured(int x, int y)//определение выбраной карты { MoveKard = new GamerMan(); if (pleayerKard.Count > 0) { for (int j = 0; j < Constanta.kolPlayer; j++) { if (flagC) { hist.AddCancelPlayerKard(pleayerKard[j], ref flagC); } hist.gamerKardsOld = pleayerKard[j].GetKard(); } for (int j = 0; j < Constanta.kolPlayer; j++) { for (int i = 0; i < pleayerKard[j].GetKard().Count; i++) { if (pleayerKard[j].X + pleayerKard[j].Dist * i <= x && pleayerKard[j].X + pleayerKard[j].Dist * i + pleayerKard[j].Dist >= x && pleayerKard[j].Y + Constanta.CARD_HEIGHT >= y && pleayerKard[j].Y <= y) { MoveKard.AddKard(pleayerKard[j].GetKardIndex(i)); MoveKard.X = pleayerKard[j].X + pleayerKard[j].Dist * i; MoveKard.Y = pleayerKard[j].Y; pleayerKard[j].DelKard(i); dx = x - pleayerKard[j].X - pleayerKard[j].Dist * i; // расстояние от курсора до левого верхнего угла перемещаемой стопки dy = y - pleayerKard[j].Y; return(true); } } } } hist.gamerKardsOld.Clear(); return(false); }