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

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

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

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

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

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

Пожалуйста, порекомендуйте. Благодарность!

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

1
quantumpotato 17 Дек 2011 в 11:20

1 ответ

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

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

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

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

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

1
jrturton 17 Дек 2011 в 12:16
Я устанавливаю BOOL iVar для касаний не в области огня, чтобы предотвратить касания, которые начали деформироваться, если вы нажмете второй раз в области «перемещения». Ваше решение не работает, потому что я хочу, чтобы игрок мог одновременно двигаться и стрелять. Если я помечу ивар от попадания в огонь, а затем мой основной палец двигается, ничего не произойдет. (Спасибо за быстрый ответ)
 – 
quantumpotato
17 Дек 2011 в 11:53
Так что же должно произойти, когда игрок приземлится в зоне огня и вытащится из нее? Вы хотите, чтобы это конкретное прикосновение игнорировалось, но при этом позволяли дальнейшим прикосновениям работать для перемещения корабля? (Я сказал, что чего-то не хватает — это что-то мультисенсорное?)
 – 
jrturton
17 Дек 2011 в 12:07
Да, точно! Я задал более простую версию этого вопроса здесь: для последующих касаний при подсчете касаний началось общее количество"> stackoverflow.com/questions/8543473/… На самом деле .. там может быть сложнее, поскольку нет нескольких слоев. (отмечу, если будет универсальный ответ)
 – 
quantumpotato
17 Дек 2011 в 19:49
Я думаю, что может быть способ не просто «игнорировать» прикосновение (и, возможно, удалить из массива, а затем, если touchesMoved недостаточно близко к прикосновению в массиве, игнорировать его - будет работать). Игнорировать таким образом, чтобы ccTouchesMoved никогда не вызывался на слое движения, если он начался на слое огня. Как и в UITableView: перетаскивание с навигационного контроллера вниз в табличное представление, а затем обратно не приведет к прокрутке табличного представления.
 – 
quantumpotato
17 Дек 2011 в 19:53
Перечитай свой пост - у меня копия CGPoint держалась от тача вместо тача. Если бы я мог добавить UITouch в локальный массив, это имело бы смысл. Но если я не могу сохранить напрямую, похоже, мне нужен массив. Я буду экспериментировать.
 – 
quantumpotato
19 Дек 2011 в 19:24