LINUX.ORG.RU

Пишу тетрис, внезапный вопрос

 ,


1

3

Короче, смотрите. Фигуры представлены в массиве 4х4, при нажатии клавиши «повернуть» они поворачиваются. Но у меня они крутятся как бы вокруг центра матрицы, а не вокруг центра фигуры. Вопрос - на какие хитрости надо идти, чтобы все было как в настоящем тетрисе?

Deleted

Последнее исправление: cetjs2 (всего исправлений: 1)

Если честно, я в упор не помню, как поворачивались фигуры в тетрисе. Приведи пример

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Я два дня потоатил на создание универсальной формулы, збс.

Просто нельзя же взять и написать тетрис, это не интересно. По этому я пишу его на своем диалекте сишки, в котором нет двумерных массивов.

Deleted
()
Ответ на: комментарий от Gvidon

Не, пусть кто то добрый приведет. У меня такой инет, что фиг я что приведу.

Deleted
()

Вопрос - на какие хитрости надо идти, чтобы все было как в настоящем тетрисе?

Надо выкинуть

Фигуры представлены в массиве 4х4

это.

aedeph_ ★★
()

Видел реализацию, в которой были перечислены все возможные положения всех фигур (и фигуры тоже задавались бинарной матрицей)

kravich ★★★★
()

Надо подходить к компьютеру незаметно и внезапно запускать билд. Иначе компилятор успевает понять, что вы хотите сделать, и выдаёт глючный код.

queen3 ★★★★★
()

Ну неужели сложно каждую фигуру описывать структурой, имеющей в своем составе 4 массива: по одному на каждую ориентацию фигуры?

Кстати, а как ты определяешь определяешь центр фигур? Они же из четного количества пикселей по обеим осям (ну, разве что Г — и та вдоль короткой стороны имеет 2 пикселя)! Я уж и не помню, как там в классике было.

Anon
()

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

Но мне больше по нраву первая идея: меньше вычислительных ресурсов жрет. Правда, больше памяти. В общем, надо исходить из того, для какого железа пишется.

Anon
()
Ответ на: комментарий от Anon

Центра фигур у меня нет, у меня они были в матрицах представлены, ты сам сказал.

Deleted
()
Ответ на: комментарий от Gvidon

Я не ССЗБ, это хобби такое афигенное.

Deleted
()
Ответ на: комментарий от kravich

Буду склоняться к этой, скорее всего.

Deleted
()

Помнится, у меня оно было дифференцировано. То есть, все фигуры кроме палки были в 3х3, а палка обрабатывалась отдельно. Кажется. Но найти тот исходник на схеме, где логика была без единого set!, сейчас уже довольно сложно.

dmiceman ★★★★★
()
Ответ на: комментарий от drSchur

Bizun ultra hardcore pointer fuck edition!

А если серьезно, то я афигел от того, на сколько минимальный диалект сишки может быть функциональным. Да, хардкор. Да, с указателями секс, но все же.

Deleted
()
Ответ на: комментарий от Deleted

Ну тогда просто описывай каждую фигуру массивами из четырех значений (для каждой ориентации). Тогда при повороте просто будешь перебирать содержимое массива.

Кстати, как ты контролируешь, можно ли вращать фигуру? И как узнаешь, что фигура уже дальше падать не может? По-моему, с массивами координат (NULL-terminated) пикселей фигур относительно их центра было бы довольно просто: при очередном такте проверяем на ноль {Y+1}+{пиксели фигуры}, если движение возможно, то декрементируем значения в поле по координатам Y+{пиксели фигуры}, инкрементируем Y, инкрементируем пиксели поля в точках {Y}+{пиксели фигуры}; переходим к следующей фигуре.

Anon
()

Короче, смотрите. Фигуры представлены в массиве 4х4, при нажатии клавиши «повернуть» они поворачиваются. Но у меня они крутятся как бы вокруг центра матрицы, а не вокруг центра фигуры. Вопрос - на какие хитрости надо идти, чтобы все было как в настоящем тетрисе?

Построить фигуры в массиве так, чтоб центр фигур совпадал с центром матрицы?

anonymous
()
Ответ на: комментарий от GAMer

Не а. Меня всегда бесило то, что надо использовать что то придуманое кем то, я написал простенькую ВМ с текстовым дисплеем 32х16. Для нее ассемблер и компилятор. Играюсь, кажется, третий год уже. Причем простор для совершенствования и вм, и асмы,и компилятора ахренительно здоровый.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Gvidon

