0

大学から Java での 2D レーシング ゲームの作成を依頼されました。jframe で 1 つの 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 イメージを 1 つのバッファリングされたイメージ配列から次のイメージ配列に変更しようとすると、すべてが非常にぎこちなくなりました。これは、この 1 つのグラフィック クラスを共有することに帰着します。スレッド化されたソリューションを使用しないように言われただけかもしれませんが、新しいコンプは 17 枚の画像の更新と変更を処理できるはずだと思います。更新タイマーは 33 ミリ秒ごとです。

私が求めていたものを達成するための最良の方法、またはグラフィックオブジェクトの適切な使用/共有を説明してくれる人に感謝します。

4

0 に答える 0