Проблема с cocos2D для iPhone и обнаружение касания
Я просто не понимаю.
Я использую cocos2d для разработки небольшой игры на iPhone/Pod. Рамка просто великолепна, но я не сработал при обнаружении касания. Я прочитал, что вам просто нужно перезаписать правильные функции (например, "touchhesBegan" ) в реализации класса, подклассы CocosNode. Но это не сработает. Что я могу сделать неправильно?
функция:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{NSLog(@"tickle, hihi!");}
Я понял, что это абсолютно неправильно?
Спасибо!
Ответы
Ответ 1
Слой - единственный класс cocos2d, который получает касания.
Хитрость заключается в том, что ВСЕ экземпляры Layer передают события касания друг за другом, поэтому ваш код должен справиться с этим.
Я сделал это вот так:
-(BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
CGPoint cLoc = [[Director sharedDirector] convertCoordinate: location];
float labelX = self.position.x - HALF_WIDTH;
float labelY = self.position.y - HALF_WIDTH;
float labelXWidth = labelX + WIDTH;
float labelYHeight = labelY + WIDTH;
if( labelX < cLoc.x &&
labelY < cLoc.y &&
labelXWidth > cLoc.x &&
labelYHeight > cLoc.y){
NSLog(@"WE ARE TOUCHED AND I AM A %@", self.labelString);
return kEventHandled;
} else {
return kEventIgnored;
}
}
Обратите внимание, что библиотека cocos2d имеет реализацию ccTouchesEnded, а не стандарт Apple. Он позволяет вернуть BOOL, указывающий, обрабатывали ли вы событие.
Удачи!
Ответ 2
Вы добавили это в свой метод init?
// isTouchEnabled is an property of Layer (the super class).
// When it is YES, then the touches will be enabled
self.isTouchEnabled = YES;
// isAccelerometerEnabled is property of Layer (the super class).
// When it is YES, then the accelerometer will be enabled
self.isAccelerometerEnabled = YES;
Ответ 3
Чтобы обнаружить штрихи, вам нужно подклассы из UIResponder (что делает UIView). Я не знаком с cocos2D, но быстрый просмотр документации показывает, что CocosNode не является результатом UIResponder.
После дальнейшего изучения, похоже, что люди Cocos создали класс Layer, который происходит от CocosNode. И этот класс реализует обработчики событий касания. Но это префикс cc.
См. http://code.google.com/p/cocos2d-iphone/source/browse/trunk/cocos2d/Layer.h
Также см. код menu.m и приведенную ниже статью в блоге для получения дополнительной информации:
http://blog.sapusmedia.com/2008/12/cocos2d-propagating-touch-events.html
Ответ 4
maw, элементы структуры CGPoint x, y являются поплавками. используйте @ "% f" для форматирования float для printf/NSLog.
Ответ 5
Если вы используете 0.9 beta of cocos2D, у него действительно простое сенсорное обнаружение для CocosNodes. Настоящая красота этого нового обнаружения заключается в том, что он отлично справляется с несколькими сенсорными дорожками.
Пример этого можно найти здесь
http://code.google.com/p/cocos2d-iphone/source/browse/#svn/trunk/tests/TouchesTest
Ответ 6
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//Add a new body/atlas sprite at the touched location
CGPoint tapPosition;
for( UITouch *touch in touches ) {
CGPoint location = [touch locationInView: [touch view]];
tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]]; // get the tapped position
}
}
Думаю, это может помочь вам....
Ответ 7
-Сделать свою сцену в соответствии с протоколом CCTargetedTouchDelegate
-Добавить эту строку в init
вашей сцены:
[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];
-Используйте следующие функции:
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
return YES;
}
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
//here touch is ended
}