_Q12_ Ответов: 1

Как заставить лазеры летать?


Я использую c# для winapp- Не за единство или что-то в этом роде.

my class
{
        Lasers laser1 = new Lasers();
        Lasers laser2 = new Lasers(); 


        public Screen()
        {
            InitializeComponent();
            DoubleBuffered = true;
            this.Paint += new PaintEventHandler(Screen_Paint);

            Timer timerforLaser = new Timer();
            timerforLaser.Tick += new EventHandler(Timer_forLaser_Tick);
            timerforLaser.Interval = 100;
            timerforLaser.Start();

            ....
  
            laser1.Initialize();
            laser2.Initialize();
        }
 
        void Screen_Paint(object sender, PaintEventArgs e)
        {
            ........

            e.Graphics.DrawImage(laser1.Img0, laser1.Rectangle);//LaserPaint
            e.Graphics.DrawImage(laser2.Img0, laser2.Rectangle);//LaserPaint
        }
        void Timer_forLaser_Tick(object sender, EventArgs e)
        {
            laser1.ShootUp();
            laser2.ShootUp();
            this.Refresh(); //very Important -without him here nothing works
        }

        private void Screen_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
            {
                laser1.New(Player.X, Player.Y);
                laser2.New(Player.X, Player.Y);
            }
            this.Refresh(); //very Important -without him here nothing works
        }
}


Из кода, который я публикую, когда я нажимаю клавишу пробела, он создаст 2 лазерных изображения на экране и обновит их в событии таймера.
Проблема в том, что создаются они одновременно и внахлест.
Я хочу, чтобы они создавались один за другим. Как взрыв. С небольшим промежутком времени между ними. И никаких совпадений.
Я полагаю, что должен каким-то образом поставить таймер между начальной точкой каждого лазера, пока я продолжаю нажимать клавишу пробела. Или какая-то задержка. И если мне придется создать 100 лазеров, я, вероятно, создам массив, который будет содержать все лазеры? Я понятия не имею, как заставить эту штуку работать.

Большое вам спасибо.

Что я уже пробовал:

everything
everything
everything
everything
everything
everything

1 Ответов

Рейтинг:
7

Graeme_Grant

Ваш код делает именно то, о чем вы его просили ... нарисуйте и то и другое одновременно. Если вы хотите нарисовать каждый из них по отдельности, то вам нужна переменная, чтобы отслеживать, какой лазер рисуется для этого цикла таймера, а затем чередовать... Что-то вроде...

private bool isAlternate;

void Screen_Paint(object sender, PaintEventArgs e)
{
    // ........
 
    if(isAlternate)
        e.Graphics.DrawImage(laser1.Img0, laser1.Rectangle);//LaserPaint
    else
        e.Graphics.DrawImage(laser2.Img0, laser2.Rectangle);//LaserPaint
}

void Timer_forLaser_Tick(object sender, EventArgs e)
{
    laser1.ShootUp();
    laser2.ShootUp();
    this.Refresh(); //very Important -without him here nothing works
    isAlternate = !isAlternate;
}


_Q12_

хех, лазер меняет цвет, если я поставлю 2 разных цвета, чтобы увидеть эффект. Когда лазер взлетает вверх, цвет меняется за один тик. Хороший эффект, хотя:) стробоскопический лазер :)
Я изменил laser2. Img0 на Img1, который является еще одним цветным изображением.

_Q12_

я поправил его.
если (электронная.Данные KeyCode == Ключи.Космос)
{
если (isAlternate)
laser1.Новый(Плеер.Х, Игрок.Г);
еще
laser2.Новый(Плеер.Х, Игрок.Г);
isAlternate =! isAlternate;
}
теперь он стреляет разными лазерами разного цвета каждый раз, когда я нажимаю пробел.
НО....
если я продолжаю нажимать клавишу пробела,то это не та управляемая очередь, которую я хочу. Как это сделать?

_Q12_

ваш ответ хорош, и он помог.
Но я хочу другой вариант, если кто-то может поделиться своими мыслями.

_Q12_

Спасибо.