示例#1
0
        private void renderTimer_Tick(object sender, EventArgs e) //таймер для обновления картинки и сборки мусора
        {
            //повтор фоновой музыки после окончания. плохой способ, нужно сделать по-другому
            //StringBuilder statusStr = new StringBuilder();
            //mciSendString("status soundBack mode", statusStr, 100, IntPtr.Zero);
            //string xx = statusStr.ToString();
            //if (statusStr.ToString() == "stopped")
            //{
            //    mciSendString("seek soundBack to start", null, 0, IntPtr.Zero);
            //    mciSendString("play soundBack", null, 0, IntPtr.Zero);
            //}

            bufGraf.Graphics.DrawImage(Maps.MakeMap(mapArr), 0, 0); //рисование карты

            foreach (Tank enemy in enemyList)                       //рисование вражеских танков
            {
                bufGraf.Graphics.DrawImage(enemy.TBIT, enemy.x, enemy.y, enemy.dx, enemy.dy);
            }
            if (myTank.immob == false)                                                             //если свой танк может двигаться
            {
                bufGraf.Graphics.DrawImage(myTank.TBIT, myTank.x, myTank.y, myTank.dx, myTank.dy); //рисование своего танка
            }

            //создание первых 4-х вражеских танков с небольшим промежутком по времени
            //промежуток нужен для рандомной стрельбы
            if (Tank.FirstTankIter <= 60)
            {
                CreateFirstTanks();
                Tank.TankIter = 0;
                label1.Text   = Tank.TankQuantity().ToString(); //количество оставшихся вражеских танков
            }

            //создание вражеских танков
            Tank.TankIter++;
            if (Tank.TankIter == 300 && Tank.TankQuantity() > 0)
            {
                CreateTanks();
                Tank.TankIter = 0;
                label1.Text   = Tank.TankQuantity().ToString(); //количество оставшихся вражеских танков
            }

            //рисование курицы
            Rectangle fromRect;
            Rectangle toRect;

            //если игра не окончена, рисуем живую курицу
            if (GO == false)
            {
                fromRect = new Rectangle(0, 0, Chicken.Width / 2, Chicken.Height);
                toRect   = new Rectangle(Battleground.Width * 18 / 40, Battleground.Height - Chicken.Height, Chicken.Width / 2, Chicken.Height);
                bufGraf.Graphics.DrawImage(Chicken, toRect, fromRect, GraphicsUnit.Pixel);
            }
            //если игра не окончена, рисуем жареную курицу
            else
            {
                fromRect = new Rectangle(Chicken.Width / 2, 0, Chicken.Width / 2, Chicken.Height);
                toRect   = new Rectangle(Battleground.Width * 18 / 40, Battleground.Height - Chicken.Height, Chicken.Width / 2, Chicken.Height);
                bufGraf.Graphics.DrawImage(Chicken, toRect, fromRect, GraphicsUnit.Pixel);
            }

            foreach (Bullet bul in bulList) //рисование своих пулек
            {
                bufGraf.Graphics.DrawImage(bul.BBIT, bul.x, bul.y, bul.dx, bul.dy);
            }
            foreach (Bullet bul in enemyBulList) //рисование вражеских пулек
            {
                bufGraf.Graphics.DrawImage(bul.BBIT, bul.x, bul.y, bul.dx, bul.dy);
            }

            Maps.MakeMap(mapArr, 2, bufGraf.Graphics); //рисование леса поверх танков и пулек

            foreach (Respawn rsp in RespawnList)       //рисование респаунов
            {
                rsp.ChangePicture(enemyList);
                GraphicsUnit units = GraphicsUnit.Pixel;
                bufGraf.Graphics.DrawImage(rsp.RBIT, rsp.toRect, rsp.fromRect, units);
            }

            if (myResp.removed == false) //рисование моего респауна
            {
                myResp.ChangePicture(myTank);
                GraphicsUnit units = GraphicsUnit.Pixel;
                bufGraf.Graphics.DrawImage(myResp.RBIT, myResp.toRect, myResp.fromRect, units);
            }

            foreach (Burst bst in BurstList) //рисование взрывов танков
            {
                bst.ChangePicture();
                GraphicsUnit units = GraphicsUnit.Pixel;
                bufGraf.Graphics.DrawImage(bst.BBIT, bst.toRect, bst.fromRect, units);
            }

            //удаление из массивов пулек, вылетевших за границы карты или взорвавшихся
            bulList.RemoveAll(bul => bul.removed == true);      //моих
            enemyBulList.RemoveAll(bul => bul.removed == true); //вражеских
            //удаление взрывов
            BurstList.RemoveAll(bst => bst.removed == true);
            //удаление респаунов
            RespawnList.RemoveAll(rsp => rsp.removed == true);

            if (GO == true) //если игра окончена
            {
                bufGraf.Graphics.DrawImage(GameOver, Battleground.Width / 2 - 200,
                                           Battleground.Height / 2 - 100, 400, 200); //рисование слов "Game Over"
            }

            bufGraf.Render(); //обновление картинки
            GC.Collect();     //сборка мусора
        }
