LINUX.ORG.RU

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

 ,


1

3

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

Deleted

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

Какая еще формула? Просто при повороте строишь повернутую фигуру от левого верхнего края, никаких центров и хитрых коэффициентов. Если чо, вот сорцы моей поделки https://github.com/grouzen/cl-tetris3d/blob/master/tetris.lisp , там можешь посмотреть чо к чему

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

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

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

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

Берем квадратный пнг с прозрачностями, задаём ему координаты и угол поворота.

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

Элементарщина у тебя только пока ты попиксельно рисуешь графику с минимумом цветов и без плавных мастабирований, как в дендике. Пересечения картинок нам до лампочки и физика тоже. Фигура представляет собой 4 двумерных массива из нулей и единиц (одновременно используется только один в зависимости от угла поворота). К движущейся фигуре прикрепляем координаты картинки и всё.

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

Сотню мегабайт только если делать с озвучкой во флац. В килобайт даже цветастую обоину с поэтэсстой впихнуть проблемно. Нет, это конечно прикольно впихивать игру в килобайт в то время когда де с графической подсистемой жрут >140 метров а память видух давно перешагнула четверь гектара.

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

Дык, микроконтроллеры, знаешь ли, разные бывают. До появления копеечных STM32F0 пользовались PIC'ами или AVR'ками, у которых и меньше бывает памяти.

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

Я как бы обратного и не говорил.

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

Ну ка, перескажи мне от туда все правила.

Deleted
()

Укажи размер фигуры явно, чкт

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

А как их предстовлять тогда?

в массиве 8x8

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

Десктопные игры не нужны. Нужны карманные, вроде "ну погоди", "тетриса" и т.п. Чтобы можно было, скажем, в поезде вытащить и поиграть.

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

Десктопные игры не нужны.

Именно такие и нужны в отличии от прочих.

Нужны карманные, вроде «ну погоди», «тетриса» и т.п.

Такие уже прошиты в тридцатибаксовом телефоне а смартфоны не нужны кроме исключительных случаев.

Чтобы можно было, скажем, в поезде вытащить и поиграть.

«достаю из широких штанин, смотрите, завидуйте!» (с)

Napilnik ★★★★★
()

Тред не читал, вот как я сделал в своём тетрисе, когда писал: http://pastebin.com/KqC7Z8uN

Суть в том, что «координаты» фигуры - координаты её условного «центра», координаты абсолютные, в «стакане». А кроме центра, в ней есть ещё координаты трёх точек, координаты относительно центра. Рисовать довольно легко - надо прибавить координаты точки к координатам центра. А профит в том, что можно просто умножить их на матрицу поворота и, тем самым, повернуть всю фигуру. Я смотрел - пажитновский тетрис точно так же себя ведёт.

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

А все. можешь расслабиться :) Есть blockout2 под linux.

dikiy ★★☆☆☆
()

Но у меня они крутятся как бы вокруг центра матрицы, а не вокруг центра фигуры

1. впиши фигуру в центр матрицы. Естественно для палки

****
это невозможно. Ну примерно.

2. фигуры (почти)вписывающиеся в матрицу 3х3 крути внутри матрицы 3х3, например эту

***
 *

3. для матрицы 2х2 то же. Нпример вот эта

**
**
вообще не крутится.

Тему не читал.

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

а в каком диалекте сишки они есть?

в c89 есть массив из массивов. Ну его можно считать «двумерным». Во всяком случае для тетриса

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

Ну-ка набросай формулу расчёта, притом,что простейший поворот

нету в тетрисе формул расчёта поворота - там всегда поворот на 90, да ещё и движения вправо-влево(тоже дискретно) на знакоместо, Но время блин фактически непрерывно - юзер жмет беспрерывно кнопку вращения(смещения), наступает тайм-слот «шаг вниз» и ОПА - вращение фигуры на месте и сдвиг+вращение сцуко разнятся. чистая алгоритмистика и представление данных

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

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

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

x*sin(L),y*cos(L) или (как надо) умножение на матрицу с хитрыми коэффициентам.

там угол всегда PI/2, потому формулы и матрицы вырождаются.

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

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

Anon
()

Два варианта:

1. «Центрировать» фигуры в вашей матрице 4х4.

2. Ввести понятие hotspot для каждой фигуры. Фигуры двигать попиксельно (а не поблочно).

Второй вариант не сильно сложнее, но визуально гораздо приятнее.

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

а можно пример?

можно

int a[4][4];

char **ary; Это массив массивов чтоли?

это указатель на указатель. Возможно, это результат преобразования из массива указателей. А может массива массивов. А может просто указатель на указатель. Я не знаю.

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

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

фигуры из КВАДРАТНЫХ блоков? Под ПРОИЗВОЛЬНЫМ углом? В ТЕТРИСЕ? Они упоролись?

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

1. «Центрировать» фигуры в вашей матрице 4х4.

2. Ввести понятие hotspot для каждой фигуры. Фигуры двигать попиксельно (а не поблочно).

hint: юзать матрицы 5х5 где центральный элемент - точка поворота

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

hint: юзать матрицы 5х5 где центральный элемент - точка поворота

Как это поможет для фигур L, |, T?

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

int a[4][4];

Это же обычный одномерный массив, просто с удобством индексации: вместо a[stride*Y + X] ты пишешь a[Y][X], а компилятор уж сам преобразует это в то.

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

Мне нарвится это, бро. Я так и хотел. Но в условиях 125килогерц и кривого компилятора это будет медленно, наверное.

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

Это же обычный одномерный массив, просто с удобством индексации: вместо a[stride*Y + X] ты пишешь a[Y][X], а компилятор уж сам преобразует это в то.

нет. Это «обычный» массив из четырёх эл-тов, каждый из которых является массивом из 4х int'ов. В качестве доказательства можешь посчитать размер скажем a[2]. В одномерном будет 1 int, а тут 4 int'а. Т.е. это совсем не одномерный массив. (и не двухмерный, тоже. Не совсем)

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

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

А нафига?

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

Блин. А с фига ли я думал, что там одномерный массив? Вот блин! Не понимаю, на кой черт так делали! Ведь разыменование двух указателей — более длительная операция, нежели вычисление смещения и разыменование одного указателя…

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

А с фига ли я думал, что там одномерный массив?

с т.з. ассемблера x86 он и есть одномерный.

Не понимаю, на кой черт так делали! Ведь разыменование двух указателей — более длительная операция, нежели вычисление смещения и разыменование одного указателя…

в x86 это и получается так. Смещение и разименование. Прекрати уже мешать в одну кучу ассемблер x86 и сишечку, это РАЗНЫЕ вещи. Да, есть много общего, и тем более не нужно мешать.

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