cocos2d в порядке iphone z

Я работаю над игрой со множеством спрайтов на слое, и как только вы коснетесь спрайта, он что-то сделает.

Моя проблема - это проблема с порядком z, большинство моих спрайтов перекрываются, и когда вы касаетесь перекрывающихся спрайтов, реагирует тот, что позади (я думаю, с самым низким порядком z), а не тот, который находится впереди.

Мне нужно больше узнать о порядке z для cocos2d.

как изменить порядок z во время выполнения?

Благодарность!


person sooon    schedule 25.10.2009    source источник


Ответы (3)


Z Заказ и сенсорная система управления раздельны. Z Order предназначен только для визуального макета ваших слоев. Однако сенсорная система обработки данных зависит от приоритета, назначаемого при регистрации в сенсорном диспетчере. Если вы зарегистрируете в диспетчере касаний два слоя с одинаковым приоритетом, то первым будет касаться второй слой, независимо от Z-порядка слоев.

Вот что действительно смутило меня, когда у меня была такая же проблема. В то время как Z Order помещает более высокие числа друг на друга визуально, с прикосновениями все наоборот. Номера с НИЖНИМ приоритетом на самом деле касаются первыми. Чтобы сохранить свое здравомыслие, я реорганизовал свой код так, чтобы по возможности я все равно добавлял слои в том же порядке, что и индекс Z, чтобы прикосновения к верхним слоям вели себя интуитивно.

Когда это невозможно, я использую систему приоритета касания и определяю константы, чтобы потом не запутаться. Для регистрации касаний по системе приоритета используйте следующее:

-(void) registerWithTouchDispatcher {
[[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: DEFAULT_TOUCH_PRIORITY swallowsTouches:YES];

}

person Chris Garrett    schedule 02.11.2009

Вы используете Touch Dispatcher, добавленный в 0.8?

Синглтон, который отправляет касания, как в v0.7.x (Стандартный), или одно касание за раз (Целевое). Преимущества использования целевых касаний заключаются в том, что вы получаете только события (начало, перемещение, конец, отмена) касания, на которое претендуете. Использование целевых касаний упрощает код обработки касаний как в играх с несколькими касаниями, так и в играх с одним касанием. Если вам не нужен сложный код обработки касаний, рекомендуется использовать Целевые касания.

Еще одним преимуществом нового TouchDispatcher является то, что он имеет очередь с приоритетом, поэтому вы можете изменять положение потребителей касания.

Вы можете использовать приоритетную очередь для выполнения того, что хотите. Вы можете установить приоритет для каждого спрайта, чтобы вы могли определить, какие спрайты должны реагировать на прикосновение первыми и должны ли они передавать касание или проглатывать его, чтобы после его обработки больше ничего не получило событие касания.

Пример Touches Test в проекте cocos2d, вероятно, лучше всего подходит для поиска: http://code.google.com/p/cocos2d-iphone/source/browse/trunk/tests/TouchesTest (особенно класс Paddle.m)

В методе onEnter вашего класса спрайтов вы можете установить приоритет диспетчера касаний:

- (void)onEnter
{
    [[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
    [super onEnter];
}

Делегаты с более высоким приоритетом ответят раньше делегатов с низким приоритетом.

person Jeffrey Vanneste    schedule 25.10.2009
comment
на самом деле: более низкий приоритет получит прикосновение первым. 0 тоже не самый низкий, вы можете опуститься ниже 0. Итак, чтобы использовать ваш Z-порядок для приоритета, просто возьмите Z-порядок * -1 в качестве приоритета, и самый высокий z-порядок получит касание первым. - person nash; 18.11.2009

думайте об этом как о слоях бумаги. 1 будет поверх 0. 0 где-то выше -5. 16 больше 14. Вот и все: более высокие числа стоят над более низкими числами, независимо от того, используете ли вы отрицательные числа или положительные числа.

person Gabriel    schedule 01.11.2011