#objective-c #cocos2d-iphone #touch #sigabrt
#цель-c #cocos2d-iphone #коснитесь #sigabrt #objective-c
Вопрос:
В настоящее время я создаю приложение, в котором пытаюсь определить положение касания пользователя.
Я перешел с ccTouchBegan на ccTouchesBegan в процессе реализации функции «определение положения касания».
Но я не могу заставить его работать. Я перешел с ccTouchBegan на ccTouchesBegan:
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
вместо того, чтобы использовать:
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
Когда я сделал это, все это вылетает, когда я нажимаю на экран. Генерация ошибки SIGABRT с подсветкой:
#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
NSAssert(NO, @"Layer#ccTouchBegan override me");
return YES;
}
#endif
@end
Итак, мои вопросы таковы:
Как вы думаете, почему он выходит из строя?
В чем разница между ccTouchBegan и ccTouchesBegan? Возможности мультитач?
Для получения дополнительной помощи, это мой код:
-(id) init
{
if( (self=[super init])) {
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
self.isTouchEnabled = YES;
// Set up background
background = [CCSprite spriteWithFile:@"Image.png"];
background.scaleX = 1;
background.scaleY = 1;
background.position = ccp(0,0);
[self addChild:background];
[[CCTouchDispatcher sharedDispatcher]addTargetedDelegate:self
priority:0
swallowsTouches:YES];
// Preload sound effect
soundFile = [SimpleAudioEngine sharedEngine];
if (soundFile != nil) {
[soundFile preloadBackgroundMusic:@"sound.wav"];
}
}
return self;
}
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
NSLog(@"ccTouchesBegan");
// Sets the sound variable to YES
ifOne = YES;
prevPos = [touch locationInView:[touch self]];
prevPos = [[CCDirector sharedDirector] convertToGL:[touch locationInView:touch.self]];
[self schedule:@selector(timerUpdate:) interval:0.1];
//return YES;
}
Ответ №1:
Это приятная функция в cocos2d, которая позволяет проглатывать касания в тех случаях, когда требуется обработать только одно событие касания.
Попробуйте добавить эту функцию в свой класс:
- (void) registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MIN 1 swallowsTouches:YES];
}
Комментарии:
1. Не забывайте, что вам придется удалить self как делегата касания, и вы должны сделать это в -(void) cleanup; метод, потому что диспетчер касания может сохранить экземпляр self.
Ответ №2:
- ccTouchesBegan происходит в ту секунду, когда вы касаетесь экрана
- ccTouchesEnded происходит в ту секунду, когда вы отпускаете после нажатия на экран
и вместо
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
instead of using:
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
попробуйте использовать
-(void)ccTouchesBegan:(UITouch *)...
или
-(void)ccTouchesBegan:(NSSet *)...
или
-(BOOL)ccTouchesBegan:(NSSet *)...
ваша проблема может быть просто в недопустимых типах данных или в какой-то подобной ерунде, мой совет — просто попробуйте переключить типы касаний.
Я бы дал больше информации, но вы не предоставили много информации для работы, так что это лучшее, что я могу сделать.