Проблема с cocos2D для iPhone и сенсорным обнаружением - PullRequest
12 голосов
/ 18 декабря 2008

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

функция:

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

я правильно понял?

Спасибо!

Ответы [ 7 ]

11 голосов
/ 19 декабря 2008

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

Удачи!

5 голосов
/ 13 сентября 2009

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

    // 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 голосов
/ 27 января 2010

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

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

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

3 голосов
/ 01 января 2009

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

3 голосов
/ 19 декабря 2008

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

1 голос
/ 27 апреля 2011
- (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





    }
}

думаю, это поможет тебе ...

0 голосов
/ 17 марта 2013

-Проверьте, чтобы ваша сцена соответствовала протоколу 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
  }
...