Question

J'ai cette feuille de sprite:

 Images-objets Pacman

Comment puis-je lire ce fichier image pour en extraire une partie et l'utiliser comme image-objet ?

Était-ce utile?

La solution

Si la zone des sprites est lue dans un < code> BufferedImage , le getSubimage peut être utilisée pour obtenir une sous-image de la feuille de l'image-objet.

La méthode getSubimage prend le x , le y et les largeur et hauteur de la sous-image souhaitée, afin que l’image-cible souhaitée puisse être obtenue. Étant donné que la plupart des sprites semblent avoir la même taille, je pense que la plupart d’entre eux peuvent être récupérés par une boucle imbriquée pour pour parcourir la grande image.

Par exemple, si l'image-objet est chargée à l'aide de ImageIO (telle que la read ), et chaque image-objet a une taille de 10 pixels sur 10 pixels, soit 5 lignes sur 5 colonnes. , les sprites peuvent être obtenus par ce qui suit:

BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.

final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        sprites[(i * cols) + j] = bigImg.getSubimage(
            j * width,
            i * height,
            width,
            height
        );
    }
}

La capture est, bien sûr, le code ci-dessus ne fonctionnera que si tous les sprites sont de la même taille, il faudra donc effectuer quelques ajustements pour pouvoir fonctionner pour la feuille de sprite donnée. (Comme le coin supérieur droit semble être de taille différente des autres.)

Autres conseils

Si vous voulez seulement dessiner les sprites, la classe Graphics de Java a un drawImage une méthode qui extraira une zone spécifique de l’image pour vous. Il vous suffit de spécifier l'image source, l'emplacement où vous souhaitez dessiner l'image-objet sur votre objet Graphics (x, y, largeur, hauteur) et le cadre de l'image dans lequel l'image-objet est située (x, y, largeur, hauteur). .

En supposant que la largeur et la hauteur de l’image-objet soient identiques à celles que vous souhaitez dessiner sur la zone de dessin, vous pouvez définir votre propre méthode pour dessiner une image-objet comme suit

void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
                     int columns, int frame, int width, int height)
{
    int frameX = (frame % columns) * width;
    int frameY = (frame / columns) * height;
    g2d.drawImage(source, x, y, x+width, y+height,
                  frameX, frameY, frameX+width, frameY+height, this);
}

colonnes correspond au nombre de colonnes de votre feuille de sprite. Les deux premières lignes de la méthode calculent la position x n’importe laquelle des y du cadre de l’image-objet dans votre feuille.

Les gros sprites de votre feuille nécessiteront un traitement spécial. Vous pouvez les dessiner avec des mosaïques (vous devriez donc dessiner quatre images-objets pour chacune des grandes images dans ce cas-ci), ou vous pouvez déterminer manuellement quels x, y, largeur et hauteur utiliser pour ces images-objets.

Si votre feuille de sprite était une feuille normale (toutes les sprites de la même taille) et qu'elle était disposée dans un motif de 5 x 15 comme le vôtre, vous dessineriez la 20e image avec l'appel de méthode suivant

Toolkit tk = Toolkit.getDefaultToolkit();    
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);

Ici, x et y sont la position sur laquelle vous voulez dessiner le sprite sur votre objet Graphics, 15 est le nombre de colonnes dans votre feuille de sprite, 19 est le cadre (la numérotation commence à 0) et 25 est la largeur et hauteur de chaque sprite (approximative).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top