使用Java java.awt.Graphics的正确方法

时间:2013-06-03 20:08:18

标签: java swing awt 2d java-2d

大学邀请我在java中创建一个2D赛车游戏。 我们被告知在jframe中使用一个jcomponent。 我们告诉他们通过摇摆计时器更新游戏并在他们的适当位置调用repaint()。

我现在已经完成了但是通过我使用Graphics g一直很烦我。例如下面是我的游戏对象类,玩家和东西来自。

import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

/*
 * Provides The basic functionality of Displaying a game object on the screen
 * and methods able to change the image
 */
public class GameObject {

    public Vector position = new Vector();

    //image set up variables
    protected BufferedImage[] buffImage;
    protected ImageIcon icon = new ImageIcon();
    protected int numberOfImages;
    protected String filePrefix;
    protected String fileExt;

    //////////////interactive variables
    //image 
    protected int imageNumber = 0;

    public GameObject(int numOfImages, String filePre, String fileE)
    {
    //if this gives grief about constructors implement a custom initObject()                       method that can be overridden with super.
        this.numberOfImages = numOfImages;
        buffImage = new BufferedImage[numOfImages];
        filePrefix = filePre;
        fileExt = fileE;
    }

    //Adds images to array
    protected void initImageArray()
    {
        for(int i = 0; i <numberOfImages; i++)
        {
        try{
        buffImage[i] = (BufferedImage) ImageIO.read(new File(filePrefix  +     "/" + Integer.toString(i) + fileExt));
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }       
}

//Draws object to screen
public void draw(Graphics g, Component c){
    icon.setImage(getNextImage());
    icon.paintIcon(c, g, position.x, position.y);
}

//returns current image
protected BufferedImage getNextImage(){
    return buffImage[imageNumber];
}

//
protected void increaseImageNumber(){
    if(imageNumber < numberOfImages-1){
        imageNumber++;
    }
    else{
        imageNumber = 0;
    }
}

protected void decreaseimageNumber(){
    if(imageNumber > 0){
        imageNumber--;
    }else{
        imageNumber = numberOfImages - 1;
    }
}

}

具体而言,我认为即时通讯正在将相同的“Graphics g”参数传递给每个对象的draw方法。它的工作原理,但当我试图在背景中放置15颗星并将其imageIcon图像从一个缓冲的图像阵列更改为下一个时,一切都变得非常震撼。我把它归结为共享这个图形类。它也可能只是我们被告知不使用线程解决方案,但我认为任何新的comp应该能够处理17个图像更新和更改。更新计时器每33毫秒。

感谢任何能帮助向我解释实现我所追求的目标或正确使用/共享图形对象的最佳方式的人。

0 个答案:

没有答案