示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }