Libro di cocos2d, il Capitolo 7: Tiratore facente scorrere sul video la Parte

Il 6 agosto 2010, in Annunci, libro, cocos2d, da Steffen Itterheim by Steffen Itterheim

Il capitolo 7 – Tiratore facente scorrere sul video la Parte

Il gioco di tiratore sarà controllato con una leva di comando effettiva usando SneakyInput. La parallasse di sfondo avvolgente in volute sarà attuata non con il CCParallaxLayer, siccome questo non sostiene l'avvolger in volute senza fine (per quanto so, per favore mi corregga se sono sbagliato). Il resto sarà il codice di gameplay, per lo più producendo nemici, commovendo loro e le prove di collisione. The rest will be gameplay code, mostly spawning enemies, moving them and collision tests.

Il capitolo sarà presentato il venerdì, 13 agosto. Sì, venerdì il 13esimo. Terrificante. Scary.

Il riassunto di lavorare sul Capitolo 6 – i Folletti Approfonditamente

Decisi di rinominare questo capitolo a Folletti Approfonditamente siccome affronta per lo più Folletti, il Folletto Batching (precedentemente conosciuto come Fogli di Folletto), gli Atlanti di Struttura e Zwoptex così come la direzione di memoria di struttura generale. Tutto il tempo posando la fondazione per il gioco da esser fatto nel Capitolo 7.

Lavorando in questo capitolo notai che è terribilmente complesso per creare una classe CCAnimation, particolarmente se Lei non sta usando un Atlante di Struttura. Allora decisi di illustrare come aggiungere metodi d'aiutante aggiungendoli via una Categoria Oggettiva-C alla classe CCAnimation. Adesso Lei può creare un CCAnimation con soltanto una linea di codice, invece di circa dieci. Now you can create a CCAnimation with just one line of code, instead of around ten.

Ancora una volta creai alcuni dei miei materiali illustrativi di scarabocchio adesso famosi. Se qualcosa questo deve mostrare che perfino un programmatore può fare art. O, bene, almeno qualcosa che vagamente assomiglia ad art. Or, well, at least something that vaguely resembles art.

Fui un po' sorpreso da una cosa sebbene, ed ecco come poco l'uso del CCSpriteBatchNode contribuito al framerate in questo caso particolare. Aggiunsi tutte le pallottole a un CCSpriteBatchNode e trovai solo un aumento del 15 % di svolgimento, salì da 45 fps a un po' più di 50 con tutte quelle pallottole il volo. Classifico di aspettati un effetto più grande da esperienze precedenti. I sort of expected a bigger impact from previous experiences.

Sollevamento di coscienza: uso di memoria & perdite

Il 25 luglio 2010, in Programmazione, che Parla Da Esperienza, cocos2d, da Steffen Itterheim by Steffen Itterheim

Aiutando altri a risolvere i loro problemi di progetto di cocos2d durante l'anno passato diventò ovvio che molti progetti hanno almeno un gran problema in una di queste aree:

  • direzione di memoria
  • direzione di risorsa
  • struttura di codice

Esempi

I problemi di direzione di memoria normalmente variano da assegnare troppa memoria, caricando troppe strutture sul fronte che solo stanno per essere necessari più tardi, o da perdite di memoria come scene non deallocating cambiando scene. La gamma di problemi di direzione di risorsa da non aggiungere le risorse giuste all'obiettivo giusto, spesso avendo come conseguenza aumentò dimensioni App perché le risorse sono aggiunte al fascio, ma mai usate dall'App. Questo poteva anche intendere caricare file di risorsa identici salvo che loro hanno nomi di file diversi (le copie?), esaurendo la memoria supplementare. O non i folletti strettamente facenti i bagagli in Atlanti di Struttura ma invece utilizzazione di un Atlante di Struttura per oggetto di gioco – mentre questo è comprensibile da un luogo di osservazione di seperation logico proprio spreca opportunità per ottimizzazione. It could also mean loading identical resource files except that they have different filenames (copies?), using up additional memory. Or not tightly packing sprites into Texture Atlases but instead using one Texture Atlas per game object – while this is understandable from a standpoint of logical seperation it does waste opportunities for optimization.

