Game Development Stack Exchange is a question and answer site for professional and independent game developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm working on a puzzle game, I've implemented a sprite class that uses an array of images and cycle through the array to draw each frame as required. This works fine!

Here's the original code:

    String number;
    Image sprite;
    ArrayList <ImageIcon> spriteAnimation = new ArrayList();
    int _imageCount = 0;
    int _animationStart = 0;

   public Sprite(String spriteType, int totalFrames){

        for(int x =1; x <= totalFrames; x++){
          spriteAnimation.add(new ImageIcon("Images/" + spriteType + "/" + spriteType + x + ".png"));
          System.out.println("Added " + spriteType + x + ".png to the ArrayList");   



    public void updateSprite(){

        sprite = spriteAnimation.get(_imageCount).getImage();

        System.out.println("image count is " + _imageCount);

        if(_imageCount < spriteAnimation.size()-1){

           _imageCount += 1;


           _imageCount = _animationStart;



    public Image getSprite(){

      return sprite;


However, after researching the difference between using the method above and using a single sprite sheet (there must be a good reason to use a sprite sheet I thought, and I was right) I've decided to use a single sprite sheet to represent all sprites in my game.

While I fully understand the principle of using the sprite sheet, I cannot get my head around actually drawing the selected part of the sprite sheet. I thought there might be a constructor in the ImageIcon or Image classes that would allow me to do something like pass in the size of the image to be drawn, the x and y co-ordinates to start at and the original sprite sheet as arguments - but apparently not. I'm obviously looking in the wrong place.

I would be very grateful if someone could advise me on how to do this in Java.

share|improve this question
Thanks, That was really helpful. do you want to put that as an answer or should I explain what I did myself (pretty much the same thing). – bot_bot Jan 26 '12 at 14:16
Actually I'm pretty sure this question needs to be closed, since those other questions already address the same issue (and maybe those questions should be migrated here), but I don't have nearly enough authority to make that happen... But I'm glad to have been of help! – Jannie Jan 26 '12 at 16:28
Maybe so, mods here are pretty on the ball, I'm sure they'll sort it soon enough. – bot_bot Jan 26 '12 at 19:08
up vote 0 down vote accepted

OK, as per Jannie Pieters suggested links, I have resolved the issue. I should have been looking at BufferedImage instead of Image and ImageIcon. Here is my revised class:

import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.imageio.*;

 * @author mal
public class Sprite2 {

    int _imageCount = 0;
    int _animationStart = 0;
    int _spriteSize;
    int _frameCount;

    BufferedImage[] sprites;

   public Sprite2(String sheetName,int frameCount, int columns, int rows, int frameSize){

       _frameCount = frameCount;


       BufferedImage spriteSheet = File("Images/" + sheetName + ".png"));
       buildSprites(spriteSheet, columns, rows, frameSize);

      }catch(IOException e){

           System.out.println("Image not found: line 50");



    public void triggerUpdate(){

        System.out.println("image count is " + _imageCount);

        if(_imageCount < _frameCount-1){

           _imageCount += 1;


           _imageCount = 0;



    private void buildSprites(BufferedImage spriteSheet, int columns, int rows, int frameSize){

        sprites = new BufferedImage[25];

        for(int x = 0; x < columns; x++){

            for(int y = 0; y < rows; y++){

                sprites[(x * 5) + y] = spriteSheet.getSubimage(
                x * (frameSize + 1),  // my sprite software adds 1 pixel border to each frame
                y * (frameSize + 1),



 public BufferedImage getSprite(int imageNumber){

    return sprites[imageNumber];


  public BufferedImage getSprite(){

    return sprites[_imageCount];


This works perfectly, now all I need to do is re-design the rest of the game, port it to android, market it well and make millions!


Lots of new concepts for me to study here.

share|improve this answer
Please accept your own answer. – aaaaaaaaaaaa Jan 28 '12 at 11:39

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.