FAQ: cocos2d for iPhone: How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code) Comments Feed" href="http://www.learn-cocos2d.com/knowledge-base/cocos2d-iphone-faq/feed/"/>

Häufig gestellte Fragen: cocos2d für das I-Phone: Wie man einen springenden Kasten einer Elfe / Begrenzendes Rechteck bekommt? (mit dem Code)

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)

Suchen Sie meinen cocos2d für häufig gestellte I-Phone-Fragen & Tutorenkurse

Bemerken Sie bitte, dass die Blog-Suche an der oberen richtigen Ecke meine häufig gestellten Fragen und Tutorenkurse nicht sucht.
 

  • Bemerken Sie: Teilen Sie bitte direkte Download-Verbindungen zu PDF Dateien nicht, die Download-Verbindungen laufen nach einem Paar Minuten ab!

cocos2d hat eine Methode nicht, die einen springenden Kasten einer Elfe oder das Springen des Rechtecks zurückgibt. Sie können einen CGRect leicht schaffen, indem Sie den contentsize der Elfe verwenden. Aber und wenn der anchorpoint nicht am Zentrum ist, oder die Elfe erklettert wird? Wir werden eine CCSpriteExtension Kategorie schreiben, die das bedecken wird. But what if the anchorpoint isn't at the center, or the sprite is scaled? We'll write a CCSpriteExtension category which will cover that.

Download-Lehre PDF

BEMERKEN SIE: Verwenden Sie die boundingBox Methode von CCNODE stattdessen

Als ich dem schrieb, war ich nicht bewusst, dass CCNode - (CGRect) boundingBox Methode hat. Ich verlasse diese Annäherung hier, weil sie illustriert, wie man cocos2d mit nützlichen Methoden erweitert, indem man Objektive-C Kategorien verwendet.

CCSpriteExtension Kategorie

Schaffen Sie eine neue Objektive-C Klasse sowohl mit.h als auch mit.m Dateien und nennen Sie die Klasse CCSpriteExtension.

CCSpriteExtension Schnittstelle

Die Kopfball-Datei wird ein bisschen verschieden sein als regelmäßige Kopfbälle, weil wir nur eine Objektive-C Kategorie definieren. Eine Objektive-C Kategorie erlaubt Ihnen, Methoden (aber nicht Mitglied-Variablen) zu einer vorhandenen Klasse hinzuzufügen. Es ist eine große Weise, sich auf dem Code und der API von anderen wie der cocos2d Motor auszustrecken, ohne ihren Quellcode ändern zu müssen. It's a great way to extend on code and API of others such as the cocos2d engine, without having to change their source code.

Bemerken Sie, dass ich den @interface CCSprite genau wie die cocos2d Klasse nannte. Aber ihm wird von einem in Klammern Schlüsselwort gefolgt. Diese sind, für die Kategorie zu nennen, und Sie sind frei, sie jeden Weg zu nennen, wie Sie wollen. Ohne die Klammern würden Sie sehen kompilieren Fehler, der sich über eine zweite Definition der Klasse CCSprite beklagt. Ich entschied, dass ich es gerade "Erweiterungen" nenne. These are for naming the category and you are free to name them any way you want. Without the brackets you would see compile error complaining about a second definition of the class CCSprite. I decided i just call it "extensions".

Da eine Kategorie nicht hinzufügen kann, dass Mitglied-Variablen zu einer vorhandenen Klasse sicherstellen, dass es keine Öffnung und das Schließen lockiger Klammern gibt. Wir können nur neue Methoden und den einzigen definieren, den wir hinzufügen, ist - (CGRect) getBoundingRect;

CCSpriteExtension Durchführung

Dem @implementation wird auch von den Klammern mit dem Namen der Kategorie gefolgt und wird auch CCSprite genannt.

