2009-10-25 11 views
5

Ich arbeite an einem Spiel mit vielen Sprites in einer Schicht, und sobald Sie das Sprite berühren, wird es etwas tun.cocos2d in iphone z bestellen

mein Problem ist das Problem der Z-Reihenfolge, die meisten meiner Sprites sind überlappend und wenn Sie die überlappenden Sprites berühren, reagiert die eine hinter (ich denke mit der niedrigsten z-Reihenfolge) anstelle der vorderen.

Ich brauche mehr auf der z um cocos2d zu verstehen.

wie ändere ich die z um zur Laufzeit?

danke!

Antwort

2

Verwenden Sie den in 0,8 hinzugefügten Touch Dispatcher?

Ein Singleton, der Berührungen wie in v0.7.x (Standard) oder eine Berührung zu der Zeit (Targeted) versendet. Die Vorteile der Verwendung gezielter Berührungen bestehen darin, dass Sie nur die Ereignisse (beginnen, verschieben, beenden, stornieren) der von Ihnen beanspruchten Berührung erhalten. Durch die Verwendung von gezielten Berührungen wird der Code für die Touch-Bedienung sowohl bei Multi-Touch- als auch bei Single-Touch-Spielen vereinfacht. Sofern Sie keinen komplexen Touch-Code benötigen, wird die Verwendung von Targeted-Berührungen empfohlen.

Ein weiterer Vorteil des neuen TouchDispatcher ist, dass er eine Prioritätswarteschlange hat, sodass Sie die Position der Touch-Consumer ändern können.

Sie können die Prioritätswarteschlange verwenden, um zu erreichen, was Sie wollen. Sie können die Priorität für jeden Sprite festlegen, so dass Sie festlegen können, welche Sprites zuerst auf eine Berührung reagieren sollen und ob sie die Berührung weiterleiten oder nicht verschlucken sollen, so dass nichts anderes das Berührungsereignis erhalten wird.

Das Touches Testbeispiel im cocos2d Projekt ist wahrscheinlich der beste Ort zu suchen: http://code.google.com/p/cocos2d-iphone/source/browse/trunk/tests/TouchesTest (vor allem der Paddle.m Klasse)

Im onEnter Methode in der Sprite-Klasse Sie die Priorität des Touch-Dispatcher einstellen :

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

Delegierte mit höherer Priorität antworten vor denen mit niedriger Priorität.

+1

eigentlich: niedrigere Priorität wird die Berührung zuerst bekommen. 0 ist auch nicht der niedrigste, Sie können unter 0 gehen. Um Ihre Z-Reihenfolge für die Priorität zu verwenden, nehmen Sie einfach die Z-Reihenfolge * -1 als Priorität und die "höchste" Z-Reihenfolge wird die Berührung zuerst erhalten. – nash

5

Z Bestellung und das Touch-Handling-System sind getrennt. Z Bestellung ist nur für die visuelle Layout Ihrer Schichten. Das Touch-Handling-System hängt jedoch von der Priorität ab, die Ihnen zugewiesen wird, wenn Sie sich beim Touch-Dispatcher registrieren. Wenn Sie zwei Ebenen mit dem Touch-Dispatcher registrieren, die dieselbe Priorität haben, erhält die zweite Ebene die Berührungen zuerst, unabhängig von der Z-Reihenfolge der Ebenen.

Hier ist der Teil, der mich wirklich verwirrt, als ich das gleiche Problem hatte. Während Z Order höhere Zahlen optisch übereinander legt, ist es bei Berührungen genau das Gegenteil. LOWER-Priority-Nummern erhalten zuerst die Berührungen. Um meine eigene Gesundheit zu bewahren, habe ich meinen Code so umgestaltet, dass ich, wann immer möglich, Layer in der gleichen Reihenfolge wie der Z-Index hinzufügte, sodass sich die Berührungen der obersten Layer intuitiv verhalten würden.

Wenn dies nicht möglich ist, verwende ich das Touch-Prioritätssystem, und ich Konstanten definieren, so dass ich später nicht verwirrt.Zur Anmeldung für berührt das Prioritätssystem, verwenden Sie die folgenden Schritte aus:

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

}

0

Betrachten Sie es als Papierschichten. 1 steht über 0. 0 liegt irgendwo über -5. 16 ist über 14. Das ist alles, höhere Zahlen sind über niedrigere Zahlen, ob Sie negative Zahlen oder positive Zahlen verwenden.