2013-10-02 2 views
-1

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

В принципе, мы используем пользовательские изображения для кусков тетриса. У нас есть три разных цвета для каждого и другое изображение для каждого возможного вращения. Кроме того, наша игра будет пытаться объединить буквы вместе, чтобы у нас были изображения с каждым возможным поворотом с каждым возможным размещением букв. Например, для формы «T» мы имеем теперь 92 изображения каждого возможного вращения только для одного из трех цветов, которые мы хотим использовать с четырьмя буквами, которые мы используем. Подумав об этом в течение последних нескольких дней, будут сотни (возможно, даже более тысячи) изображений.

Однако это не проблема. Единственный способ, с помощью которого я могу проверить проверку, - использовать TON (например, более тысячи) операторов IF. Например, если кусок 1, который имеет форму «Т» с «А» с правой стороны, нам нужно проверить, находится ли «В» рядом с любым другим возможным положением, в котором может быть часть. Если часть с «А» на нем находится рядом (либо сверху, внизу, либо с обеих сторон) кусок с надписью «В», подходящий для регистрации. Если в любой точке две буквы, которые являются одной и той же землей рядом друг с другом, весь ряд кусков, которые являются плохим совпадением, исчезнет, ​​и все части над ним упадут. После того, как эти части снова приземлятся, каждую деталь нужно снова проверить, чтобы узнать, является ли ее новая позиция частью любой возможной пары букв. Проверка всегда будет происходить для каждой отдельной части, которая возникает на игровой доске, поэтому чем больше частей, тем больше проверок, которые должны всегда происходить.

Итак, это что-то, что просто займет много времени (у нас есть чуть больше месяца), или есть что-то еще, что можно сделать, кроме TON утверждений IF? Возможно ли что-то подобное? В конце концов, мы говорим, скорее всего, 1000 изображений и каждый образ должен быть всегда получать проверяется, если он:

  1. ударили другое изображение и нужно остановить

  2. Проверьте, где игрок помещен это рядом с другим письмом и хорошим письмом (это большая проблема)

  3. После того, как целая часть исчезнет, ​​части должны снова свернуть и снова проверить все, что нужно проверить ,

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

EDIT:

Вот очень быстро бросил вместе образ, который дает вам представление о том, как он выглядит:

http://imageshack.us/a/img560/1814/dg80.png

Глядя на это изображение, вы видите 4 части уже на месте в нижней части доски, и игрок направляет прямую часть вниз. Игрок хочет сопоставить «А» в нижней части строки с «А», которая находится в правом квадрате формы «Т». Как только кусок приземлился рядом с «Т», код должен сказать «О, эй, другой« А »просто приземлился рядом со мной, поэтому я хороший матч, и мы оба должны исчезнуть». Как только это произойдет, другие части сдвинутся вниз, и проверка должна повториться.Поскольку существует SO много комбинаций предметов и с игроками, имеющими свободное владение, чтобы положить куски в сумасшедшие места, проверка должна быть безумной. Каждая отдельная деталь должна проверяться со всеми остальными частями, чтобы гарантировать, что действительная комбо никогда не пропущена.

Вот пример того, что часть выглядит следующим образом:

http://imageshack.us/a/img23/6632/1g3q.png

+1

Я думаю, что было бы проще получить плату Tetris, используя цветные экземпляры «Shape», чем использование изображений. Java-2D имеет встроенные методы для вращения изображений или фигур, но форма также обеспечивает методы обнаружения столкновения с другими формами (что удобно, когда дело доходит до кусков, которые не являются прямоугольными). См. [Этот ответ] (http://stackoverflow.com/a/14575043/418556) для примера. –

+0

Это то, о чем мы думаем, однако это все еще не решает нашу самую большую проблему, которая является буквенными комбо. С таким количеством различных возможных комбинаций букв, занимающих единую «квадратную» фигуру в тетрисе, могут быть сотни возможных парных комбинаций. Мы не планируем, чтобы каждая штука, которая выходит, имела на ней письмо, но когда это делается, ей нужно не только проверять столкновение, но и обнаруживать, что она перестала двигаться с частью формы (одна из четырех квадратов Тетриса), приземляющихся рядом с другой фигурой с буквой, что это действительная пара. – Badge

+0

OK Я не понимаю (теперь я читал больше). Эти «письма» - это то, чего я не понимаю. По буквам DYM, что «форма T» - это одна буква? Таким образом, другие фигуры будут «L shape», «I shape» и ... что? Нет .. подождите, это не похоже на то, что вы упоминаете «A» и «B». Можете ли вы опубликовать скриншот о том, как будет выглядеть частично законченная игра? –

ответ

0

То, что вы, вероятно, хотите сделать, это думать о вашей Gamefield как 2 одномерный массив с множеством ячеек. Каждая строка имеет N ячеек, и есть M строк. Теперь всякий раз, когда кусок падает, вы регистрируете буквы в куске в массиве игрового поля.

Давайте предположим, что ваши части выглядеть следующим образом:

public class GamePience { 
    public Character letter; 
    public Color color; 
} 

Это дает

GamePience[][] gamefield = new GamePience [M][N]; // null is empty, otherwise gilled 

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

gamefield[0][2] = piece[0][0]; 

Теперь после письма есть место d и копируется в поле вы можете просто проверить по полю

boolean destroyedLine = false; 
do { 
for (int x = 0; x < gamefield.length; x++) { 
    for (int y = 0; y < gamefield[x].length; y++) { 
    GamePiece cur = gamefield[x][y]; 
    if (cur != null && x < MAX_FIELD_WIDTH && gamefield[x+1][y] != null) { 
     // there are gamepieces in both! 
     GamePiece neighbour = gamefield[x+1][y]; 
     if (cur.letter == neighbour.letter) { 
      destroyLine(x); // this method should null out the line and shift everything down, you'll probably want to loop trough the whole line first and check if there are pieces in every cell 
      destroyedLine = true; 
      break; 
     } 
    } 
    } 
} 
} while(destroyedLine); 

Вы также можете легко проверить против gamefield, а опускаясь части, чтобы проверить, если клетки уже заполнены. Теперь все, что вам нужно сделать, это заполнить эту логику и написать код для рисования игрового поля, и вы настроены;) (вы можете подумать об использовании LinkedList для игрового поля, потому что это делает удаление строк тривиальным)