Как избежать использования instanceOf в этом случае? (разрешить щелкать только по некоторым объектам в дереве квадрантов)

У меня есть куча объектов Tank, вставленных в дерево квадроциклов. На некоторые из этих объектов резервуара можно щелкнуть, если они реализуют интерактивный интерфейс. Проблема в том, что для того, чтобы узнать, что щелкнули, мне нужно запросить одно и то же дерево квадрантов, но в нем есть как кликабельные, так и не кликабельные объекты.

Возможные решения:

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

  2. Я мог поддерживать ДВА дерева квадроциклов. один только для танков и один для интерактивных объектов. Но тогда мне, возможно, придется обновить резервуары, которые реализуют интерактивный интерфейс ДВАЖДЫ, поскольку они будут находиться в двух отдельных квадрантах, что будет медленно, учитывая, что мне нужно обновлять каждый шаг, а люди только время от времени щелкают по экрану.

  3. Я мог только вставлять интерактивные объекты в дерево квадрантов и просто заставлять неактивные объекты определять методы фиктивного клика. Это решило бы проблему, но это не кажется правильным, потому что если что-то не кликабельно, то для начала не следует реализовывать методы щелчка, даже если это пустой. Или это нормально?

Я думаю, что № 3, вероятно, лучший способ сделать это, но я не уверен. Любые указатели?

РЕДАКТИРОВАТЬ: Теперь, когда я думаю об этом, # 3 будет иметь некоторые проблемы с перекрывающимися кликами. Если неактивный резервуар перекрывает интерактивный, и я щелкаю в разделе перекрытия, если я не вызову все методы щелчка для всего в этой точке, я могу в конечном итоге вызвать метод щелчка неправильного резервуара. Чтобы избежать ЭТОГО, мне пришлось бы использовать instanceOf и найти объект, на который можно щелкнуть, и вызвать только метод ITS click.

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

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


person Tiby312    schedule 25.06.2013    source источник


Ответы (1)


№3 звучит неплохо. Возможно, вы могли бы улучшить его, создав другой интерфейс, который реализуют ВСЕ ваши объекты, например «GameObject», который имеет метод «isClickable». Затем вы можете сделать так, чтобы ваши интерактивные объекты реализовали «возврат true» для isClickable.

person faffaffaff    schedule 25.06.2013
comment
Да, № 3 звучит хорошо, но мне пришло в голову, что с перекрытием могут возникнуть проблемы. подробности см. в моем редактировании. Теперь я думаю № 2, но это медленно. - person Tiby312; 25.06.2013