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

Здесь вы как бы неправильно понимаете вещи,

Итак, допустим, у вас есть x: M[A] и f: A = N[B] для любых Monad, M и N, тогда x.flatMap(f) должно быть таким же, как x.map(f).flatten.

Но здесь у вас есть своего рода вложенная монада map: M[N[A]], и ваша функция - f: A => B с последующим псевдонимом,

scala> type MapWithStringKey[A] = Map[String, A]
// defined type alias MapWithStringKey

scala> type TupleOfInt = (Int, Int)
// defined type alias TupleOfInt

scala> val map: MapWithStringKey[List[TupleOfInt]] = Map("a" -> List(1 ->11,1->111), "b" -> List(2 -> 22, 2 ->222))
// map: MapWithStringKey[List[TupleOfInt]] = Map(a -> List((1,11), (1,111)), b -> List((2,22), (2,222)))

. Этот случай полностью отличается от упомянутого выше стандартного определения, связывающего [ 1110] до map и flatten.

Теперь, это только один из нестандартных случаев, когда вы можете выбрать любой из двух вариантов в зависимости от того, что вы хотите. И когда мы добавим специальные свойства уникальности ключа из Map (о чем мы уже говорили в ответе @ sepp2k), все становится еще более непредсказуемым.

12
задан Eimantas 1 January 2011 в 14:56
поделиться

5 ответов

Слой является единственным cocos2d классом, который получает касания.

Прием - то, что ВСЕ экземпляры Слоя передаются сенсорные события, один за другим, таким образом, Ваш код должен обработать это.

Я сделал это как это:

-(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, обработали ли Вы событие.

Удачи!

11
ответ дан 2 December 2019 в 05:56
поделиться

Для обнаружения касаний необходимо разделить на подклассы от UIResponder (который UIView делает также). Я не знаком с cocos2D, но беглый взгляд на документацию показывает, что CocosNode не происходит из UIResponder.

После дальнейшего расследования похоже, что люди Cocos создали класс Слоя, который происходит из 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

3
ответ дан 2 December 2019 в 05:56
поделиться

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

3
ответ дан 2 December 2019 в 05:56
поделиться

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

    // 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;
5
ответ дан 2 December 2019 в 05:56
поделиться

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

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

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

3
ответ дан 2 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: