java.awt.Graphics.fillRect () плохо себя ведет - PullRequest
0 голосов
/ 01 декабря 2011

Ниже у меня есть простой метод для рисования набора объектов на java.awt.applet.Applet.Я думал, что это было очень просто, но в конечном итоге это только рисование объектов одним пикселем в верхнем левом углу апплета.Идея состоит в том, что класс Display принимает набор довольно легких объектов, которые расширяют GameObject и содержат информацию об их расположении, размере и внешнем виде на экране, а затем рисуют их попиксельно на апплете, растягивая ирасполагая их пропорционально в зависимости от указанной высоты и ширины дисплея.При тестировании я установил ширину и высоту Display равным 128 и передал два объекта в Display, которые представляют собой квадраты по 32 пикселя (оба возвращают 32 для getWidth() и getHeight())один красный и возвращает 24 для getX() и getY(), а другой синий и возвращает 16 для getX() и getY().Я помещаю Display в javax.swing.JFrame и использую java.awt.BorderLayout, чтобы убедиться, что он заполняет рамку (я использую add(display, java.awt.BorderLayout.CENTER); в пределах вышеупомянутого javax.swing.JFrame).

Насколько я могу судить,это должно быть закрашено синим квадратом 32 пикселя, который находится в 16 пикселях от верхнего и левого краев, и красным квадратом 32 пикселя, который либо скрыт, либо скрыт частью другого.Тем не менее, все, что я получаю, это один красный или синий пиксель в верхнем левом углу 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));

1 Ответ

4 голосов
/ 01 декабря 2011

Проблема заключается в

(x / this.w) * W

Если x и this.w оба являются целыми числами и x

Преобразование одного или нескольких из x и w в float, чтобы вызвать деление с плавающей точкой.

(int)(((float)x/(float)this.w) *W)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...