Wir müssen nur diese Methode durchführen. Zuallererst bekommen wir den contentSize der Elfe, der die Breite und Höhe der Textur der Elfe ist. Da die Elfe erklettert werden kann und sich das ändern würde, begrenzt sie Rechteck wir müssen dafür verantwortlich sein, indem wir Breite und Höhe mit scaleX_ und scaleY_ beziehungsweise multiplizieren. Wir enden mit der Größe, die die schuppige Größe der Elfe ist. Since the sprite can be scaled and that would change it's bounding rectangle we have to account for that by multiplying width and height with scaleX_ and scaleY_ respectively. We end up with size being the scaled size of the sprite.

So weit, so gut, aber müssen wir auch in Betracht ziehen, dass der anchorPoint am Zentrum der Elfe und so dem Zentrum des Rechtecks nicht sein könnte. Sie könnten denselben Code, aber sich einfach teilende Größe durch zwei im Strahl das einfache I-Phone-Spiel von Wenderlich mit dem cocos2d Tutorenkurs - wegen der Einfachheit gesehen haben das arbeitet genauso gut:

CGRect targetRect = CGRectMake (
target.position.x - target.contentSize.width / 2,
target.position.y - target.contentSize.height / 2,
target.contentSize.width,
target.contentSize.height);

Aber es nimmt an, dass der anchorPoint am Zentrum der Elfe ist. Das kann nicht immer der Fall sein. Um dafür zu korrigieren, multiplizieren wir einfach Breite und Höhe mit anchorPoint_. x und anchorPoint_. y beziehungsweise, anstatt anzunehmen, dass die Werte des anchorPoint 0.5f sind. Erinnern Sie sich an Mathematik? Das Multiplizieren mit 0.5 ist dasselbe als das Teilen durch 2. To correct for this we simply multiply width and height with anchorPoint_.x and anchorPoint_.y respectively, instead of assuming that the anchorPoint's values are 0.5f. Remember math? Multiplying by 0.5 is the same as dividing by 2.

Download CCSpriteExtension

Laden Sie diese Erweiterungsklasse hier herunter.

Verwenden Sie Fall

Das Annehmen von uns hat ein Rechteck, das wir für irgendwelche sich schneidenden Elfen prüfen wollen, gehen wir die Liste von Elfen und Anruf [Elfe getBoundingRect] auf ihnen durch. Das wird uns das begrenzende Rechteck der Elfe an der Position der Elfe geben, die zum Elfe-Skalenfaktor und Ausgleich gemäß dem anchorPoint erklettert ist. Wir können dann CGRectIntersectsRect verwenden, um zu prüfen, wenn sich die Rechtecke schneiden (eg, kollidieren sie). We can then use CGRectIntersectsRect to test if the Rectangles intersect (eg they are colliding).

Eine Verwahrung: Unterstützt rotieren gelassene Rechtecke nicht!

Dieser Code zieht Folge nicht in Betracht. Sobald die Elfe rotieren gelassen wird, für eine begrenzende Kasten-Kollision wird prüfend, viel komplizierter.

Sieh die folgende Lehre für Lösungen zu diesem Problem.

Anmerkungen (0)