Finalmente, la struttura di codice o la mancanza di ciò regolarmente conducono “a tutto in una classe” il progetto di codice che è il più probabile un processo evolutivo, piuttosto che intenzionale. È abbastanza comune vedere classi con migliaia di linee di codice, qualche volta perfino 10 000 linee passate andanti di codice in una classe. Altre cose stanno usando troppi CCLayers senza loro aggiungendo un vantaggio chiaro, ad esempio soltanto per raggruppare tutti i nodi a un ordine di z specifico insieme o raggrupparli da funzionalità, eg uno strato per nemici, un per giocatori, un per sfondo, un per UI, un per punteggio, un per effetti di particella, e così via – senza alcuno di questi strati usati per che loro sono veramente bravi: la modificazione di nodi multipli subito, come movimento, scalata, rotazione o z-riordinamento loro. E certamente ci sono l'inferno di pasta & di copia, i grandi blocchi di codice riprodotto in vari posti solo per modificare alcuni parametri invece creare un metodo che prende i parametri modificabili come argomenti. Perfino i professionisti che feci lavorare con ricevuto così solito di fare che diventò duro soltanto vincere la resistenza d'affitto vanno d'abitudini vecchie. Ma loro impararono. Other things are using too many CCLayers without them adding a clear benefit, for example just to group all nodes at a specific z order together or to group them by functionality, eg one layer for enemies, one for players, one for background, one for UI, one for score, one for particle effects, and so on – without any of these layers being used for what they’re really good at: modifying multiple nodes at once, like moving, scaling, rotating or z-reordering them. And of course there’s the copy & paste hell, large blocks of code reproduced in various places only to modify some parameters instead of creating a method which takes the modifiable parameters as arguments. Even professionals I worked with got so used to doing that it became hard just to overcome the resistance of letting go of old habits. But they learned.

Riassunto

Niente di questo progetto di codice e strutturazione mi sembra strano o sorprendente. Ho scritto il codice come questo io stesso. Anche credo se è abbastanza buono e i lavori, allora perché diavolo no? È una questione d'esperienza e è solo con esperienza che Lei chiaramente vede come migliorare cose. Questo si riduce alla curva d'erudizione regolare dove solo la formazione professionale e l'istruzione e soltanto semplicemente la fabbricazione di sbagli e l'erudizione di loro aiutano nella corsa lunga. Questo è come impariamo cose. I also believe if it’s good enough and works, then why the hell not? It’s a matter of experience and it’s only with experience that you clearly see how to improve things. This boils down to the regular learning curve where only training and tutoring and just simply making mistakes and learning from them helps in the long run. That’s how we learn things.

D'altra parte, le cose come direzione di Risorsa e di Memoria possono anche esser imparate ma loro hanno una natura diversa. Loro possono esser statisticamente valutati, loro potevano esser calcolati e verificati automaticamente. Questo mi fa chiedermi se non ci sono i dei certi attrezzi d'informazione e d'automazione che aiuterebbero progettisti a portare a termine risultati migliori in termini d'uso di memoria e direzione di risorsa? Nel frattempo è tutto su sollevamento di coscienza … This makes me wonder if there isn’t some kind of automation and information tools that would help developers achieve better results in terms of memory usage and resource management? In the meantime it’s all about raising awareness …

Sollevamento di Coscienza di Memoria

Il più significativamente penso che abbiamo bisogno di alzare più coscienza a questi problemi a progettisti cocos2d. Un passo verso questo sarebbe per cocos2d per esporre un “banco di memoria disponibile” di fianco al banco di FPS. Avevo l'abitudine di rattoppare CCDirector per esporre semplicemente la memoria invece di FPS poiché fu sempre più importante per me. Il compagno cocos2d il progettista Joseph mi mandò la sua versione per esporre entrambi – semplicemente non ho pensato all'ovvio. Così se Le piacerebbe vedere FPS e memoria disponibile vicino all'un l'altro penso che Lei può toccare i cambiamenti a CCDirector abbozzato qui: I used to patch CCDirector to simply display memory instead of FPS since that was always more important to me. Fellow cocos2d developer Joseph sent me his version to display both – I simply didn’t think of the obvious. So if you’d like to see FPS and available memory next to each other I think you can handle the changes to CCDirector outlined here:


//CCDirector.h, aggiungono sotto @interface:
+ getAvailableBytes (doppio);
+ getAvailableKiloBytes (doppio);
+ getAvailableMegaBytes (doppio);

//CCDirector.m, aggiungono come adatto:
#include <sys/sysctl.h>  
#import <mach/mach.h>
#import <mach/mach_host.h>

[...]

+ getAvailableBytes (doppio)
{
  vm_statistics_data_t vmStats;
  il mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
  il kern_return_t kernReturn = host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

  se (kernReturn! = KERN_SUCCESS)
  {
    restituisca NSNotFound;
  }

  ritorni (vm_page_size * vmStats.free_count);
}

