Использование Cocos2D для создания игры в стиле «стреляй-в-эм-ап». Проведите одним пальцем, чтобы переместить корабль, а в углу есть слои огня.
Из моего основного слоя я обнаруживаю ccTouchesBegan, ccTouchesMoved и ccTouchesEnded. Я передаю CGPoint в свой логический контроллер.
Если точка касания находится внутри одного из двух слоев «кнопки огня», я запускаю событие огня. В противном случае я устанавливаю новое местоположение для корабля игрока. Когда касание перемещается за пределы области огненного слоя, я устанавливаю новое местоположение для корабля игрока.
Проблема: Перетаскивание пальца из слоя огня в пространство, не относящееся к огню, приводит к тому, что корабль прыгает в эту точку из-за правила «касание перемещает положение игрока».
Как я могу спроектировать это лучше?
Возможно, мне нужен массив «осязаемых объектов» и обнуление их при пересечении границы огненного слоя. Я чувствую, что мне не хватает какой-то важной концепции обработки касаний, которая, если ее понять, дала бы нужный мне контроль без необходимости взломать класс «сенсорный объект», который сравнивает, где вы нажимаете, с массивом местоположений.
Пожалуйста, порекомендуйте. Благодарность!
(Да, я видел: Как сделать Я ограничиваю обработку касания одним слоем, когда слои перекрываются?. Это не отвечает на мой вопрос. rectContainsPoint — это то, как я определяю, находится ли касание внутри или вне слоя огня).
1 ответ
Можно ли установить флаг (BOOL ivar) в touchesBegan для индикации того, что касание началось в районе пожара, и если этот флаг установлен, то не двигать корабль? Вы бы переустановили его на touchesEnded.
Это звучит слишком просто, поэтому я, вероятно, что-то упускаю.
Я действительно был. Для обработки мультитач вам понадобится массив, как вы догадываетесь в вопросе - при касании началось, если касание было в зоне огня, добавьте его в массив, а затем не позволяйте этому касанию впоследствии перемещать корабль. Удаление по касаниям закончилось. Я не вижу в этом ничего неправильного или хакерского, за исключением этой заметки в документах UITouch:
Объект UITouch является постоянным на протяжении всей последовательности мультитач. Вы никогда не должны сохранять объект UITouch при обработке события. Если вам нужно сохранить информацию о касании от одной фазы к другой, вам следует скопировать эту информацию из объекта UITouch.
Но настойчивость, кажется, поддерживает то, что вы хотите сделать. Я не знаю, используется ли другой класс в cocos2d, но принцип остается прежним.
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.