Comment puis-je manipuler des feuilles de sprite avec des dimensions de sprite non uniformes?

14

Pour une feuille de sprite avec des dimensions de sprite non uniformes , comment puis-je obtenir les rectangles de délimitation pour chaque sprite individuel (c'est-à-dire les cases bleues dans l'image suivante / je n'ai dessiné que quelques exemples)?

Ce que je voudrais déterminer sont: offset_x, offset_y, width, height

entrez la description de l'image ici

Jusqu'à présent, je n'ai utilisé que des feuilles de sprites sur lesquelles tous les sprites ont des dimensions identiques . Dans ce cas, il suffit de spécifier le décalage x et y pour obtenir un sprite particulier. Cependant, pour les feuilles de sprites non uniformes dimensions , cela ne fonctionne pas.

EDIT: Après avoir lu les commentaires et les réponses, j'ai reformulé ma question pour la rendre plus inclusive. le processus réel d'utilisation d'une feuille de sprites dans un jeu. Auparavant, la question contenait les points pourquoi les gens produisent des feuilles de sprites de dimensions non uniformes et comment je peux y faire face.

Ben
la source
1
Il me semble qu'ils ont tous des tailles identiques, l'espace qui n'est pas rempli par la couleur n'est que des pixels avec l'alpha mis à zéro.
Derek

Réponses:

8

La plupart des feuilles de sprite de dimensions non identiques ont généralement une sorte de métadonnées avec l'emplacement de l'ancre du sprite. Il existe de nombreux outils qui permettent de supprimer les pixels alpha complets et de vous fournir les données dont vous avez besoin pour que ces données ne soient pas générées manuellement.

Si vous ne disposez pas de ces métadonnées, vous devez les créer vous-même. Le moyen le plus précis est celui que vous avez dit dans votre question, qui est de le faire à la main. Cela peut prendre un certain temps, mais c'est probablement plus rapide que de créer de nouveaux sprites.

Tetrad
la source
Ceci - alors que les approches basées sur la détection automatique ont leur utilité, en pratique, elles sont capricieuses et sujettes aux erreurs. Vous avez déjà besoin de métadonnées pour l'origine de l'image - objet (vos sprites n'ont une origine, non?), Donc des données supplémentaires est à peine trop d'un fardeau. L'artiste devrait toujours savoir mieux que votre application quelle est la taille des sprites individuels.
Steven Stadnicki
+1. Fournir des métadonnées avec les sprites est garanti pour le résoudre sainement .
Bartek Banachewicz
5

Vous pouvez effectuer une analyse sur l'image pour localiser les rectangles de délimitation de chaque image-objet, trier ces rectangles de délimitation (peut-être en augmentant au minimum X, puis Y) et vous aurez un ensemble de régions de délimitation qui correspondent aux cadres de la feuille d'image-objet.

Parce que ce processus peut être relativement coûteux, vous voudrez probablement le faire hors ligne, par exemple dans le cadre du processus de construction de votre jeu. Vous pouvez ensuite sérialiser les informations de la région englobante dans un fichier que vous stockez avec l'image de feuille de sprite correspondante. Au moment de l'exécution, vous chargez à la fois l'image et le fichier de définition des limites et vous disposez des informations dont vous avez besoin pour accéder à chaque sprite individuel.

C'est plus facile à dire qu'à faire, cependant. Essentiellement, vous voudrez faire détection des fonctionnalités et en particulier la détection des blobs qui sont des problèmes de vision industrielle. Vous pouvez également seuiller l'image (en noir et blanc) et utiliser une technique de détection des bords . Les mathématiques pertinentes derrière ces techniques sont bien mieux expliquées sur ces liens que moi, et dans le cas où vous ne vous sentez pas prêt à implémenter ces mathématiques vous-même, il existe quelques bibliothèques disponibles qui peuvent vous aider. L'ensemble de liens suivant m'a paru le plus prometteur:


la source
1
+1. Je suis d'accord que cela va nécessiter des compétences en perception informatique / manipulation d'image pour trouver les bonnes limites de sprite. Parfois, cela peut même être impossible, par exemple si vous regardez l'animation tortue à coquille. Il va être difficile de déterminer la bonne position par rapport aux autres images d'animation. Et quant au pourquoi : c'est très probablement à cause de l'utilisation optimale de l'espace de texture. Et généralement, un fichier avec les coordonnées doit être fourni avec une telle feuille de calcul, mais si vous le saisissez simplement à partir de la recherche d'images Google, il peut manquer de ces informations.
bummzack
Vous soulevez un bon point: ma réponse ne traite pas de la question des origines des sprites; cela conduirait simplement à trouver des rectangles de délimitation bien ajustés, et pour une feuille avec des sprites non uniformes, connaître l'origine de chaque cadre est assez important. Cela serait difficile à faire automatiquement à moins que vous ne fassiez certaines hypothèses (probablement spécifiques au domaine), par exemple que l'origine serait toujours (largeur / 2, Y maximum) ou quelque chose.
4

J'ai fait mon propre outil pour ce genre de feuille de sprites non uniforme. Il permet de modifier les décalages, et cetera. Voici une capture d'écran pour vous donner une idée:

entrez la description de l'image ici

Anonymouse
la source
Cela ressemble à vous créez une feuille de sprites uniforme contenant une seule animation à partir de l'animation non uniforme? Ou est-ce que j'interprète mal cela?
Ben
non, j'ouvre une feuille de sprites non uniforme et dessine un rectangle autour des sprites (qui se rétrécit automatiquement à la bonne taille). Une fois que j'ai créé une animation en répétant que je peux jouer chaque animation et ajuster le décalage en fonction de mes besoins.
Anonymouse
On dirait un outil très soigné que vous avez fait là-bas. Envie de partager l'outil?
eckyputrady
@eckyputrady, je suis désolé mais c'est loin d'être complet mais je recommande un autre outil (qui m'a essentiellement inspiré). Vous pouvez le trouver ici: colourclash.com/sprite_buddy/sprite_buddy.html
Anonymouse
0

Découvrez Texturepacker

http://www.texturepacker.com/

Il génère un fichier comme celui-ci (en fonction de vos paramètres préférés)

    {
    "filename": "image_front_1",
    "frame": {"x":1,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":2,"w":36,"h":40},
    "sourceSize": {"w":36,"h":40}
},
{
    "filename": "image_front_2.png",
    "frame": {"x":36,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":36,"h":42},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_3.png",
    "frame": {"x":71,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_4.png",
    "frame": {"x":106,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
}

En utilisant ces données, vous pouvez facilement saisir les rectangles séparés de l'image.

omgnoseat
la source
Ce n'est pas une question de savoir quelle technologie utiliser. À mon avis, il ne suffit pas de répondre simplement avec un lien vers un outil et un exemple de sa sortie.
MichaelHouse
-1

spritebuddy.com a très bien fonctionné pour moi. Impossible de trouver de l'aide sur le site lui-même, mais ce message de Google Groupes l' explique très bien. Il devine automatiquement les limites de vos sprites, vous permet de les ajuster ET vous permet de les organiser en séquences d'animation. Ensuite, il crache un fichier de métadonnées pour tout cela en JSON ou XML. Ensuite, tout ce que vous avez à faire est d'analyser ce fichier de données dans votre jeu pour obtenir les rectangles de délimitation corrects.

CletusW
la source
1
Ce n'est pas une question de savoir quelle technologie utiliser. De plus, cet outil a déjà été suggéré dans l'un des commentaires.
MichaelHouse
J'ai mis à jour ma réponse, mais je ne suis pas d'accord qu'elle ne répond pas à la question de l'OP: "Ce que je voudrais déterminer sont: offset_x, offset_y, largeur, hauteur." Que cela se produise ou non au moment de l'exécution du jeu (qui serait terriblement non performant) ou avant n'est pas spécifié. Quant à la "EDIT: [...] j'ai reformulé ma question pour la rendre plus inclusive par rapport au processus réel d'utilisation d'une feuille de sprites dans un jeu", c'est mon processus. Je génère le fichier JSON approprié à l'aide de spritebuddy, puis je l'analyse dans mon jeu pour obtenir les données dont j'ai besoin.
CletusW
1
@CletusW: de bonnes réponses expliqueraient pourquoi cet outil fonctionne si bien pour votre processus, ce qu'il fait et comment cela aide, etc. Je devrais pouvoir lire votre réponse et ensuite savoir comment sélectionner un outil ou écrire le mien. Si vous vous connectez à votre exemple préféré, ce n'est qu'un bonus, pas la chair de la réponse.
Sean Middleditch