java.awt.Graphics.fillRect()行为不端

时间:2011-11-30 20:03:06

标签: java applet custom-painting

下面我有一个简单的方法将一组对象绘制到java.awt.applet.Applet上。我认为这非常简单,但它最终只将对象绘制为applet左上角的单个像素。我们的想法是,Display类接收一组相当轻量级的对象,这些对象扩展GameObject并在屏幕上包含有关它们的位置,大小和外观的信息,然后逐个像素地将它们绘制到applet上,根据指定的显示高度和宽度按比例拉伸和定位它们。在测试时,我将Display的宽度和高度设置为128,并将两个对象传递给Display,这两个对象都是32像素的正方形(32都返回getWidth() 1}}和getHeight()),其中一个为红色,为24getX()返回getY(),另一个为蓝色,为{{1}返回16 }和getX()。我将getY()放在Display中并使用javax.swing.JFrame确保它填充了框架(我在上述java.awt.BorderLayout中使用了add(display, java.awt.BorderLayout.CENTER);

据我所知,这应该是一个蓝色的32像素正方形,距离顶部和左侧边缘16像素,红色32像素正方形,要么被另一部分遮挡或遮挡。但是,我得到的只是javax.swing.JFrame左上角的单个红色或蓝色像素。无论窗口有多大或多小,这都是一致的。

代码


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); } 只绘制小程序的topleft角?

解决方案


解决方案在于读取

的行
java.awt.Graphics.fillRect(int x, int y, int width, int height)

其中整数计算导致所有值为0.解决方案如下:

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

1 个答案:

答案 0 :(得分:4)

问题在于

(x / this.w) * W

如果x和this.w都是整数和x

将x和w中的一个或多个转换为float以强制进行浮点分割。

(int)(((float)x/(float)this.w) *W)