[cocos2d] Afficher une partie d'une image ?

Human-BehindHuman-Behind Membre
00:04 modifié dans API UIKit #1
Bonjour à  tous,

J'ai installer la version iPhone de cocos2D et je voulais savoir si vous connaissiez le moyen d'afficher une partie d'une image, et non pas une image complete.

Exemple : J'ai une image dont la taille est de 640*480, en fait j'aimerai afficher la partie de l'image qui vas de y >= 0 à  y <=480 et de x >=0 à  x <= 320 , en gros j'affiche la moitié de l'image.

Si vous avez une idée elle est la bienvenue :)

Réponses

  • Philippe49Philippe49 Membre
    00:04 modifié #2
    CGImageCreateWithImageInRect
  • juillet 2009 modifié #3
    Pour te donner une réponse plus détaillée, mais qui ne fonctionne que sur Mac (au moins comme ça t'as une idée de comment faut faire).

    <br />NSImage* myFullImage = [NSImage imageNamed:@&quot;kikoo.png&quot;];<br />NSImage* myResizedOne = [[NSImage alloc] initWithSize:NSMakeSize(320,480)];<br /><br />[myResizedOne lockFocus];<br />[myFullImage drawAtPoint(0,0) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];<br />[myResizedOne unlockFocus];<br />
    
    ;

    Je touche pas trop à  l'iPhone moi, ça me donne un peu des boutons  :fouf):


    Par contre y'a un truc plus con à  faire. Si tu affiches ton image dans une UIImageView, tu peux simplement régler le type d'aspect de ton UIImageView (genre à  aspect fill : none - ou truc du genre) et mettre sa largeur à  320.. au final l'image sera tronquée  :P
  • Human-BehindHuman-Behind Membre
    00:04 modifié #4
    Merci pour vos réponses messieurs, mais vous vous n'utilisez pas les fonctions cocos2D lorsque vous utilisez ces fonctions ?
  • Philippe49Philippe49 Membre
    00:04 modifié #5
    Les fonctions cocos2D vont forcément utiliser les fonctions de Cocoa. Alors pourquoi aller chercher chez le détaillant du coin ce que le grossiste fournit directos ? Surtout que le détaillant dans quelques mois ...
    Non le code avec CGImageCreateWithImageInRect est d'une simplicité enfantine.
  • Human-BehindHuman-Behind Membre
    00:04 modifié #6
    Dacodac, je vais essayer sa demain (ou aprés demain).

    Merci :)
  • DrakenDraken Membre
    00:04 modifié #7
    Cocos2D est une surcouche graphique construite à  partir des fonctions d'OpenGL ES. C'est en quelque sorte de la 3D "plate". Les images sont converties en textures graphiques envoyées à  la carte vidéo.

    Les fonctions d'affichage de Cocos2D sont en réalité des ordres 3D traités directement par la puce vidéo de l'iPhone. Les fonctions 3D sont "encapsulées" dans les classes d'objets de Cocos2D, afin de les rendre facilement utilisables. C'est "la 3D pour les nuls".

    D'après ce que j'ai vu en lisant le code source, il n'y a pas de méthode pour afficher juste une portion d'image. La classe Texture2D de Cocos2D ne gère que deux fonctions d'affichage :

    @interface Texture2D (Drawing)<br />/** draws a texture at a given point */<br />- (void) drawAtPoint:(CGPoint)point;<br />/** draws a texture inside a rect */<br />- (void) drawInRect:(CGRect)rect;<br />@end<br />
    


    Ces deux méthodes affichent la totalité de l'image sur l'écran. Mais le problème n'est pas insoluble. Il est possible de modifier le code source pour permettre la copie d'une portion de l'écran. Je l'ai déjà  réalisé en OpenGL avec ma propre bibliothèque de fonctions 2D.

    Je t'écris une nouvelle fonction Cocos2D dés que j'ai un peu de temps libre. Dans le genre :

    - (void) drawInRect:(CGRect)rectOrigine destination:(CGPoint)point;<br />
    


  • Philippe49Philippe49 Membre
    juillet 2009 modifié #8
    dans 1247609605:

    Cocos2D est une surcouche graphique construite à  partir des fonctions d'OpenGL ES. C'est en quelque sorte de la 3D "plate". Les images sont converties en textures graphiques envoyées à  la carte vidéo.

    Les fonctions d'affichage de Cocos2D sont en réalité des ordres 3D traités directement par la puce vidéo de l'iPhone. Les fonctions 3D sont "encapsulées" dans les classes d'objets de Cocos2D, afin de les rendre facilement utilisables. C'est "la 3D pour les nuls".


    Une fois de plus Draken, cite des sources fiables avant de lancer des affirmations du type "des ordres 3D traités directement par la puce vidéo de l'iPhone" . Dans le cadre du SDK standard, je ne vois pas Apple permettre de telles choses.
    voir
  • AliGatorAliGator Membre, Modérateur
    00:04 modifié #9
    Je pense que ce qu'il veut dire (j'ai pas regardé cocos2D mais bon) c'est que Cocos2D est un framework permettant d'encapsuler des appels à  OpenGL ES pour tous ceux qui veulent utiliser OpenGL sur iPhone juste pour de la 2D. Non ?
  • Philippe49Philippe49 Membre
    00:04 modifié #10
    Ce qui revient à  ce que j'ai dit plus haut
    dans 1247596667:

    Les fonctions cocos2D vont forcément utiliser les fonctions de Cocoa.


    ou alors c'est hors SDK ...
  • zoczoc Membre
    00:04 modifié #11
    dans 1247651654:

    Je pense que ce qu'il veut dire (j'ai pas regardé cocos2D mais bon) c'est que Cocos2D est un framework permettant d'encapsuler des appels à  OpenGL ES pour tous ceux qui veulent utiliser OpenGL sur iPhone juste pour de la 2D. Non ?


    Cocos2D est en effet un moteur graphique dédié au développement de jeux 2D sur iPhone. Il se base sur OpenGL ES, en utilisant évidemment les APIs officielles (sinon la bonne centaine de jeux basée sur ce framework n'auraient jamais pu passer à  travers le filtre de l'AppStore...).
  • DrakenDraken Membre
    00:04 modifié #12
    Ce que je dis, après avoir regardé le code de Cocos2D, c'est que ces fonctions graphiques sont basés sur l'API officiel du Framework OpenGL de l'iphone. Qui lui-même communique directement avec les fonctions OpenGL natives de la puce vidéo de l'iPhone.

    Philippe pense que le Framework OpenGL est basé sur CoreGraphic. Que les appels aux fonction OpenGL sont retranscrites en opérations graphiques CoreGraphics, avant d'être traitées par Cocoa. Nous avons déjà  abordé ce sujet dans un autre topic.

    En résumé, Apple aurais écrit un émulateur logiciel OpenGL, à  partir de CoreGraphics, pour faire tourner des logiciels graphiques sur une puce vidéo OpenGL ! J'ai quelques doutes, là ..

  • Philippe49Philippe49 Membre
    juillet 2009 modifié #13
    dans 1247668914:

    Philippe pense que le Framework OpenGL est basé sur CoreGraphic. Que les appels aux fonction OpenGL sont retranscrites en opérations graphiques CoreGraphics, avant d'être traitées par Cocoa. Nous avons déjà  abordé ce sujet dans un autre topic.


    Non, je n'ai jamais dit cela. J'ai simplement cité la doc officielle d'Apple


    iPhone Graphics Overview

    Core Animation is fundamental to the iPhone graphics subsystem. Every UIView in your application is backed by a Core Animation layer. As the various layers update their contents, they are animated and composited by Core Animation and presented to the display. This is described in detail in Window and Views in the iPhone Application Programming Guide.

    OpenGL ES, like every other graphics system on the iPhone, is a client of Core Animation. To use OpenGL ES to draw to the screen, your application creates a UIView class with a special Core Animation layer, a CAEAGLLayer. A CAEAGLLayer object is aware of OpenGL ES and can be used to create rendering targets that act as part of Core Animation. When your application finishes rendering a frame, you present the contents of the CAEAGLLayer object, where they will be composited with the data from other views.

    The complete discussion of how to create a CAEAGLLayer and use it display your rendered images is described in “Working with EAGL.”

    Although your application can compose scenes using both OpenGL ES layers and non-OpenGL ES drawing, in practice, you will achieve higher performance by limiting yourself to OpenGL ES. This will be covered in more detail later in “Displaying Your Results.”


    Il ne me semble pas lire CoreGraphics mais bien CoreAnimation ?
    Il ne me semble pas lire non plus que OpenGL ES se situe en plus bas niveau que les API Cocoa, et aurait par là -même des chances d'être plus rapide.
    Puisqu'on lit en plusieurs endroits que le modèle Client-Serveur au niveau graphique s'appuie sur de l'openGL, il ne me semble pas improbable que les primitives CoreGraphics soient sur des principes OpenGL. Là  on est dans la supposition, mais les ingénieurs Apple ne sont pas forcément des crétins : Si leur serveur graphique est optimisé selon un certain mode, ils vont sans doute faire leurs primitives selon ce mode.

    Il y a seulement loin entre la librairie OpenGL ES et la communication bas niveau effective Client-Serveur.

  • DrakenDraken Membre
    00:04 modifié #14
    On ne parle tout simplement pas de la même chose!

    Ces textes issus de la documentation Apple ne traitent pas de l'OpenGL ES en lui-même, mais du Framework OpenGL ES, fournissant une interface entre le moteur de rendu OpenGL ES et le système graphique.

    Aucune opération graphique n'est réalisée dans le Framework OpenGL. C'est essentiellement un "bureau de poste" envoyant les ordres du langage OpenGL au moteur de rendu OpenGL de la puce vidéo. Moteur extrêmement performant, puisque les traitements graphiques sont réalisés par du hardware et non des lignes de code. 

    Alors oui, le Framework OpenGL ES iPhone à  des dépendances vis à  vis du système graphique OSX, mais pas l'OpenGL ES lui-même, ni les traitements effectués par le moteur de rendu OpenGL ES à  l'INTERIEUR de la puce vidéo !

    Le Framework encapsule la surface de rendu OpenGL dans un objet UIView, de manière à  ce qu'un logiciel puisse mélanger rendu OpenGL et "opérations graphiques conventionnelles". Mais cela ne veut pas dire qu'OpenGL utilise une UIView en interne !

    La même puce OpenGL ES fonctionnerais sur un téléphone utilisant un autre système d'exploitation (Windows Mobil, Android, linux, Palm OS, etc..), à  condition d'avoir un framework adapté. Et pas seulement les téléphones, comme je le disais dans un autre topic, la console PS3 de Sony utilise une carte graphique OpenGL ES !

    Les opérations graphiques réalisées par OpenGL dans le moteur de rendu de la puce vidéo sont totalement indépendantes du processeur de l'ordinateur, de son système d'exploitation et de ces couches logicielles. Et c'est tout l'intérêt du système, pour réaliser des traitements graphiques complexes le plus rapidement possible.

    Dans une application OpenGL, le processeur n'a pas à  s'occuper des opérations graphiques, pour se concentrer sur les calculs de simulation, la gestion de l'univers et la prise en compte de l'interface.

    Et c'est encore mieux avec les Shaders de l'OpenGL ES 2.0, permettant de télécharger des petites routines directement dans la puce vidéo, pour réaliser des traitements graphiques personnalisés. Au lieu de passer par des fonctions graphiques standardisées, on peut maintenant programmer le processeur de la puce vidéo.. le must du must ! Sauf que cela ne marche que sur l'iPhone 3GS et le nouvel iPod iTouch sensé sortir d'ici quelques mois. Snif !



  • Human-BehindHuman-Behind Membre
    00:04 modifié #15
    Pour en revenir à  ma question, j'ai trouvé la réponse, en fait il faut utiliser la classe AtlasSpriteManager dans laquelle on charge l'image, puis si on veut afficher une partie de l'image il faut utilise la classe AtlasSprite (qui est le chidren du AtlasSpriteManager) ;) .

    Merci en tout cas pour votre aide :) !
  • DrakenDraken Membre
    00:04 modifié #16
    Euh.. on t'as aidé ?

    Tiens, tu fait comment pour utiliser Cocos2D ? Chaque fois que j'essaye l'exemple fournis avec la bibliothèque, j'ai environ 4.000 warnings (si, si) et l'application refuse de fonctionner.

    Bon, mon niveau d'anglais étant ce qu'il est, j'ai dus rater quelque chose dans l'installation.

  • Human-BehindHuman-Behind Membre
    00:04 modifié #17
    J'ai suivi ce tuto :

    http://monoclestudios.com/cocos2d_whitepaper.html

    En francais sa donne (en ce qui concerne l'installation) :

    - Télécharger cocos2D for iphone et le déziper.
    - Créer un nouveau projet "Window-Based Application".
    - Tu supprime completement le MainWindow.xib , et dans le info.plist tu supprime l'entré "Main nib file base name".
    - Dans le fichier main.m , qui ressemble a ceci :

    #import &lt;UIKit/UIKit.h&gt;<br /><br />int main(int argc, char *argv&#91;]) {<br />&nbsp; &nbsp; <br />&nbsp; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />&nbsp; int retVal = UIApplicationMain(argc, argv, nil, nil);<br />&nbsp; [pool release];<br />&nbsp; return retVal;<br />}
    


    Il faut remplacer le 4eme argument de UIApplicationMain, genre :

    int retVal = UIApplicationMain(argc, argv, nil, @&quot;MyGameAppDelegate&quot;);
    


    - En suite il faut ajouter au projet, le dossier "External" qui se trouve dans le dossier cocos2d-iphone. N'oublie pas de cocher l'option : "Copy items into destination group's folder (if needed)"

    - Une fois que le dossier External est ajouté, il faut supprimer completement le dossier "demo" et le fichier "CMakeLists.txt" qui se trouvent dans  "External\Chipmunk"

    - Puis il faut ajouter au projet le dossier cocos2D qui se trouve dans le dossier cocos2d-iphone. . N'oublie pas de cocher l'option : "Copy items into destination group's folder (if needed)" (comme tout à  l'heure)

    - Enfin ajouter au projet le fichier image qui se trouve dans : cocos2d-iphone-0.7.2/cocos2d/Resources/images/fps_images.png . N'oublie pas de cocher l'option : "Copy items into destination group's folder (if needed)"

    - Pour finir, dans la fenetre de droite (dans xcode) vas dans Target -> Nom de l'app -> clique droit sur "Link Binary With Libraries" -> add -> Existing Framework. Puis tu ajoute l'OpenGLES et QuartzCore frameworks.

    Et voila aprés tu peut tester le helloword disponible sur le site que j'ai donné ci dessus.

  • DrakenDraken Membre
    juillet 2009 modifié #18
    Merci, je vais tenter l'opération ! 

    Cocos2D semble très sympathique. Autant utiliser une bibliothèque existante (et déjà  testée), que de tout réécrire en OpenGL, même si c'est très formateur. 

Connectez-vous ou Inscrivez-vous pour répondre.