示例#2
0
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            #region начало игры, отрисовка карты
            if (e.KeyCode == Keys.Space)
            {
                GO = false;
                //создание своего танка
                myTank = new MyTank(Battleground.Width * 14 / 40, Battleground.Height - 32 - 2, 32, 32, moveDirectionEnum.Up, tankTeam.my)
                {
                    immob = true                                                                  //танк неподвижен первые несколько секунд
                };
                myResp      = new Respawn(tankTeam.my, myTank.x - 4, myTank.y - 8, 40, 40, 0, 2); //создание респауна своего танка
                label2.Text = myTank.hp.ToString();                                               //жизни моего танка
                label1.Text = Tank.TankQuantity().ToString();                                     //количество оставшихся вражеских танков
                //включение таймеров
                renderTimer.Enabled    = true;
                moveTankTimer.Enabled  = true;
                moveEnemyTimer.Enabled = true;
                moveBulTimer.Enabled   = true;
                //включение фоновой музыки
                if (Sound == true)
                {
                    mciSendString("play soundBack from 0", null, 0, IntPtr.Zero);
                }
            }
            #endregion

            #region стрельба
            if (e.KeyCode == Keys.Enter)
            {
                if (myTank.shot == true && myTank.immob == false)
                {
                    //расчет начальных координат пульки в зависимости от положения танка
                    int locX = 0, locY = 0;
                    if (myTank.dir == moveDirectionEnum.Left)
                    {
                        locX = myTank.x - 8; locY = myTank.y + myTank.dy / 2 - 4;
                    }
                    if (myTank.dir == moveDirectionEnum.Right)
                    {
                        locX = myTank.x + myTank.dx + 0; locY = myTank.y + myTank.dy / 2 - 4;
                    }
                    if (myTank.dir == moveDirectionEnum.Up)
                    {
                        locX = myTank.x + myTank.dx / 2 - 4; locY = myTank.y - 8;
                    }
                    if (myTank.dir == moveDirectionEnum.Down)
                    {
                        locX = myTank.x + myTank.dx / 2 - 4; locY = myTank.y + myTank.dy + 0;
                    }
                    //создание новой пульки и добавление ее в массив
                    bulList.Add(new Bullet(locX, locY, 8, 8, myTank.dir));
                    //звук выстрела
                    if (Sound == true)
                    {
                        mciSendString("play soundShoot from 0", null, 0, IntPtr.Zero);
                    }
                    myTank.shot = false; //чтобы мой танк не мог стрелять очередью, при зажатии кнопки
                }
            }
            #endregion

            #region передвижение своего танка
            if (e.KeyCode == Keys.A) //движение своего танка влево
            {
                moveDirection[0] = true; moveDirection[1] = false; moveDirection[2] = false; moveDirection[3] = false;
                if (skidding == true)
                {
                    skidding = false; skidIter = 0;
                }
                ;                                                          //прекращение проскальзывания на льду, если оно есть
                myTank.dir = moveDirectionEnum.Left;
                if (myTank.changeDir == false)
                {
                    myTank.changeDir = true;
                }
            }
            if (e.KeyCode == Keys.D) //движение своего танка вправо
            {
                moveDirection[0] = false; moveDirection[1] = true; moveDirection[2] = false; moveDirection[3] = false;
                if (skidding == true)
                {
                    skidding = false; skidIter = 0;
                }
                ;                                                          //прекращение проскальзывания на льду, если оно есть
                myTank.dir = moveDirectionEnum.Right;
                if (myTank.changeDir == false)
                {
                    myTank.changeDir = true;
                }
            }
            if (e.KeyCode == Keys.W) //движение своего танка вверх
            {
                moveDirection[0] = false; moveDirection[1] = false; moveDirection[2] = true; moveDirection[3] = false;
                if (skidding == true)
                {
                    skidding = false; skidIter = 0;
                }
                ;                                                          //прекращение проскальзывания на льду, если оно есть
                myTank.dir = moveDirectionEnum.Up;
                if (myTank.changeDir == false)
                {
                    myTank.changeDir = true;
                }
            }
            if (e.KeyCode == Keys.S) //движение своего танка вниз
            {
                moveDirection[0] = false; moveDirection[1] = false; moveDirection[2] = false; moveDirection[3] = true;
                if (skidding == true)
                {
                    skidding = false; skidIter = 0;
                }
                ;                                                          //прекращение проскальзывания на льду, если оно есть
                myTank.dir = moveDirectionEnum.Down;
                if (myTank.changeDir == false)
                {
                    myTank.changeDir = true;
                }
            }
            #endregion

            //включение-отключение звука
            if (e.KeyCode == Keys.M)
            {
                Sound = !Sound;
                if (Sound == true)
                {
                    mciSendString("play soundBack", null, 0, IntPtr.Zero);
                }
                if (Sound == false)
                {
                    mciSendString("pause soundBack", null, 0, IntPtr.Zero);
                }
                moveEnemyTimer.Enabled = false;
            }

            //if (e.KeyCode == Keys.Q)
            //{
            //    bufGraf.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, Battleground.Width, Battleground.Height));
            //    bufGraf.Graphics.DrawString("Press Space", new Font("Arial", 32), new SolidBrush(Color.Black), new PointF(0, 0));
            //}
        }