Не знаю, как в оригинальном тетрисе, но в китайских Brick Game, а уж тем более во всяких программных эмуляторах, вращаются везде по-разному. Всякие улучшалки типа насквозьпроходящих кирпичей, выбивалок и 5-элементных фигур - и подавно варьируются. Короче, ОП, пили так, как удобнее всего играть.

MiniRoboDancer ★☆
()

На бумажке нарисуй и представишь. Для чётных длин рёбер нужно вращать вокруг центральной точки, хотя это выглядит не так очевидно для игрока.

ziemin ★★
()
Ответ на: комментарий от Deleted

Играюсь, кажется, третий год уже.

Тогда уже пора делать эту вм под fpga, реальное железо и доставляет реально.

GAMer ★★★★★
()

как ни странно - поворот фигур в тетрисе не очевидная вешь, было даже интервью с автором где он это (геморность алгоритма) описывал.

кстати, (давным давно, когда трава была зеленее) в одной популярной ДОС-вской реализации тетриса, некотрые фигуры при быстром вращении поднимались наверх :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ахах, жесть! Ложусь спать с хорошим намтроением :)

Deleted
()

Как то так это было сделано в моем 3d тетрисе на CL:

(defparameter *figures*
  (list
   (make-array '(2 3) :initial-contents '((1 1 1) (1 0 0)))
   (make-array '(2 3) :initial-contents '((1 1 1) (0 0 1)))
   (make-array '(2 3) :initial-contents '((1 1 0) (0 1 1)))
   (make-array '(2 3) :initial-contents '((0 1 1) (1 1 0)))
   (make-array '(2 2) :initial-contents '((1 1) (1 1)))
   (make-array '(1 4) :initial-contents '((1 1 1 1)))
   (make-array '(2 3) :initial-contents '((1 1 1) (0 1 0)))))

(defgeneric rotate-figure (figure)
  (:method ((figure figure))
    (with-slots (body) figure
      (let ((prev-body body))
        (setf body (make-array (list (array-dimension prev-body 1)
                                     (array-dimension prev-body 0))))
        (do ((prev-w 0 (1+ prev-w))
             (h (1- (array-dimension body 0)) (1- h)))
            ((< h 0))
          (do ((prev-h 0 (1+ prev-h))
               (w 0 (1+ w)))
              ((> prev-h (1- (array-dimension prev-body 0))))
            (setf (aref body h w) (aref prev-body prev-h prev-w))))))))

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


XXO горизонтальное
OXX

0X   вертикальное
XX
X0

Выходит так, что фигуры отрисовываются всегда от верхнего левого края.

grouzen ★★
()
Последнее исправление: grouzen (всего исправлений: 2)
Ответ на: комментарий от grouzen

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

alexku
()
Ответ на: комментарий от Deleted

Я два дня потоатил на создание универсальной формулы, збс.

Просто нельзя же взять и написать тетрис, это не интересно. По этому я пишу его на своем диалекте сишки, в котором нет двумерных массивов.

И почему мне кажется что фанаты СИ просто обязаны создавать языки уродцы наследующие от предка бякофичи? Плавно повернуть текстуру в графдвижке и скачкообразно подменить свойства фигуры не интересно, надо формулы изобретать, а потом такие умники говорят что вся логика состоит из математики и вообще всё ей описывается:)

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Плавно повернуть текстуру в графдвижке и скачкообразно подменить свойства фигуры

Фигасе, ну ты и гемор придумал! Интересно, как в графдвижке (LCD дисплей) повернуть текстуру? И что такое вообще там текстура?

А про контроль пересечений ты подумал? Как ты это на текстурах реализуешь? Будешь городить pick-буфер? Или вообще с прозрачностями начнешь маяться? Нафига такие усложнения для этой элементарщины?

В итоге у ТСа игра займет килобайт, а у тебя — сотню мегабайт…

Anon
()
Ответ на: комментарий от Deleted

я пишу его на своем диалекте сишки, в котором нет двумерных массивов.

N-мерный массив легко делается из одного одномерного

Deleted
()
Ответ на: комментарий от ziemin

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

grouzen ★★
()
Ответ на: комментарий от ziemin

Нет, отрисовывается = рендерится/просчитывается/строится так, что фигура строится от верхнего левого угла. Перед этим естественно проверяется на коллизии.

grouzen ★★
()
Ответ на: комментарий от grouzen

Нет, отрисовывается = рендерится/просчитывается/строится так, что фигура строится от верхнего левого угла

Ну-ка набросай формулу расчёта, притом,что простейший поворот вокруг центра это: (как я себе представляю) x*sin(L),y*cos(L) или (как надо) умножение на матрицу с хитрыми коэффициентам.

ziemin ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.