2009-09-09 10 views
0

Je suis un débutant dans le Quartz et je me bats pour comprendre ce que Apple dit est très facile et simple.Comment puis-je dessiner un sprite sur un arrière-plan en utilisant Quartz et CGLayers?

J'ai créé deux CGLayers: un pour un arrière-plan fixe et un autre pour un sprite. Je veux que ce sprite bouge.

Le contexte en arrière-plan et le contexte de l'image-objet sont tous les deux affichés hors-écran et j'aimerais que les deux soient visibles à l'écran.

Pour le faire - et je ne suis pas sûr que ce soit la bonne façon - je l'ai fait ce qui suit:

  1. J'ai créé un UIImageView
  2. J'ai capturé le contenu de la couche à l'aide

    outcomeImage = UIGraphicsGetImageFromCurrentImageContext();
    myView.image = L'image résultante;

Ceci me montre sur l'écran le contenu des deux couches de quartz.

Maintenant, j'ai deux problèmes:

  1. Cette approche est lent comme l'enfer
  2. Lorsque je déplace la couche, je dois répéter le code mentionné et DOING MEME CE, LA COUCHE ne bouge pas! !!!

Alors, s'il vous plaît, iPhone gourous là-bas, s'il vous plaît me dire s'il y a une autre façon de le faire avec du quartz et ce que je dois faire pour voir l'image-objet en mouvement !!!!

merci pour toute aide!

Répondre

2

La principale raison d'utiliser CALayer s est d'amener le GPU à composite directement sur la mémoire de l'écran. L'utilisation de UIGraphicsGetImageFromCurrentImageContext() donne des résultats dans l'image en cours de composition sur le GPU, transférée à la mémoire principale et ensuite de nouveau pour la dessiner sur l'écran qui sera vraiment lent. Ce que vous devriez faire à la place est de faire vos nouvelles couches sous-couches de la couche de votre point de vue:

[self.view.layer addSublayer:myNewLayer]; 

Pour un bon exemple de la façon d'utiliser CALayer s dans un jeu voir GeekGameBoard

+0

Merci! La raison pour laquelle j'utilise CGLayers est parce que je permets à l'utilisateur de transformer le sprite avec un pincement (zoom, rotation, etc.) et je vais enregistrer le résultat (background + sprite transformé) dans un fichier à la fin. Vous pouvez dire: pourquoi n'utilisez-vous pas un calayer, enregistrez toutes les transformations effectuées sur l'image-objet et appliquez-les à la version haute résolution plus tard en dehors de l'écran? Oui, c'est comme ça que j'ai commencé ça, mais après 3 jours de toutes sortes de problèmes, j'ai décidé cette autre approche. J'ai fait un googled autour et n'ai jamais trouvé comment faire cela et après avoir posté la question sur plusieurs forum personne n'a jamais répondu. – SpaceDog

+0

J'ai essayé de lire la documentation d'Apple pour Quartz, mais comme tous les docs d'Apple, ils sont faits par des chirurgiens du cerveau aux chirurgiens cérébraux, je veux dire, vous devez comprendre, car les docs sont vagues et je ris hystériquement à tous les exemples, car au lieu de le faire comme "exemple de déplacer une balle du point A au point B", Apple crée un exemple comme "comment créer une illustration vectorielle de la planète Terre avec 2 trillions de lignes de codes". .apple a la manie d'inonder le développeur avec 123 trillions de documents que personne ne comprendra jamais complètement. Les gars sont fous. – SpaceDog

+1

Si je vous comprends bien, vous souhaitez superposer une image-objet au-dessus d'une image, l'afficher et faire interagir l'utilisateur avec, puis enregistrer une version à plus haute résolution de l'image composite? Une façon de le faire est de rendre hiérarchiquement un CALayer et ses sous-couches directement dans votre image haute résolution à la fin. Nous faisons cela pour le rendu PDF dans le framework Core Plot (voir la classe CPLayer): http://code.google.com/p/core-plot/ –

Questions connexes