Другие языки программирования и технологии

Помогите с игрой в C#

Делаю простенький шутер в C#(именно в форме) и у меня вопрос - как сделать пулю так, чтобы при каждом нажатии на кнопку, выпускалась новая пуля?
Пример кода:
if (e.KeyCode == Keys.F)
{

pictureBox3.Location = new Point(pictureBox1.Location.X + 34, pictureBox1.Location.Y + 18);
pictureBox3.Visible = true;
timer1.Enabled = true;
KC
Kaan0714 Can
170
Во-первых, выкинь PictureBox. Он предназначен не для того, чтобы пули из него делать.
Во-вторых, понадобится список, где будут храниться данные о пулях. Этими данными будут их координаты, так что список структур Point будет в самый раз:

List< Point > bullets = new List< Point >();

При выстреле (нажатии на кнопку) нужно лишь добавлять в этот список точку, соответствующую начальной позиции пули:

if (e.KeyCode == Keys.F) {
bullets.Add(new Point(pictureBox1.Location.X + 34, pictureBox1.Location.Y + 18));
}

Рисовать пули будем, как и положено, в обработчике события Paint (изображение из pictureBox1 тоже следовало бы, если по уму делать). Соответственно понадобится объект Image, в который будет загружено изображение пули:

Image bullet_image = Image.FromFile("пуля. jpg");

само рисование:

private void Form1_Paint(object sender, PaintEventArgs e) {
foreach (Point pos in bullets) { // для каждой пули в списке
e.Graphics.DrawImage(bullet_image, pos); // рисуем изображение в позиции пули
e.Graphics.ExcludeClip(new Rectangle(pos, bullet_image.Size)); // добавляем в область отсечения
}
e.Graphics.Clear(this.BackColor); // заливаем всё остальное цветом фона
}

Вместо простой заливки можно, естественно, выводить в качестве фона какое-нибудь изображение.
Перемещение пуль будет производиться по таймеру, который должен быть включен постоянно:

private void timer1_Tick(object sender, EventArgs e) {
int i = 0;
while (i < bullets.Count) { // перебираем все имеющиеся в списке пули
// если пуля вышла за пределы формы, то удаляем её:
if (!this.ClientRectangle.Contains(bullets[i])) bullets.RemoveAt(i);
else { // если пуля всё ещё на форме, то перемещаем её в нужную сторону:
bullets[i] = new Point(bullets[i].X + 5, bullets[i].Y); // в данном случае - сдвигаем на 5 пикселей вправо
i++; // переходим к следующей пуле
}
}
this.Invalidate(); // в конце вызываем перерисовку формы, чтобы обновить изображение
}
Viktor Nikityuk
Viktor Nikityuk
24 295
Лучший ответ
PictureBox bullet = new PictureBox();
bullet.Location = ...
bullet.Size = ...
Егор Мухин
Егор Мухин
157