Использование касания, которое началось в одном слое, и предотвращение вызовов ccMoved (или touchesMoved) - PullRequest
1 голос
/ 17 декабря 2011

Использование Cocos2D для создания игры в стиле пулеметчика в адском стиле.Один палец тянет, чтобы переместить корабль, и в углу есть слои огня.

Из моего основного слоя я обнаруживаю ccTouchesBegan, ccTouchesMoved и ccTouchesEnded.Я передаю CGPoint в мой логический контроллер.

Если точка приземления находится внутри одного из 2 слоев «кнопки огня», я запускаю событие пожара.В противном случае я устанавливаю новое местоположение для игрока корабля.Когда касание перемещается за пределы области слоя огня, я устанавливаю новое местоположение для корабля игрока.

Проблема: перетаскивание пальца из слоя огня в пространство слоя без огня заставляет корабль прыгать к этомуточка из-за правила «сенсорный ход устанавливает местоположение игрока».

Как мне это лучше спроектировать?

Возможно, мне нужен массив «сенсорных объектов» и обнулять их при пересечении границыогненного слоя.Я чувствую, что здесь отсутствует какая-то важная концепция обработки касаний, которая, если бы ее поняли, дала бы нужный элемент управления без необходимости взламывать класс «сенсорных объектов», который сравнивает, где вы касаетесь массива местоположений.

Пожалуйста, сообщите.Спасибо!

(Да, я видел: Как ограничить обработку прикосновений одним слоем, когда слои перекрываются? . Это не отвечает на мой вопрос. RectContainsPoint - это то, как я определяю, касание линаходится внутри или вне слоя огня).

1 Ответ

1 голос
/ 17 декабря 2011

Можете ли вы установить флаг (BOOL ivar) в touchsBegan, чтобы указать, что касание началось в зоне пожара, и если этот флаг установлен, не двигаете корабль?Вы бы переустановили его при прикосновениях.

Звучит слишком просто, так что я, наверное, что-то упускаю.

Я действительно был.Для обработки мультитач вам понадобится массив, как вы догадались в вопросе - касания начались, если касание было в зоне огня, добавьте его в массив, а затем не позволяйте этому касанию впоследствии перемещать корабль.Удалить по касаниям закончилось.Я не вижу в этом ничего плохого или хакерского, за исключением этой заметки в документации UITouch:

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

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

...