2014-01-29 1 views
5

Я пытаюсь создать простую настольную игру с помощью libGDX. Просто у вас есть приблизительное представление о том, что я пытаюсь сделать, представьте Bejeweled (хотя мой, конечно, не такой сложный).libGDX: Создать сетку для настольной игры

Игра включает в себя доску с ячейками в виде квадратов. В зависимости от уровня эта сетка имеет различное количество ячеек, например 6x6 или 8x8. Я также хочу включить некоторую приятную анимацию для переключения положения двух соседних ячеек (например, в Bejeweled). Конечно, на экране также должны быть несколько кнопок.

Мой вопрос: что является лучшим способом для этого? Должен ли я использовать сцену, а затем таблицы для сетки? Могу ли я тогда легко сделать анимацию (используя Universal Tween Engine)? Или лучше ли рисовать спрайты по отдельности? Или есть другой совершенно другой способ приблизиться к этому?

Спасибо за ваши ответы,

Приветствия,

Тони

ответ

5
Sprite square = new Sprite(new Texture("texture")); 

Рендер

float squareWidth = camera.viewportWidth/squaresOnWidth; 
float squareHeight = camera.viewportHeight/squaresOnHeight; 
square.setWidth(squareWidth); 
square.setHeight(squareHeight); 
batch.begin(); ` 
for(int y = 0; y < squaresOnHeight; y++){ 
    for(int x = 0; x < squaresOnWidth; x++){ 
     square.setX(x * squareWidth); 
     square.setY(y * squareHeight); 
     square.draw(batch); 
    } 
} 
batch.end(); 

Это должен выводить сетку текстур, не тестируются.

Если вы хотите создать плавную анимацию вы должны обязательно посмотреть в UniveralTweenEngine, вот демо, что он может сделать: http://www.aurelienribon.com/universal-tween-engine/gwt/demo.html

Если вы хотите сетку кнопки вместо.

OrthoGraphicCamera camera = new OrthoGraphicCamera(); 
camera.setToOrtho(false, yourViewportWidth, yourViewportHeight); 
camera.translate(xPos, yPos); 
Stage stage = new Stage(your wanted stage width, your wanted stage height, false, batch); 
stage.setCamera(camera); 
for(int y = 0; y < buttonsOnHeight; y++){ 
    for(int x = 0; x < buttonsOnWidth; x++){ 
     stage.addActor(new TextButton("" + x + y * buttonsOnWidth, textButtonStyle); 
    } 
} 

рендер

float buttonWidth = camera.viewportWidth/buttonsOnWidth; 
float buttonHeight = camera.viewportHeight/buttonsOnHeight; 
for(int y = 0; y < buttonsOnHeight; y++){ 
    for(int x = 0; x < buttonsOnWidth; x++){ 
     TextButton button = stage.getActors().get(x + y * buttonsOnWidth); 
     button.setX(x * buttonWidth); 
     button.setY(y * buttonHeight); 
     button.setWidth(buttonWidth); 
     button.setHeight(buttonHeight); 
    } 
} 

Затем нарисуйте сцену, обратите внимание, что вы должны прекратить любую партию, которая в настоящее время работает, потому что этап имеет собственный batch.begin() и batch.end(). Вы можете запустить свою партию снова после stage.draw();

stage.act(delta); 
stage.draw(); 
+0

Хорошо, так что вы не используете сцену. Но как добавить кнопки без сцены? Или можно создать сцену, которая охватывает только части экрана? – tomet

+0

Ответ отредактирован, это вы имеете в виду? – thetheodor

+0

Спасибо за ваши усилия. Я хочу как сетку из Sprites, так и некоторые кнопки ниже. Поэтому мне нужно как-то отобразить. – tomet

0

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

OrthographicCamera cam = new OrthographicCamera(8,8); 

Вы говорите камеру, чтобы иметь видовой экран 8 х и 8 у. Точка (0,0) камеры находится посередине экрана.

Чтобы иметь его в левом нижнем углу вы должны установить свою позицию в

cam.translate(camWidth/2, camHeight/2); 

Теперь вы можете добавить свои sqares в sqare.setX(0) для sqares в нижней строке или sqare.setY(3), чтобы добавить его на 4-й строке слева направо. Для анимаций вы также можете использовать Actions, что позволит вам добавлять разные движения к актеру и позволять ему выполнять их с течением времени. Пример:

actor.addAction(Actions.parallel(Actions.moveTo(float x, float y, float duration), Actions.rotateTo(float rotation, float duration))); 

С помощью этого образца кода вы говорите ваш актер, чтобы перейти от своей позиции в (x,y) в duration секунд и в то время как он перемещается в это положение, он поворачивается от своего текущего вращения на rotation в duration секунд. Надеюсь, это поможет

+0

нет вызова метода setPosition, он называется translate и делает то же самое. Кроме того, instad вручную устанавливает камеру на 0, 0, вы можете вызвать setToOrtho(); – thetheodor

+0

Положение камер 0/0 по умолчанию, насколько я знаю.Это на самом деле только псевдокод, чтобы позволить peaople знать, как это работает. Я не помню точных имен методов, Eclipse помогает мне много: P Спасибо за ваш комментарий, я отредактирую свой ответ! – Springrbua

+0

Eclipse does очень помогли, пришлось проверить код там до публикации!: D – thetheodor