public int Attack(PictureBox pictureMap, TacticSeed seed, TacticState tacticState, Bitmap combatBitmap, System.Media.SoundPlayer player) { int ret = 0; if (seed.activeShip.actionsLeft >= seed.activeShip.equippedWeapon.energyСonsumption && seed.activeShip.equippedWeapon.shotsleft > 0) // если у корабля остались очки действий { double angle, targetx, targety; targetx = tacticState.cMap.boxes[seed.select].x; targety = tacticState.cMap.boxes[seed.select].y; angle = FindWay.AttackAngleSearch(targetx, targety, seed, tacticState); doShipRotate(angle, 1, true, pictureMap, seed); // отрисовка атаки //Thread.Sleep(150); ret = seed.activeShip.attack(tacticState.cMap, tacticState.cMap.boxes[seed.select].id, ref combatBitmap, player, ref pictureMap, ref bmBackground, ref bmFull); // возвращаем корабль в исходное положение doShipRotate(angle, -1, false, pictureMap, seed); } return(ret); }
public void Move(PictureBox pictureMap, TacticSeed seed, TacticState tacticState, List <Box> completeBoxWay, int x1, int x2, int y1, int y2) { double rotateAngle; int range, dx; Graphics g = Graphics.FromImage(bmFull); int actualDeltaX0, actualDeltaY0, actualDeltaX1, actualDeltaY1; actualDeltaX0 = actualDeltaY0 = 0; int savedAngle = 0; DrawSavedImages(pictureMap, /*bmFull,*/ seed); for (int cnt = 0; cnt < completeBoxWay.Count; cnt++) { if (seed.activeShip == null) { break; } rotateAngle = FindWay.AttackAngleSearch(tacticState.cMap.boxes[completeBoxWay[cnt].id].x, tacticState.cMap.boxes[completeBoxWay[cnt].id].y, seed, tacticState); x1 = tacticState.cMap.boxes[seed.activeShip.boxId].xcenter; y1 = tacticState.cMap.boxes[seed.activeShip.boxId].ycenter; x2 = tacticState.cMap.boxes[completeBoxWay[cnt].id].xcenter; y2 = tacticState.cMap.boxes[completeBoxWay[cnt].id].ycenter; int stepLineRange = (int)Math.Sqrt((x2 - x1) * (x2 - x1) + ((y2 - y1) * (y2 - y1)) * 0.35); range = (int)Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); dx = range / 8; int deltax; int deltay; deltax = (x2 - x1) / 8; deltay = (y2 - y1) / 8; Image bg; Rectangle rect; int halfBoxWidth = (tacticState.cMap.boxes[0].xpoint3 - tacticState.cMap.boxes[0].xpoint2) / 2; int halfBoxHeight = (tacticState.cMap.boxes[0].ypoint6 - tacticState.cMap.boxes[0].ypoint2) / 2; //закрашиваем выделенный корабль rect = new Rectangle( seed.activeShip.x - halfBoxWidth, seed.activeShip.y - halfBoxHeight, halfBoxWidth + halfBoxWidth, halfBoxHeight + halfBoxHeight ); bg = bmBackground.Clone(rect, bmBackground.PixelFormat); g.DrawImage(bg, seed.activeShip.x - halfBoxWidth, seed.activeShip.y - halfBoxHeight); actualDeltaX1 = completeBoxWay[cnt].x - tacticState.cMap.boxes[seed.activeShip.boxId].x; actualDeltaY1 = completeBoxWay[cnt].y - tacticState.cMap.boxes[seed.activeShip.boxId].y; if (cnt > 0) { if (actualDeltaX1 != actualDeltaX0 || actualDeltaY1 != actualDeltaY0) { if (savedAngle != 0) { doShipRotate(savedAngle, -1, false, pictureMap, seed); } doShipRotate(rotateAngle, 1, false, pictureMap, seed); savedAngle = (int)rotateAngle; } } else { doShipRotate(rotateAngle, 1, false, pictureMap, seed); savedAngle = (int)rotateAngle; } for (int count1 = 0; count1 < range - 10; count1 += dx) { seed.activeShip.x += deltax; seed.activeShip.y += deltay; // запоминаем кусок картинки, на которой уже нет активного корабля rect = new Rectangle( seed.activeShip.x - halfBoxWidth, seed.activeShip.y - halfBoxHeight, halfBoxWidth + halfBoxWidth, halfBoxHeight + halfBoxHeight ); bg = bmFull.Clone(rect, bmFull.PixelFormat); // рисуем корабль по новым координатам g.DrawImage(seed.activeShip.objectImg, new Rectangle(seed.activeShip.x - seed.activeShip.objectImg.Width / 2, seed.activeShip.y - seed.activeShip.objectImg.Height / 2, seed.activeShip.objectImg.Width, seed.activeShip.objectImg.Height) ); pictureMap.Image = bmFull; Screen_Combat.UpdateDrawing(); //Thread.Sleep(5); g.DrawImage(bg, seed.activeShip.x - halfBoxWidth, seed.activeShip.y - halfBoxHeight); } seed.activeShip.moveShip(tacticState.cMap, seed.activeShip.boxId, completeBoxWay[cnt].id, 1); g.DrawImage(seed.activeShip.objectImg, new Rectangle(seed.activeShip.x - seed.activeShip.objectImg.Width / 2, seed.activeShip.y - seed.activeShip.objectImg.Height / 2, seed.activeShip.objectImg.Width, seed.activeShip.objectImg.Height)); if (cnt == completeBoxWay.Count - 1) { doShipRotate(rotateAngle, -1, true, pictureMap, seed); } actualDeltaX0 = actualDeltaX1; actualDeltaY0 = actualDeltaY1; } }