2012-03-28 1 views
0

Ok, also ich bin konzeptionell für ein Spiel, das ich machen will und habe ein wenig gespielt, aber lief in ein Problem. Ich lerne iOS Programmierung und lerne cocos2d auch.cocos2d laden zufälliges Bild von Sprite Sheet

Ich habe etwa 20 Bilder. Sie haben alle die gleiche Größe 64x64. Grundsätzlich sind sie in 5 verschiedenen Formen (Quadrat, Kreis usw.) in jeweils 5 verschiedenen Farben gruppiert. Was ich tun möchte, ist, sie im Portrait nach dem Zufallsprinzip fallen zu lassen. Es wird immer nur eine pro Spalte geben. Es kann Duplikate auf dem Bildschirm geben, ich möchte das auch. Während es zufällig ist, möchte ich die Einführung einer neuen Farbe steuern.

Ich habe wirklich mein Gehirn zerrupft, um herauszufinden, wie man das macht. Wie gesagt, ich bin ziemlich neu, also wäre jede Hilfe wirklich toll.

Wenn ich so kühn sein könnte, können alle Antworten in einem Format sein, „es zu Erklären wie Ich bin 5 Ich habe für etwa 1 Jahr tun dies nur worden“

+0

Nun, wenn ich die Bilder in 5 Gruppen von 5 gruppieren, sagen A.1-A.5, B.1-B.5, ... E.5 dann möchte ich sagen, Kontrolle, wenn ein neuer Buchstabe (Farbe Gruppe) darf eine Option sein. Ich bin nicht sehr besorgt über den Algorithmus, um das zu tun, was ich nicht herausfinden kann, ist der beste Weg, es zu implementieren. – TheFityP

Antwort

0

Zuerst müssen Sie einen Blick auf Diese tutorial about sprites sheets: es wird Ihnen zeigen, wie Sie Ihre Sprite-Blätter erstellen und in den Speicher laden. (Da das Tutorial zum Erstellen einer Animation dient, können Sie die Punkte 4 und 5 überspringen).

Nun, wenn Sie Ihre Sprite Blätter an der richtigen Stelle, was Sie ein Sprite erstellen tun ist:

CCSprite* sprite = [CCSprite spriteWithSpriteFrameName:@"frameName.png"]; 

und dann können Sie es zu Ihrer Schicht/Szene.

Über die zufällige Auswahl: Sie können eine Liste der Bildnamen halten können (sagen wir, ein NSArray) und dann zufällig (das heißt, srand verwenden einen Zufallsindex zu erzeugen) wählen Sie den @"frameName.png" Wert von ihm.

+0

So kann ich sagen, ein Array von nur String-Namen dann dereferenzieren sie "... spriteWithSpriteFrameName: arrayOfImageNames [randomIndex]];"? – TheFityP

+0

das war es, was ich vorzuschlagen versuchte. Wenn Sie 'spriteWithSpriteFrameName' verwenden, ist dies der natürlichste Weg, IMO. Wenn Sie Ihre Bilder basierend auf ihrer Farbe partitionieren möchten, verwenden Sie am besten ein NSDictionary, in dem Sie für jeden Farbnamen (string) speichern, ein NSArray (oder ein einfaches c-Array, wenn Sie das bevorzugen) mit den Bildern für diese Farbe. Dann wählen Sie zufällig, zuerst die Farbe unter den Wörterbuchschlüsseln, dann das Bild dieser Farbe in dem Array, das diesem Schlüssel zugeordnet ist. – sergio

+0

Oooo Ich mag diese NSDictionary Sache. Soll ich alle Bilder laden und sie nur unsichtbar machen (was 25 x 10 Spalten bedeuten würde) oder sollte ich sie dynamisch laden, so dass nur 10 Bilder gleichzeitig geladen werden? Ich denke, die Frage, die ich habe, ist, ob es eine größere Leistungseinbuße gibt, wenn man eine mit einem Sprite assoziierte Textur ändert oder eine Menge Sprites geladen hat. – TheFityP

0

Wenn Sie Cocos2D verwenden, können Sprites mit Sprite Sheets am besten verwendet werden. Das heißt, eine Kombination von zwei Arten von Dateien:

  1. Eine plist-Datei mit allen Koordinaten von N Sprites und alle verschiedenen Daten über das Sprites, Größe, Namen usw.
  2. eine PNG-Datei mit allen Sprites

Sie können ein Sprite Blatt mit verschiedenen Arten von Software machen, wie:

  • Zwoptex
  • Sprite Helper
  • Sprite Packer
  • Sprite Meister
  • Texture Packer

Über Leistung, wenn ein Sprite Blatt verwenden, müssen Sie CCSpriteBatchNode, wie die API-Dokumentation Staaten (read here) verwenden:

A CCSpriteBatchNode kann auf eine und nur eine Textur verweisen (eine Bilddatei, ein Texturatlas). Nur die CCSprites, die in dieser Textur enthalten sind, können dem CCSpriteBatchNode hinzugefügt werden. Alle zu einem CCSpriteBatchNode hinzugefügten CCSprites werden in einem OpenGL ES Draw-Aufruf gezeichnet.Wenn die CCSprites nicht zu einem CCSpriteBatchNode hinzugefügt werden, wird ein OpenGL ES-Draw-Aufruf für jeden einzelnen benötigt, was weniger effizient ist.

den Code Sprite-Blatt zu verwenden:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"sprite.plist"]; 

CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"sprite.png"]; 
[self addChild:spriteSheet]; 

Hoffnung, das hilft.