2009-03-07 8 views

Répondre

46

Si la zone d'image-objet est lue dans BufferedImage, la méthode getSubimage peut être utilisée pour obtenir une sous-image de la feuille d'image-objet.

Le procédé getSubimage prendra la x, y, et le width et height de la sous-image désiré, de sorte que peut être obtenu l'image-objet souhaité. Comme 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 for pour parcourir la grande image. Par exemple, si l'image d'image-objet est chargée à l'aide de la classe ImageIO (telle que la méthode read) et que chaque image-objet a une taille de 10 pixels sur 10 pixels, où 5 lignes par 5 colonnes d'images-objets, les images-objets peuvent être obtenu par le texte suivant:

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 
     ); 
    } 
} 

le hic est, bien sûr, le code ci-dessus ne fonctionnera que si tous les sprites sont de la même taille, donc il y aura besoin d'être un ajustement effectué afin de travailler pour la feuille de sprite donnée. (Comme le coin supérieur droit semble être de taille différente des autres.)

+0

du code s'il vous plaît? –

+0

Désolé à ce sujet, j'ai appuyé par erreur sur le bouton de réponse de poste. J'ajouterai plus à la réponse. – coobird

+1

ressemble à des index * i * et * j * doivent être échangés dans l'appel * getSubImage() * –

12

Si vous voulez simplement dessiner les sprites, la classe Graphics de Java a une méthode drawImage qui va tirer une zone spécifique de l'image pour toi. Vous n'avez qu'à spécifier l'image source, où vous voulez dessiner l'image-objet sur votre objet graphique (x, y, largeur, hauteur), et dans quelle image de l'image se trouve l'image-objet (x, y, largeur, hauteur) .

Si l'on suppose la largeur et la hauteur de l'image-objet sont de la même largeur et la hauteur que vous voulez dessiner sur la zone de dessin, vous pouvez définir votre propre méthode pour dessiner un cadre de sprite 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); 
} 

columns est combien de colonnes il y a dans votre feuille de sprite. Les deux premières lignes de la méthode calculent la position x quelconque de l'image-objet dans votre feuille.

Ces grands sprites dans votre feuille nécessiteront une manipulation spéciale. Vous pouvez les dessiner avec des tuiles (pour dessiner quatre sprites pour chacune des grandes images dans ce cas), ou vous pouvez déterminer manuellement quels x, y, largeur et hauteur, utiliser pour ces sprites.

Si votre feuille de sprite était une feuille régulière (tous les sprites de la même taille) et il a été disposé dans un 5 x 15 modèle que le vôtre est, vous dessinez le cadre 20 avec l'appel de méthode suivante

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 que vous voulez dessiner l'image-objet sur votre objet Graphics, 15 est le nombre de colonnes dans votre feuille de sprite, 19 est le cadre (numérotation commence à 0), et 25 est la largeur et la hauteur de chaque sprite (je me suis approché).