0

uni要求我用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”参数传递给每个对象的绘制方法。它可以工作,但是当我尝试在背景中放置 15 颗星并将它们的 imageIcon 图像从一个缓冲图像数组更改为下一个时,一切都变得非常不和谐。我把它归结为分享这个图形类。也可能只是我们被告知不要使用线程解决方案,但我认为任何新的组件都应该能够处理 17 个图像的更新和更改。更新计时器是每 33 毫秒。

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

4

0 回答 0