2009-03-21 6 views
1

私は本質的にスペースインベーダーのゲームを再編集している大学のプロジェクトに取り組んでいます。これまでは、JPanelのサブクラス(バックグラウンドイメージ用)を含むメインのJFrameがあります。このサブクラスには、スプライトに使用しているJPanelの別のサブクラスが含まれています。しかし、私はそれを実行するとJFrameと背景JPanelは正常に動作しますが、スプライトを描画すると、サイズや位置を変更できない灰色の四角形が生成されます。ここで私は私のSpriteクラスのために持っているコードは次のとおりです。JPanelに追加されたときに画像がちょうど灰色の四角形になります

import java.awt.*; 
import java.io.File; 
import javax.swing.*; 


public class Sprite extends JPanel 
{ 
Image spriteImage; 
int speedX; 
int speedY; 
Point pos; 
final boolean MV_LEFT = false; 
final boolean MV_RIGHT = true; 

public Sprite(File _imageFile) 
{ 
    try { 
     spriteImage = javax.imageio.ImageIO.read(_imageFile); 
    } catch (Exception e) { 
     /* handled in paintComponent() */ 
    } 
    speedX = 1; 
    speedY = 1; 
    pos = new Point(100,100); 
} 

@Override 
protected void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    if (spriteImage != null) 
     g.drawImage(this.spriteImage, this.pos.x, this.pos.y, this.getWidth(), this.getHeight(), this); 
} 

public void move(boolean direction) 
{ 
    if (direction == true) 
    { 
     this.pos = new Point((pos.x + speedX), pos.y); 
     repaint(); 
    } 
    else 
    { 
     this.pos = new Point((pos.x - speedX), pos.y); 
     repaint(); 
    } 
} 
} 

私はそこで間違ったいくつかのものがあると確信しているが、paintComponent()メソッドのために、私はちょうど私が見つけた画像ハンドリングのチュートリアルのすべてをparrotedインターネットの周りにそれはまだ動作していないようです。私が忘れている巨大なものがありますか?

答えて

2

paintComponent()メソッドで見られる1つの問題は、イメージを描画する場所です。私の理解では、あなたのゲームの各スプライトは別々のJPanelです。したがって、paintComponentメソッドで渡されるGraphicsオブジェクト(g)は、各スプライトごとに異なります。 Graphicsオブジェクトをペイントキャンバスとして想像することができます。ゲーム全体に1つのGraphicsオブジェクトしかなく、このグラフィックスオブジェクトがゲームウィンドウ全体を表現していたとすると、ロジックは正しいでしょうし、すべてがうまくいくはずです。

ただし、ここの各スプライトには、スプライトに関連する高さと幅のある独自のグラフィックスオブジェクトがあります。この場合、paintComponentメソッドは次のようになります。

public void paintComponent(Graphics g) 
{ 
    if (spriteImage != null) 
     g.drawImage(this.spriteImage, 0, 0, getWidth(), getHeight(); // always at (0,0) 
} 

なぜですか?あなたのデザインでは、Spriteを動かしているので、ゲームウィンドウの周りのGraphicsオブジェクトです! drawImage()に渡す座標はGraphicsオブジェクトからの相対座標です。スプライトの左上隅(0,0)でペイントを開始したいと思っています。 Graphicsオブジェクトの境界から外れるようにイメージを描こうとしているので、あなたは灰色の四角形になります。

長期的には、絶対配置を使用していない限り、JPanelを親コンテナの内側に移動するのは簡単ではないため、このアプローチはうまくいかないと思います。 JPanelはかなり重量があり、作成して表示するために多くのリソースを必要とするため、スケーラビリティはあまり高くありません。

ゲームエリア全体を表す単一のJPanelを持っている方がよいでしょう。各スプライトはJPanelのサブクラスではないため、paintComponentメソッドはありません。あなたは次のようなことをすることができます:

public class GameArea extends JPanel 
{ 
    private final Collection<Sprite> sprites; // sprites to draw 

    public void paintComponent(Graphics g) 
    { 
     for(Sprite sprite : sprites) 
     { 
      sprite.drawOnSurface(g); 
     } 
    } 
} 

public class Sprite // no need to extend anything 
{ 
    /* Your other code looks OK */ 

    public void drawOnSurface(Graphics surface) 
    { 
     surface.drawImage(image, x, y, getWidth(), getHeight()); 
    } 
}