2 Antworten auf "häufig gestellte Fragen: cocos2d für das I-Phone: Wie man einen springenden Kasten einer Elfe / Begrenzendes Rechteck bekommt? (mit dem Code)"

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)”
  1. Max sagt:

    Das Erleuchten des Postens. Dank!

    Und, natürlich, habe ich einige Frage :)

    - alles ist relativ, aber für den allgemeinen Code ist besser, um NSString, NSArray zu verwenden (und die Kosten zu bezahlen, neue Gegenstände zu schaffen), oder die veränderlichen? Welcher kann die Rahmen sein, um zwischen jedem zu wählen?

    - Ich frage mich, ob das neue I-Phone 4.0s größere Leistung ein Problem sein wird. Spiele die führen glatt im I-Phone 1. und 2. Generationsgeräte, werden wahrscheinlich zu schnell laufen?

    • GamingHorror sagt:

      Hallo Max,

      ich bezweifle, dass die NSMutable* datasets Leistungsmörder sind. Ich habe keine Tests gemacht, aber ich bin ziemlich überzeugt, dass, wenn Sie sie überhaupt nicht ändern, sie wahrscheinlich ebenso gut leisten werden wie die nichtveränderlichen. Jetzt einmal Sie muss *do* die Reihe oder Schnuren ändern es ist gut, sie veränderlich zu haben, so dass auf Zeug für Sie hinter den Kulissen aufgepasst wird. Andererseits, wenn Sie wissen, dass Sie nur die Sachen einmal schaffen werden, aber nie wiederbestellt, entfernen oder hinzufügen, dass andere dann die nichtveränderlichen verwenden. Für mich ist es eine Sache des Gebrauch-Falls aber nicht der Leistung. Now, once you *do* need to change the arrays or strings it’s good to have them mutable so that stuff is taken care for you behind the scenes. On the other hand, if you know that you’ll only be creating the items once but never re-order, remove or add others then use the non-mutable ones. For me it’s a matter of use case rather than performance.

      Spiele werden schneller auf neueren Geräten nicht laufen. cocos2d's CCDirector überzeugt sich davon. Sie erholen sich framerates natürlich, aber nicht schneller gameplay. Das hält für alle modernen Spielmotoren für wahr. You do get better framerates of course but not faster gameplay. That holds true for all modern game engines.

Verlassen Sie eine Antwort

2 Antworten auf "häufig gestellte Fragen: cocos2d für das I-Phone: Wie man einen springenden Kasten einer Elfe / Begrenzendes Rechteck bekommt? (mit dem Code)"

How to get a Sprite's Bounding Box / Bounding Rectangle? (with Code)”
  1. Max sagt:

    Das Erleuchten des Postens. Dank!

    Und, natürlich, habe ich einige Frage :)

    - alles ist relativ, aber für den allgemeinen Code ist besser, um NSString, NSArray zu verwenden (und die Kosten zu bezahlen, neue Gegenstände zu schaffen), oder die veränderlichen? Welcher kann die Rahmen sein, um zwischen jedem zu wählen?

    - Ich frage mich, ob das neue I-Phone 4.0s größere Leistung ein Problem sein wird. Spiele die führen glatt im I-Phone 1. und 2. Generationsgeräte, werden wahrscheinlich zu schnell laufen?

    • GamingHorror sagt:

      Hallo Max,

      ich bezweifle, dass die NSMutable* datasets Leistungsmörder sind. Ich habe keine Tests gemacht, aber ich bin ziemlich überzeugt, dass, wenn Sie sie überhaupt nicht ändern, sie wahrscheinlich ebenso gut leisten werden wie die nichtveränderlichen. Jetzt einmal Sie muss *do* die Reihe oder Schnuren ändern es ist gut, sie veränderlich zu haben, so dass auf Zeug für Sie hinter den Kulissen aufgepasst wird. Andererseits, wenn Sie wissen, dass Sie nur die Sachen einmal schaffen werden, aber nie wiederbestellt, entfernen oder hinzufügen, dass andere dann die nichtveränderlichen verwenden. Für mich ist es eine Sache des Gebrauch-Falls aber nicht der Leistung. Now, once you *do* need to change the arrays or strings it’s good to have them mutable so that stuff is taken care for you behind the scenes. On the other hand, if you know that you’ll only be creating the items once but never re-order, remove or add others then use the non-mutable ones. For me it’s a matter of use case rather than performance.

      Spiele werden schneller auf neueren Geräten nicht laufen. cocos2d's CCDirector überzeugt sich davon. Sie erholen sich framerates natürlich, aber nicht schneller gameplay. Das hält für alle modernen Spielmotoren für wahr. You do get better framerates of course but not faster gameplay. That holds true for all modern game engines.

Verlassen Sie eine Antwort

Prämie wordpress Themen