+ getAvailableKiloBytes (doppio)
{
  ritorni [CCDirector getAvailableBytes] / 1024.0;
}

+ getAvailableMegaBytes (doppio)
{
  ritorni [CCDirector getAvailableKiloBytes] / 1024.0;
}

[...]

- (vuoto) showFPS
{
  strutture ++;
  l'accumDt + = dt;

  se (accumDt> CC_DIRECTOR_FPS_INTERVAL)  {
    frameRate = frames/accumDt;
    strutture = 0;
    accumDt = 0;

    //l'unico cambiamento in showFPS è questa linea:
    Il NSString *str = [[NSString alloc] initWithFormat:@" il %.1f  il %.1f", frameRate, [CCDirector getAvailableMegaBytes]];

    [Il FPSLabel setString:str];
    [rilascio di str];
  }
}

Sollevamento di coscienza a Scene perdenti

Inoltre molto, fortemente e con rinforzo massimo (senza tirare fuori un'arma) raccomando a progettisti cocos2d di controllare frequentemente metodi dealloc della Sua scena. Preferibilmente aggiunga un punto di arresto di una esecuzione là, o come minimo aggiunga la linea di taglio e trasporto dei tronchi: CCLOG (”dealloc: il %”, stesso). Se Lei vuole un metodo più visibile ma meno importuno Lei poteva fare qualcosa come luccichio dello schermo o interpretazione di un suono ogni volta che l'ultima scena è deallocated, in modo che Lei diventi così solito di questo che quando Lei non lo sta vedendo o sentendo più questo immediatamente alza la Sua attenzione. CCLOG(@”dealloc: %@”, self). If you want a more visible but less intrusive method you could do something like flashing the screen or playing a sound whenever the last scene is deallocated, so that you get so used to it that when you’re not seeing or hearing it anymore it immediately raises your attention.

Se in qualsiasi momento durante lo sviluppo del Suo progetto il metodo dealloc di una scena non è chiamato quando Lei cambia scene, Lei sta perdendo la memoria. Fuoriuscita della scena intera è una perdita di memoria del genere più cattivo. Lei vuole prendere questo presto mentre Lei può ancora ripercorrere i Suoi passi che potrebbero aver causato il problema. Appena Lei arriva a utilizzazione di centinaia di beni e migliaia di linee di codice e poi si rende conto che la scena non è deallocated, Lei sarà in per un giro divertente che prova a riuscire a capire dove questo sta venendo da. In quel caso, togliendo nodi infacendoli commenti finché Lei possa avvicinarsi la colpevole è probabilmente la strategia migliore, vicino a utilizzazione di Strumenti (che non ho trovato troppo utile in quei casi). You want to catch that early while you can still retrace your steps that might have caused the problem. Once you get to using hundreds of assets and thousands of lines of code and then realize the scene isn’t deallocated, you’ll be in for a fun ride trying to figure out where that’s coming from. In that case, removing nodes by uncommenting them until you can close in on the culprit is probably the best strategy, next to using Instruments (which I haven’t found too helpful in those cases).

Collisi con un tal problema come perché passavo l'oggetto di CCScene a subclassi in modo che loro abbiano l'accesso a metodi della scena. La subclasse ritenne la scena e fu derivata da CCNode e aggiunse al CCScene come bambino. Il problema con questo: durante ripulita della scena questo correttamente tolse tutti i nodi di bambino ma alcuni nodi di bambino ancora hanno ritenuto la scena. Per questo il loro metodo dealloc non fu mai chiamato, e a sua volta la scena fu mai deallocated. The problem with that: during cleanup of the scene it correctly removed all child nodes but some of the child nodes still retained the scene. Because of that their dealloc method was never called, and in turn the scene was never deallocated.

Libro di cocos2d, il Capitolo 3: Elemento essenziale

Il 10 luglio 2010, in Annunci, libro, cocos2d, da Steffen Itterheim by Steffen Itterheim

Il capitolo 3 – Elemento essenziale

Questo capitolo è un riferimento sulle classi fondamentali di cocos2d e come usarli. I nodi, gli Strati, le Scene, le Etichette, i Folletti, le Transizioni, le Azioni, Lei lo chiama. Anche CCDirector, SimpleAudioEngine e altre classi di carta unica di una serie spesso usate pure. I concetti più avanzati saranno discussi in un capitolo successivo, Spritesheets ad esempio. Also CCDirector, SimpleAudioEngine and other often used singleton classes as well. More advanced concepts will be discussed in a later chapter, Spritesheets for example.

La sottomissione del primo abbozzo di capitolo è dovuta vicino il venerdì, 16 luglio.

Che fa Lei pensa deve essere nel Capitolo 3?

Sa Lei una classe cocos2d o un processo che Lei pensa è essenziale e deve esser discusso in questo capitolo? Fatemi sapere!

Il riassunto di lavorare sul Capitolo 2 – Esser iniziato

Per uno esposi dettagliatamente il progetto campione Ciao Mondiale e feci una modifica semplice usando l'impiego di contatto. Nello stesso momento almeno alcun livello fondamentale di comprensione su classi cocos2d fu introdotto ma il nocciolo di questo è fatto nel Capitolo 3. Inoltre, ci furono molti aspetti teoretici che volli discutere pure, soprattutto la direzione di Memoria e la memoria disponibile così come le attese d'installazione a prova su Simulatore contro un dispositivo. E certamente i dispositivi e le loro differenze sottili. Proprio spero che questo tipo di dettagli sono apprezzati anche se loro non sono il 100 % collegato a cocos2d. Regolarmente vedo progettisti cocos2d lottare con problemi di memoria, con differenze inattese sul dispositivo contro il Simulatore, o confrontare framerates del Simulatore e forse perfino la Messa a punto costruisce. Questo mi fece volere deviare dal sentiero battuto per un momento per con speranza salvare i lettori alcune idee sbagliate e il dolore associato con loro. In addition, there were a lot of theoretical aspects I wanted to discuss as well, most of all Memory Management and available memory as well as setting expectations on testing on Simulator vs. a device. And of course the devices and their subtle differences. I do hope that those kind of details are appreciated even if they’re not 100% related to cocos2d. I regularly see cocos2d developers struggling with memory issues, with unexpected differences on the device vs the Simulator, or comparing framerates of the Simulator and possibly even Debug builds. That made me want to stray off the beaten path for a moment to hopefully save the readers some misconceptions and the pain associated with them.

Anche realizzai attraverso quanti passi un nuovo progettista deve passare e quanto là deve imparare in caso Lei non stava mai azionando con l'iPhone SDK prima. Questo comincia da registrazione come progettista d'iPhone e non termina con impianto dello SDK perché Lei anche ha bisogno dei profili approvvigionanti, una caratteristica molto discussa e importuna. Per tutto questo mi riferii a esistente (ed eccellente) la documentazione di Mela. Tipicamente il cambiamento di processi con ogni nuovo iPhone che SDK o può perfino essere sotto NDA, dunque discutendo come tutto questo aziona con iPhone SDK 4 non sarebbe una buon'idea poiché poco dopo il libro è fuori l'iPhone SDK 5 può star venendo, introducendo cambiamenti al Portale di Progettista e iTunes Si connettono con questo. Proprio mi ha ricevuto l'idea, e so che gli altri l'hanno anche, che abbiamo bisogno di alcun Seminario universitario sotto la guida di un tutor di mani della tenuta che prende l'un attraverso i passi da iscriversi come Progettista d'iPhone a editoria di proprio primo App, riferendosi alla documentazione ufficiale corretta per ogni passo non dimenticando su trappole comuni che non sono nei dottori ufficiali. For all of this I refered to existing (and excellent) Apple documentation. Typically the processes change with each new iPhone SDK or may even be under NDA, so discussing how all of this works with iPhone SDK 4 wouldn’t be a good idea since shortly after the book is out iPhone SDK 5 may be coming, introducing changes to the Developer Portal and iTunes Connect with it. It did get me the idea, and I know others have it too, that we need some holding-hands Tutorial which takes one through the steps from registering as iPhone Developer to publishing one’s first App, by referring to the correct official documentation for each step while not forgetting about common pitfalls that are not in the official docs.

Anche notai che facile può essere guardare dall'alto come Lei improvvisamente introduce un nuovo concetto senza spiegarlo prima. E poi Lei deve decidere quanta informazione è necessaria per introdurre il concetto senza deviare troppo lontano da che Lei vuole parlare in primo luogo. È particolarmente duro per me perché tendo a volere spiegare tutto in dettaglio ma alcune cose devono esser lasciate per una discussione successiva. Sto aspettando il feedback editoriale adesso. Questo ha aiutato tremendeously per il primo capitolo e imparai molto della redazione Apress, allora lo trovo l'eccitazione che gli esperti mi indicano ai difetti e fanno suggerimenti, entro per fissarli e poi vedere quanto meglio è. Questo è come mi piace imparare cose e questo sta per essere uno dei concetti principali del libro. Mostri com'è fatto, come non deve esser fatto (se questo ha fatto spesso in modo sbagliato) e come può esser fatto ancora meglio se Lei vuole evitare problemi nella corsa lunga, spiegando perché. It’s especially hard for me because I tend to want to explain everything in detail but some things have to be left for a later discussion. I’m looking forward to editorial feedback now. It has helped tremendeously for the first chapter and I learned a lot from the Apress editorial staff, so I find it exciting that the experts point me to the flaws and make suggestions, I go in to fix them and then see how much better it is. That’s how I like to learn things and it’s going to be one of the core concepts of the book. Show how it’s done, how it shouldn’t be done (if it’s often done wrong) and how it can be done even better if you want to avoid trouble in the long run, while explaining why.

Libro di cocos2d, il Capitolo 2: Esser iniziato

Il 2 luglio 2010, in Annunci, libro, cocos2d, da Steffen Itterheim by Steffen Itterheim

Il capitolo 2 – Esser iniziato

Questo capitolo comincia dai prerequisiti soliti. Scarichi e installi l'iPhone SDK e cocos2d. Impianto cocos2d Sagome. Creazione del primo progetto da un cocos2d progetta la sagoma. Installing cocos2d Templates. Creating the first project from a cocos2d project template.

Da ciò che già scrissi che valuto che sarà circa un terzo del capitolo. Penso quello che sarebbe il più interessante in questo capitolo deve parlare di struttura di codice generale di progetti di cocos2d. Gli elementi fondamentali come Scene, Strati e Nodi. Come a transizione da uno schermo all'altro, per vedere che stiamo veramente facendo qualcosa fresco con poco sforzo. Per questo penso che i selezionatori programmati devono anche esser presentati a transizioni di tempo, e uno schermo potrebbe essere uno Strato che sta aspettando l'impiego di contatto per avanzare al vicino schermo. The basic elements like Scenes, Layers and Nodes. How to transition from one screen to another, to see that we’re actually doing something cool with little effort. For that I think the scheduled selectors should also be introduced to time transitions, and one screen might be a Layer which is waiting for touch input to advance to the next screen.

Potrebbe anche essere un buon posto per discutere la direzione di memoria cocos2d, come autorilascio statico initializers, e assicurandosi il dealloc è chiamato quando Lei cambia scene – altrimenti Lei sta evidentemente avendo una perdita di memoria.

Lo scopo è quello di ricevere il lettore in una posizione dove lui si sente comodo tirando fuori una struttura di schermo in cocos2d. Lui sa come inizializzare oggetti e come aggiungere e toglierli dalla scena. La fondazione di lavorare con cocos2d se Lei così è. The foundation of working with cocos2d if you so will.

Che fa Lei pensa deve essere nel Capitolo 2?

Fatemi sapere se Lei pensa che sto perdendo qualcosa importante. Se Lei non ha nessun suggerimento allora soltanto pensano a quello che Lei aspetterebbe dal capitolo leggendo questa descrizione, che potrebbe darLe alcuni pensieri.

Anche darei il benvenuto a qualsiasi punta e le trappole comuni in cui i progettisti cocos2d prime volte potrebbero intrappolarsi. Le punte esperte sono anche gradite, quelle piccole cose brutte o abitudini che potevano morderLa più tardi se Lei non li considera all'inizio.

Sto aspettando il Suo feedback! Ancora prima meglio. Il capitolo 2 sarà presentato poi il venerdì, 9 luglio. Chapter 2 will be submitted next Friday, July 9th.

Quello che è progettato per il Capitolo dopo questo

Soltanto per mettere il Capitolo 2 in contesto, per il Capitolo 3 sto progettando di parlare di classi cocos2d essenziali e processi. I folletti, le Etichette, i Menù, le Azioni, eccetera. Questo Le mostrerà come lavorare con loro usando piccoli ritagli di codice. Il capitolo probabilmente avrà un carattere "di riferimento" con vari campioni di codice, in modo che gli utenti esperti si sentano comodi saltando avanti mentre i principianti ancora lo trovano facile e incoraggiante per raccogliere i dettagli. It’ll show you how to work with them using small code snippets. The chapter will probably have a “reference” character with various code samples, so that experienced users feel comfortable skipping ahead while beginners still find it easy and encouraging to pick up the details.