Перевод Уроков По Libgdx — Часть 3 (Пакет Scene2D)

Это третья статья в серии переводов руководств по libGDX. Первая статья Здесь Вторая статья Здесь



сцена2d

Пакет Scene2d предоставляет классы для реализации графа для 2D-сцены, что может быть полезно для управления группой иерархически связанных актеров.

Этот пакет обеспечивает поддержку управления управлением, вращением и масштабированием актеров в системе координат относительно родительского актера.

Этот пакет также предоставляет основу для управления действиями актеров через определенные промежутки времени (анимация).

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



Важные занятия из пакета

Класс Stage имеет «корневую» группу, куда приложение может добавлять своих актеров.

Класс Stage имеет собственную камеру и собственный упаковщик спрайтов (SpriteBatch).

Область обзора камеры устанавливается в соответствии с размером экрана.

При визуализации класса Stage SpriteBatch визуализирует корневую группу.

Однако Stage реализует интерфейс InputProcessor и отправляет входные события в корневую группу.

Класс Group — это актер, который может содержать других актеров.

Ротация и масштабирование Группы соответствующим образом отражаются на ее дочерних участниках.

Класс Group делегирует события рисования и ввода соответствующим дочерним актерам.

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

Он имеет положение, размер, информацию о масштабе, вращении, родительском компоненте (начале).

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



Настройка класса Stage

Класс Stage имеет область просмотра.

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

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

Если для этого параметра установлено значение true, класс Stage будет растягивать (сжимать) изображение по размеру экрана при рендеринге, если размер экрана не соответствует размеру области просмотра Stage. Если этот параметр имеет значение false, размер области просмотра сцены будет обрезан в соответствии с разрешением экрана.

Если область просмотра настраивается в методе resize(), значение этого параметра не имеет значения.

В классе Stage есть метод act, который считывает время, прошедшее с момента отрисовки последнего кадра.

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

Вызов метода act в классе Stage не является обязательным.

  
  
  
  
   

private Stage stage; public void create () { stage = new Stage(0, 0, true); } public void resize (int width, int height) { stage.setViewport(width, height, true); } public void render () { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); stage.act(Gdx.graphics.getDeltaTime()); stage.draw(); } public void dispose() { stage.dispose(); }



Актеры

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



Рисунок
Когда вызывается метод рисования класса Stage, он вызывает метод рисования корневой группы.

В свою очередь, корневая группа вызывает методы рисования дочерних актеров.

Чтобы нарисовать актера, реализуйте метод draw():

TextureRegion region; public void draw (SpriteBatch batch, float parentAlpha) { batch.setColor(1, 1, 1, parentAlpha); batch.draw(region, x, y, width, height); }

SpriteBatch, который получает актера, уже настроенного родительским актером (корневой группой), для правильного отображения актера относительно нижнего левого угла корневой группы.

Это такие параметры, как расположение актера, его размер, информация о масштабировании, вращении.

Это позволяет очень легко нарисовать актера в нужном месте.

В приведенном выше коде параметры x, y, width, height являются открытыми полями класса Actor. Если для конкретного актера для параметраvisible установлено значение false, корневая группа не будет вызывать для него метод draw().

Параметр ParentAlpha, передаваемый методу draw(), представляет собой значение прозрачности цвета родительского компонента.

Учитывая эту настройку, корневая группа и дочерние актеры могут быть полупрозрачными (полупрозрачными).

Метод Begin() класса SpriteBatch уже вызывается, когда метод draw() вызывается для конкретного актера.

Если актеру необходимо отрисовать себя каким-либо другим способом, например, с помощью класса ShapeRenderer, класс SpriteBatch должен завершить работу и снова начать упаковку спрайтов (необходимо вызвать методы Begin() и End()).

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

Вы можете использовать матрицу проекции и матрицу преобразования из класса SpriteBatch:

private ShapeRenderer renderer; public void draw (SpriteBatch batch, float parentAlpha) { batch.end(); renderer.setProjectionMatrix(batch.getProjectionMatrix()); renderer.setTransformMatrix(batch.getTransformMatrix()); renderer.translate(x, y, 0); renderer.begin(ShapeType.Rectangle); renderer.rect(0, 0, width, height); renderer.end(); batch.begin(); }



Нажмите Обнаружение

Когда вы вызываете метод hit() класса Stage(), он вызывает метод hit() корневой группы.

Корневая группа вызывает метод hit() для своих дочерних акторов.

Первое возвращаемое значение типа Actor будет результатом возврата класса Stage. (То есть мы спускаемся по иерархии актеров, и как только какой-либо актер «думает», что его кликнули, он возвращается сам, а класс Stage возвращает этого актера.

— прим.

переводчика).

Чтобы перехватывать клики, реализуйте метод hit() для актера:

public Actor hit (float x, float y) { return x > 0 && x < width && y > 0 && y < height ? this : null; }

Метод hit() возвращает актера, по которому щелкнули, или значение NULL в противном случае.

Координаты берутся относительно системы координат актера.

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



Обработка событий касания

Для управления элементом управления реализуйте методы touchDown(), touchDragged() и touchUp():

public boolean touchDown (float x, float y, int pointer) { return true; } public void touchDragged (float x, float y, int pointer) { } public void touchUp (float x, float y, int pointer) { }

Когда метод touchDown() вызывается в классе Stage, вызывается метод touchDown() в корневой группе.

Корневая группа вызывает метод hit() для своих дочерних акторов.

Метод touchDown() вызывается для первого актера, который возвращается методом hit().

Если вызов touchDown() для этого актера возвращает false, это означает, что актер игнорирует событие, и процесс продолжается для следующего актера.

Если touchDown() возвращает true, актер получает фокус ввода.

Это значит, что на нем вызываются методы touchDragged() и touchUp(), если конечно он их не игнорирует. Когда touchUp() вызывается у актера, что гарантированно произойдет, актер теряет фокус ввода.

Метод touchDown() класса Group отправляет сообщения touchDown дочерним актерам.

Если этот метод переопределен, необходимо вызвать базовый метод super().

touchDown(), иначе актеры не получат никаких событий касания.

Также есть еще один дополнительный метод обработки кликов, который можно переопределить, это метод touchMoved().

Его можно вызвать только на настольном ПК, и он вызывается при перемещении мыши.

Подобно методу hit(), координаты, передаваемые методам обработчика управления, задаются в системе координат актера.

Если для сенсорного поля для актера установлено значение false, класс Group не будет вызывать методы для обработки управления для этого актера.

Чтобы управлять управлением с клавиатуры, которое возможно только на настольном ПК, переопределите методы keyDown(), keyUp и keyTyped().

Их можно вызвать только тогда, когда актер получает фокус клавиатуры.

Этот фокус можно получить и сбросить, вызвав метод KeyboardFocus() класса Stage. Чтобы обрабатывать прокрутку мыши, которая может происходить только на настольном ПК, переопределите метод прокрутки().

Он будет вызываться только тогда, когда у актера есть фокус прокрутки.

Установка и сброс этого фокуса выполняется методом ScrollFocus класса Stage. Добавление: проект с примером Теги: #libgdx #java #Android #java #разработка Android

Вместе с данным постом часто просматривают: