Проблема с cocos2D для iPhone и распознаванием касаний

Я просто не понимаю. Я использую cocos2d для разработки небольшой игры на iPhone / Pod. Фреймворк просто отличный, но я не могу определить касание. Я читал, что вам просто нужно перезаписать соответствующие функции (например, touchesBegan) в реализации класса, который является подклассом CocosNode. Но это не работает. Что я мог сделать не так?

функция:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{NSLog(@"tickle, hihi!");}

я понял это совершенно неправильно?


person Community    schedule 18.12.2008    source источник


Ответы (7)


Layer - единственный класс 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, указывающий, обработали ли вы событие.

Удачи!

person Genericrich    schedule 19.12.2008
comment
вы можете сделать так, чтобы любой класс CCNode получил прикосновения! Используйте, например: [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate: собственный приоритет: 0 swallowsTouches: NO]; - person LearnCocos2D; 21.09.2010
comment
класс должен реализовывать один из двух протоколов TouchDelegate - person LearnCocos2D; 21.09.2010

Вы добавили это в свой метод инициализации слоев?

    // 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;
person jjxtra    schedule 12.09.2009

Чтобы обнаруживать прикосновения, вам необходимо создать подкласс от 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

person keremk    schedule 18.12.2008

maw, элементы структуры CGPoint x, y являются числами с плавающей запятой. используйте @ "% f" для форматирования чисел с плавающей запятой для printf / NSLog.

person Community    schedule 01.01.2009

Если вы используете бета-версию cocos2D 0.9, у нее действительно простое обнаружение касаний для CocosNodes. Настоящая прелесть этого нового обнаружения в том, что оно очень хорошо обрабатывает отслеживание нескольких касаний.

Пример этого можно найти здесь

http://code.google.com/p/cocos2d-iphone/source/browse/#svn/trunk/tests/TouchesTest

person Damo    schedule 27.01.2010

- (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





    }
}

думаю, это может вам помочь ....

person Rony    schedule 27.04.2011

-Сделайте вашу сцену соответствующей протоколу 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
  }
person Hossam Ghareeb    schedule 17.03.2013