2010-03-10 7 views
3

Je suis assez nouveau dans le monde des moteurs 2D. J'ai trouvé comment charger des images et les afficher comme des sprites et d'autres choses, mais il y a une question qui me dérange. Par exemple, lorsqu'une "fusée" frappe un objet, elle lui inflige des dégâts et laisse un cratère derrière elle. J'aimerais avoir le cratère sur cet objet. Cela nécessiterait de "sauter" certains des pixels de cette image lors du rendu, n'est-ce pas? Ma question est, comment feriez-vous une telle chose? Quelle donnée utiliseriez-vous pour sauvegarder ceci? Comment afficher un sprite "cassé"?Affichage des sprites "cassés"?

Répondre

2

Dans certaines situations, vous pouvez simplement dessiner une autre image-objet au-dessus de l'image-objet d'origine. Vous pouvez également basculer entre différents sprites en fonction de l'état de l'objet.

3

Créez un sprite sheet.

Ceci contiendra toutes les spirites votre objet, dans ce cas la fusée. Certaines de ces images seraient de la fusée se brisant en plusieurs morceaux, le feu etc ...

Ensuite, quand votre objet frappe, vous jouez l'animation de collision. Votre méthode fonctionnerait techniquement, mais c'est exagéré. L'utilisation d'une feuille de sprite est simple, plutôt que de dessiner une image massive, vous venez de dessiner une partie de la feuille, et de jouer l'incrément d'animation dans l'axe X et Y de la feuille. Cela nécessite naturellement que la feuille soit disposée même, mais ce n'est pas trop de travail.

0

Lent, mais probablement assez rapide.

public static void Fill(this Texture2D t, Func<int, int, Color> perPixel) 
     { 
      var data = new Color[t.Height * t.Width]; 
      for (int y = 0; y < t.Height; y++) 
       for (int x = 0; x < t.Width; x++) 
       { 
        data[x + (y * t.Width)] = perPixel(x, y); 
       } 
      t.SetData(data); 
     } 
0

je travaillais sur quelque chose comme ça sur un jeu Java mobile, un vers/clone de la terre brûlée (en fait basé sur GunBound).

Vous ne "sautez" pas les pixels pour quitter un cratère. Vous changez les pixels dans le bitmap de votre planète, de sorte que le cratère est maintenant une partie permanente de votre planète. Je suppose que vous savez tout sur les bitmaps, blitting transparent et hit test.

Pour créer un cratère, j'ai utilisé un algorithme de remplissage de cercle et rempli la "zone d'explosion" avec l'arrière-plan ou la couleur transparente. Par conséquent, lorsque vous effectuez un test de réussite, vous devez le faire deux fois. Un test de hit de boîte de vitesse pour la vitesse, puis un test de hit par pixel lorsque les boîtes englobantes se chevauchent.

1

Je vois que vous avez étiqueté ceci avec XNA, alors supposez que c'est votre API (bien que cette réponse puisse très bien être appliquée à n'importe quelle approche OpenGL/D3d avec des appels appropriés). Si vous voulez le faire d'une manière élégante, je suggère d'utiliser un RenderState temporaire. Vous devez passer au nouveau RenderState et dessiner votre texture d'arrière-plan d'origine, puis dessiner des sprites de cratère par-dessus (vous pouvez modifier les propriétés AlphaSourceBlend et AlphaDestinationBlend du RenderState pour créer l'effet soustractif que vous recherchez).

Une fois le dessin terminé, vous pouvez facilement récupérer le RenderState en tant que texture à l'aide de la fonction GetTexture(). Gardez à l'esprit que si vous changez les modes de fusion, votre SpriteBatch devrait fonctionner en mode "immédiat" (j'oublie le terme XNA, mais celui où il ne commande pas les sprites pour plus d'efficacité) il sera réinitialisé de manière inattendue.