#c# #winforms #class #delayed-execution
#c# #winforms #класс #отложенное выполнение
Вопрос:
Я создаю эту игру для своей работы в колледже, в основном это space invaders, у меня есть класс для лазеров и класс для плохих парней, atm он настроен только на то, чтобы активировать падение 5 плохих парней с верхней части экрана, что я хочу сделать, это либо зациклить список, скажем, через 5 секунд список повторяется, и еще 5 плохих парней появляются в верхней части экрана, либо составить список из 100 плохих парней, но после 5 задержки следующие 5 и т. Д
namespace SpaceInvaders
{
public partial class Form1 : Form
{
private List<Invader> invaders = new List<Invader>();
private List<Laser> lasers = new List<Laser>();
int invaderNumber = 0;
int score = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode.Equals(Keys.W))
{
if (SpaceFighter.Top > 0)
{
SpaceFighter.Top = SpaceFighter.Top - 30;
}
}
if (e.KeyCode.Equals(Keys.A))
{
if (SpaceFighter.Left > 0)
{
SpaceFighter.Left = SpaceFighter.Left - 10;
}
}
if (e.KeyCode.Equals(Keys.D))
{
if (SpaceFighter.Right < this.Width)
{
SpaceFighter.Left = SpaceFighter.Left 10;
}
}
if (e.KeyCode.Equals(Keys.S))
{
if (SpaceFighter.Bottom < this.Height - 10)
{
SpaceFighter.Top = SpaceFighter.Top 10;
}
}
if (e.KeyCode.Equals(Keys.Space))
{
this.lasers.Add(new Laser(this, SpaceFighter));
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (invaderNumber > 4)
{
timer1.Enabled = false;
timer2.Enabled = true;
}
else
{
invaders.Add(new Invader(this));
invaderNumber ;
}
}
private void timer2_Tick(object sender, EventArgs e)
{
invaders.RemoveAll(ship => ship.isDisposed);
foreach(Invader ship in invaders)
{
ship.MoveInvader(this);
if (SpaceFighter.Bounds.IntersectsWith(ship.ship.Bounds))
{
timer2.Enabled = false;
MessageBox.Show("You Lose!");
return;
}
}
lasers.RemoveAll(laser => laser.isDisposed);
foreach (Laser laser in lasers)
{
laser.MoveLaser(this);
foreach (Invader ship in invaders)
{
if (laser.laser.Bounds.IntersectsWith(ship.ship.Bounds))
{
laser.isDisposed = true;
laser.laser.Dispose();
ship.isDisposed = true;
ship.ship.Dispose();
score = score 2;
lblScore.Text = score.ToString();
}
}
}
form
https://pastebin.com/P9enYPN5
laser class
https://pastebin.com/nvZ1VU8C
bad guys class
https://pastebin.com/eByLZ1Q8
Комментарии:
1. Вы хотите добавить некоторую задержку?
2. не могли бы вы добавить сюда код, пожалуйста?
3. проверьте ниже мой опубликованный ответ, может быть, это поможет вам
4. я добавил ссылки на pastebin в свой код
5. Вы также можете просто попробовать добавить
invaderNumber--;
иtimer1.enabled=true;
сразу после того, как убьете врага (нижеlblScore.Text = score.ToString();
), Это сохранит постоянный поток врагов.
Ответ №1:
// function for delaying
System.Threading.Thread.Sleep(1000 * 5);
// loop with delay
while (true/* condition */)
{
// some more code
//..
// delay
System.Threading.Thread.Sleep(1000 * 5);
}
Комментарии:
1. я добавил ссылки на pastebin в свой код, так мне добавить свой список внутри функции while?
2. Куда вы хотите добавить функцию задержки?
3. После запуска любого метода или до или после обновления списка?
4. список активируется сразу, и это нормально, но я хочу сделать так, чтобы список содержал 100 плохих парней, но после каждых 5 плохих парней он задерживается на несколько секунд, прежде чем добавлять следующие 5
Ответ №2:
Попробуйте сделать так, это может сработать
// initialize
int delayNoOfBadGuy = 0;
// before releasing every badguy increment with 1
delayNoOfBadGuy ;
if (delayNoOfBadGuy >= 5)
{
// set to zero
delayNoOfBadGuy = 0;
// add delay
System.Threading.Thread.Sleep(1000 * 5);
}
// rest of code
Комментарии:
1. кажется, не получается заставить это работать, все плохие парни все равно приходят сразу, список подключен к 2 таймерам, поэтому я не знаю, отличается ли это