Как подойти к рисованию фигур на С#, чтобы сделать клон тетриса?

Прежде всего я хотел бы отметить, что я НЕ использую XNA или LINQ в этом небольшом проекте. По сути, я хочу сделать клон тетриса, используя приложение Windows С#. Я уже нарисовал свою сетку, размер моего изображения 250x500, сделав каждый квадратный блок размером 25 x 25 пикселей.

Теперь я любитель рисовать фигуры. Я могу рисовать линии и прямоугольники, круги, эллипсы и многоугольники на сетке, заливать их цветом и т. д. Вот и все. Я больше ничего не могу делать с рисованием. Другими словами, базовые фигуры, используя точки, которые я создал для рисования многоугольников, таких как форма «Т» в тетрисе.

У меня вопрос: при создании фигур тетриса следует ли мне рисовать их с помощью методов рисования в C# или создавать и импортировать растровые изображения фигур тетриса и использовать их для создания своего клона тетриса?

Как только я научусь рисовать фигуры, остальное я смогу понять самостоятельно. Кроме того, при работе с игровой сеткой наследую ли я свойства Picturebox от своего класса GameGrid?


person Karim O.    schedule 09.03.2013    source источник
comment
Это определенно зависит от цели вашего проекта. Если ваша цель — просто сделать клон тетриса, то вы можете делать все, что захотите! У вас будет более красивая графика, если вы используете растровые изображения (или, во всяком случае, потенциал для более красивой графики), но может быть проще/быстрее просто нарисовать несколько цветных квадратов. С другой стороны, если в ваши цели входит научиться делать игру так, как это делает большинство людей, возможно, вы захотите пойти по маршруту растрового изображения, так как это гораздо более распространено. На самом деле здесь нет правильного или неправильного ответа.   -  person livingtech    schedule 11.03.2013


Ответы (2)


Предпочтение отдается использованию растровых изображений и предварительно визуализированных изображений, поскольку это ускоряет визуализацию каждого кадра. Это то, что делает большинство таких игр.

person Mohammad Dehghan    schedule 09.03.2013

То, как вы визуализируете фигуры, повлияет на обнаружение столкновений. Например, если у вас растровое изображение формы T, вам потребуется метод обнаружения столкновения T, возможно, путем попиксельного столкновения или отдельной структуры, которая поддерживает определенную форму. Принимая во внимание, что если вы просто поддерживаете список используемых блоков, обнаружение столкновений становится намного проще.

Если у вас есть формы в виде матрицы блоков, как в оригинальной игре, вам может показаться, что рендеринг, обработка и столкновение намного проще.

Например, взгляните на следующий псевдокод:

class Shape
{
    bool [3][3] Blocks;

    Pos pos;
}

Shape T = new Shape();

T.Blocks[0][0] = true;
T.Blocks[0][1] = true;
T.Blocks[0][2] = true;

T.Blocks[1][0] = false;
T.Blocks[1][1] = true;
T.Blocks[1][2] = false;

T.Blocks[2][0] = false;
T.Blocks[2][1] = true;
T.Blocks[2][2] = false;

При рендеринге вы можете сделать что-то вроде следующих строк:

foreach(Shape s in currentBlocks)
{
    for(int x = 0; i < 3)
    {
        for(int y = 0; y < 3; y++)
        {
            if(s.Blocks[x][y])
            {
                gameGrid.Render(s.Pos.X + x, s.Pos.Y + y);
            }
        }
    }
}
person rhughes    schedule 11.03.2013
comment
Спасибо за ответ. Я сделал свои работы с помощью фотошопа, так как каждый блок имеет размер 25x25 пикселей, и все они сохранены с расширением .bmp. Вся цель этого личного проекта — привыкнуть к работе с изображениями и использованию многомерных массивов. - person Karim O.; 11.03.2013
comment
@KarimOumghar Отлично. В приведенном выше примере кода хорошо используются многомерные массивы. Каждая block часть может быть визуализирована с вашим изображением размером 25x25 пикселей. Вы также можете пойти дальше, добавив разные цвета для каждого блока и т. д. - person rhughes; 11.03.2013