0

以下に、オブジェクトのセットをにペイントする簡単な方法を示しjava.awt.applet.Appletます。これは非常に簡単だと思いましたが、最終的にはアプレットの左上隅にオブジェクトを1つのピクセルとしてペイントするだけになります。アイデアは、DisplayクラスがGameObject、画面上の位置、サイズ、および外観に関する情報を拡張および含むかなり軽量なオブジェクトのセットを取り込み、それらをアプレットにピクセルごとに描画し、それらを比例して拡大および配置することです。指定されたディスプレイの高さと幅によって異なります。これをテストする際に、の幅と高さDisplayを128に設定し、2つのオブジェクトをに渡しますDisplay。これらは両方とも32ピクセルの正方形(両方ともと)で、1つは赤で、とを32返します。getWidth()getHeight()24getX()getY()、およびもう一方は青色で、とに16戻りgetX()ますgetY()。をaに入れ、Displayajavax.swing.JFrameを使用しjava.awt.BorderLayoutて、フレームを確実に埋めるようにします(add(display, java.awt.BorderLayout.CENTER);前述の範囲内で使用しますjavax.swing.JFrame)。

私が知る限り、これは、上端と左端から16ピクセルの青い32ピクセルの正方形と、もう一方の端によって隠されているか、他の部分を覆い隠している赤い32ピクセルの正方形を苦しめているはずです。ただし、取得するのは、の左上隅にある1つの赤または青のピクセルだけDisplayです。これは、ウィンドウがどれほど大きくても小さくても一貫しています。

コード


public class Display extends java.awt.applet.Applet
{
  private int w,h;
  private ArrayPP<GameObject> gameObjects;//ArrayPP is my way of making a dynamically expanding array. It is similar to Vector, but has many more useful methods I use elsewhere.

  public Display(int width, int height)
  {
    w = width;
    h = height;
  }

  public void addGameObject(GameObject go)
  {
    gameObjects.add(go);
  }

  public void refresh(java.awt.Graphics g)
  {
    int x, y, w, h;
    final int W = getWidth(), H = getHeight();
    for (GameObject go : gameObjects)//Draw all objects
      for (x = go.getX(), y = go.getY(), w = go.getWidth() + x, h = go.getHeight() + y; y < h; y++)//Draw all lines of the object
        for (x = go.getX(); x < w; x++)//Draw all the pixels on this line of the object
        {
          g.setColor(go.getColorForPixel(x, y));
          g.fillRect((x / this.w) * W, (y / this.h) * H, w/W, h/H);
        }
  }
}

 

public interface GameObject
{
  public int getX();
  public int getY();
  public int getWidth();
  public int hetHeight();
  public java.awt.Color getColorForPixel(int x, int y);
}

質問


java.awt.Graphics.fillRect(int x, int y, int width, int height)アプレットの左上隅だけをペイントするのはなぜですか?

解決


解決策は次の行にあります

          g.fillRect((x / this.w) * W, (y / this.h) * H, w/W, h/H);

ここで、整数計算によりすべての値が0になります。解決策は次のとおりです。

          g.fillRect((int)(((float)x/(float)this.w) *W),
                     (int)(((float)y/(float)this.h) *H),
                     (int)((float)W/(float)w),
                     (int)((float)H/(float)h));
4

1 に答える 1

4

問題はにあります

(x / this.w) * W

xとthis.wが両方とも整数でxの場合

xとwの1つまたは複数を浮動小数点に変換して、浮動小数点の除算を強制します。

(int)(((float)x/(float)this.w) *W)
于 2011-11-30T20:40:03.710 に答える