задержка или зацикливание списка?

#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 таймерам, поэтому я не знаю, отличается ли это