2016-01-22 10 views
2

Ответ здесь был именно тем, что я искал, хорошим способом превратить плитку в актеров.Сложная карта для сцены2d актера на нескольких слоях

LibGDX: How to make tiled map tiles clickable?

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

Моя проблема прямо сейчас в том, что если я добавлю второй слой поверх моего основного слоя в плитке, он будет только «видеть» этот слой. Он отлично работает с одним слоем.

Редактировать: Оба слоя будут отображаться визуально, но я могу взаимодействовать только с верхним слоем. Лучше всего было бы, если бы я мог игнорировать мой верхний слой при создании актеров, потому что в основном это будет использоваться для прозрачной плитки и тому подобного.

ответ

1

Возможно, если вы разместите двух актеров друг над другом, клики мыши будут только доходить до самого верхнего? В этом случае вам нужно только создать один слой актеров (или даже только одного актера для всей вашей карты), а затем в его clicked переопределить, выяснить, какой фрагмент/слой вы хотите иметь дело.

+0

Вы должны быть в состоянии позволить щелкните проход, но я не уверен, как изменить clickListener, чтобы сделать это, так как он ничего не возвращает. Другие слушатели возвращают true/false в зависимости от того, был ли обработан щелчок и он должен остановиться или перейти на следующий уровень. – sistergodiva

+0

Возможно, вы можете сделать это, внедрив 'InputListener' вместо' ClickListener'. Вы теряете удобство, но получаете некоторый контроль. Я не знаю, будет ли это работать. Во всяком случае, наличие только одного обработчика кликов и вычисление координат плитки из местоположения клика должно быть еще немного быстрее. –

0

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

+0

System.out.println (нажата клавиша actor.cell +. "+ Actor.cell.getTile(). GetId()); дает null, если я нажимаю плитки на нижнем слое.Я проверил отладку, и кажется, что, по крайней мере, создать вдвое больше актеров, если я добавлю второй слой, так что кажется, что это по крайней мере так. – sistergodiva

1

На основе этого примера статьи (LibGDX: How to make tiled map tiles clickable?) вы могли бы сделать одно из следующих действий:

1) Заставить все ваши клетки верхнего слоя использовать IgnoreTileListener (описан ниже)

2) Предполагая, что вы 'используя статическую карту плитки или в противном случае можно добавить поле к вашему элементу ячейки плитки, добавьте логическое поле с именем «ignored», а затем, когда вызывается TiledMapStage.createActorsForLayer(), проверьте, не заблокирована ли ячейка, и используйте это, чтобы определить, вы проводите свой актер с помощью IgnoreTileListener или существующего TiledMapClickListener

«IgnoreTileListener» может быть либо InputListener, либо ClickListener, ваш выбор, но вы будете переопределять touchDown() в IgnoreTileListener, чтобы вы могли заставить это возвращать false, оставляя событие необработанным, чтобы ваш желаемый актер мог слушать событие.

В любом случае, вы эффективно используете InputListener, так как ClickListener наследует от InputListener в любом случае.

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/utils/ClickListener.html

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