Как я могу обнаружить прикосновение в cocos2d?
Я разрабатываю 2d игру для iPhone с использованием cocos2d.
Я использую много маленьких спрайтов (изображений) в моей игре. Я хочу коснуться двух одинаковых типов спрайтов (изображения), и тогда оба спрайта (изображения) будут скрыты.
Как я могу обнаружить касание в определенном спрайте (изображении)?
7 ответов
В вашем слое, который содержит ваш спрайт, вы должны сказать:
self.isTouchEnabled = YES;
тогда вы можете использовать те же события, которые вы использовали бы в UIView, но они названы немного по-другому:
- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
UITouch* touch = [touches anyObject];
//in your touchesEnded event, you would want to see if you touched
//down and then up inside the same place, and do your logic there.
}
Лучший способ сделать это - использовать ограничивающий прямоугольник на самом спрайте (который является CGRect). В этом примере кода я помещаю все свои спрайты в NSMutableArray и просто проверяю, находится ли касание спрайта в ограничительной рамке. Убедитесь, что вы включили обнаружение касания в init. Если вы заметили, я также принимаю / отклоняю прикосновения к слою, возвращая ДА (если я использую касание) или НЕТ (если я не делаю)
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint location = [self convertTouchToNodeSpace: touch];
for (CCSprite *station in _objectList)
{
if (CGRectContainsPoint(station.boundingBox, location))
{
DLog(@"Found sprite");
return YES;
}
}
return NO;
}
Следуя инструкциям Джонаса, и добавив к нему немного больше...
- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
UITouch* touch = [touches anyObject];
CGPoint location = [[[Director sharedDirector] convertCoordinate: touch.location];
CGRect particularSpriteRect = CGMakeRect(particularSprite.position.x, particularSprite.position.y, particularSprite.contentSize.width, particularSprite.contentSize.height);
if(CGRectContainsPoint(particularSpriteRect, location)) {
// particularSprite touched
return kEventHandled;
}
}
Возможно, вам придется немного изменить x/y a, чтобы учесть "центрированное позиционирование" в Cocos
@david, в вашем коде есть некоторые опечатки для cocos 0.7.3 и 2.2.1, в частности CGRectMake вместо CGMakeRect, и [touch location] теперь [touch locationInView:touch.view].
вот что я сделал:
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
CGRect myRect = CGRectMake(sprite.position.x, sprite.position.y, sprite.contentSize.width, sprite.contentSize.height);
if(CGRectContainsPoint(myRect, location)) {
// particularSprite touched
return kEventHandled;
}
}
@Genericrich: CGRectContainsPoint работает в CocosLand из-за вызова 2 строки выше:
[[Director sharedDirector] convertCoordinate:]
Объекты Cocos2D будут использовать систему координат OpenGL, где 0,0 - левый нижний угол, а координаты UIKit (например, где произошло касание) имеют 0,0 - левый верхний угол. convertCoordinate: делает переход от UIKit к OpenGL для вас.
Вот как это работает для меня... Где spriteSize, очевидно, размер спрайта...:P
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
CGRect myRect = CGRectMake(sprite.position.x-spriteSize/2, sprite.position.y-spriteSize/2, spriteSize, spriteSize);
if(CGRectContainsPoint(myRect, location)) {
// particularSprite touched
return kEventHandled;
}
}
Это хороший учебник, объясняющий основную сенсорную систему http://ganbarugames.com/2010/12/detecting-touch-events-in-cocos2d-iphone/
сначала напиши
self.isTouchEnabled = YES;
затем вам нужно реализовать функции ccTouchesEnded, ccTouchesBegan и т. д.
из того, что я понял, вы хотите иметь возможность "сопоставлять" два спрайта, которые могут находиться в разных координатах на экране.
метод для этого..: (я уверен, что есть много других методов)
рассмотреть возможность иметь 2 глобальные переменные.
поэтому каждый раз, когда касание касается спрайта, вы используете функцию CGRectContainsPoint, которая упоминалась несколько раз, чтобы найти, какой спрайт был затронут. затем вы можете сохранить "тег" этого спрайта в одной из глобальных переменных.
Вы делаете то же самое для второго касания, а затем сравниваете 2 глобальные переменные.
Вы должны быть в состоянии выяснить все остальное, но прокомментируйте, если у вас есть проблемы.