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(); //сборка мусора }
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)); //} }