Подтвердить что ты не робот

Проблема с cocos2D для iPhone и обнаружение касания

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

функция:

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

Я понял, что это абсолютно неправильно?

Спасибо!

4b9b3361

Ответ 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
  }