Помогите с перемещением PictureBox с помощью клавиш и таймеров - PullRequest
0 голосов
/ 24 августа 2011

Я делаю стрелялки, как космические захватчики. Мой PictureBox pb не будет двигаться с помощью клавиш, и у меня возникла проблема с PictureBox pb1, пробел диска исчезает через секунду. Он не будет двигаться влево и вправо.

Вот мои коды.

namespace SpaceShoot
{
class Shoot
{

    private Form f;
    private Button bLeft, bRight;
    private PictureBox pb;
    private PictureBox pb1;
    private Boolean check = false;
    private int X, Y;
    Timer Clock = new Timer();
    private int k = 0;
    int x = 0;

    public Shoot()
    {
        f = new Form();

        bLeft = new Button();
        bRight = new Button();

        pb = new PictureBox();  //spaceship
        pb1 = new PictureBox(); //spacedisc

        Clock = new Timer();

    }

    public void Launch()
    {

        pb1.Image = new Bitmap("spacedisc.png");
        pb1.SetBounds(20, 20, 120, 70);

        pb1.SizeMode = PictureBoxSizeMode.StretchImage;

        f.BackColor = System.Drawing.Color.Black;
        f.Size = new Size(700, 700);
        f.StartPosition = FormStartPosition.CenterScreen;
        f.Controls.Add(pb);
        f.Controls.Add(pb1);

        bLeft.KeyDown += new KeyEventHandler(Space_KeyDown);
        bRight.KeyDown += new KeyEventHandler(Space_KeyDown);

        pb.SetBounds(300, 580, 60, 60);
        pb.Image = new Bitmap("spaceship.png");         

        pb.SizeMode = PictureBoxSizeMode.StretchImage;

        Clock = new Timer();
        Clock.Interval = 800;
        Clock.Tick += new EventHandler(Clock_Tick);
        Clock.Start();
        f.ShowDialog();
    }

    public void Clock_Tick(object sender, EventArgs e)
    {

        for (x = 0; x >= 0; x += 2)
        {
            pb1.Location = new Point(0 + x, 20);
        }
        for (x = 500; x >= 500; x -= 2)
        {
            pb1.Location = new Point(500 - x, 20);
        }
         f.Invalidate();           
    }

    public void Space_KeyDown(object sender, KeyEventArgs e)
    {
        int x = pb.Location.X;
        if (e.KeyCode == Keys.Right)
        {
            x += 5;
            pb.Location = new Point(300 + x, 580);
        }
        else if (e.KeyCode == Keys.Left)
        {
            x -= 5;
            pb.Location = new Point(300 + x, 580);
        }

    }
}

}

1 Ответ

1 голос
/ 24 августа 2011

ооо .... с чего начать?Ладно, по одной вещи за раз.

Первое отключено, у вас бесконечный цикл:

            for (x = 0; x >= 0; x += 2)
            {
                pb1.Location = new Point(0 + x, 20);
            }

Таким образом, приложение никогда не будет проходить дальше одного тика.

Во-вторых вы работаете в диалоге .... который я действительно не рекомендую.Замените:

f.ShowDialog();

на:

Application.Run(f);

С вашим program.cs, вероятно, выглядит примерно так:

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Shoot shoot = new Shoot();
        shoot.Launch();

Если вы уже находитесь в WinFormприложение, тогда просто .Show () форма и .Hide () любые предыдущие формы.

В-третьих ... и я ценю, что вы, вероятно, просто веселитесь здесь ... но в любом случаеЭто довольно плохой способ создать игру с использованием WinForm.Элементы управления Windows не предназначены для использования таким образом, и в конечном итоге вы столкнетесь с рядом проблем, связанных с отсечкой, прозрачностью и другими проблемами рендеринга.Я бы порекомендовал обновить игру, нарисовав ее в границах элемента управления, который занимает всю форму.Таким образом, вы можете выполнить весь рендеринг одним ударом вместо того, чтобы полагаться на множество отдельных методов рисования каждого элемента управления, который вы используете.Он также будет лучше масштабироваться при увеличении количества спрайтов на экране (поскольку элементы управления являются относительно тяжелыми объектами).

Я настоятельно рекомендую прочитать этот FAQ в GDI +.Это тот самый, который помог мне оценить, как хорошо рисовать в WinForm много лет назад.:)

Короче говоря:

  • Организация вашего кода для создания изображений для каждого кадра игры
  • Создание пользовательского элемента управления (объект, который наследуется от элемента управления)затем отобразить «текущее» изображение в графический объект (для этого переопределите метод OnPaint) для элемента управления.
...