大学から 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 ミリ秒ごとです。
私が求めていたものを達成するための最良の方法、またはグラフィックオブジェクトの適切な使用/共有を説明してくれる人に感謝します。