大学邀请我在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毫秒。
感谢任何能帮助向我解释实现我所追求的目标或正确使用/共享图形对象的最佳方式的人。