【问题标题】:Is there any way of drawing a variable rectangle using the Graphics class有什么方法可以使用 Graphics 类绘制可变矩形
【发布时间】:2013-01-04 03:34:38
【问题描述】:

我编写了一个简单的 Java 游戏,其中屏幕上有两个矩形,一个矩形移动,另一个保持不动,移动的矩形随着键盘箭头输入移动,可以向上、向下、向左或向右移动。我遇到的问题是在屏幕上绘制我的矩形,我的意思是我的 2 个矩形设置了我的变量,如图所示:

Rectangle rectOne = new Rectangle(shiftX, shiftY,90,90);
Rectangle rectTwo = new Rectangle(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);

我已经制作了一个渲染方法来在屏幕上绘制我想要显示的东西:

 public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
}

我遇到的问题是通过在渲染方法中编写代码在屏幕上显示我的矩形,我可以执行以下操作:

g.fillRect(x, y,90,90);
g.fillRect(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);

这会在屏幕上生成 2 个矩形,但我需要使用用变量编写的 Rectangle 代码来绘制矩形,有人告诉我这可以使用 Graphics2D 来完成,但我想知道是否有更简单的方法来使用图形功能,如果不行,请帮我设置一下吗?

提前谢谢你。

【问题讨论】:

    标签: java awt rectangles


    【解决方案1】:

    您可以轻松访问Rectangle 实例的属性:

    g.fillRect(rectOne.getX(), rectOne.getY(), rectOne.getWidth(), rectOne.getHeight());
    

    无论如何请注意,Graphics 对象在运行时通常是 Graphics2D 实例,因此这也可以轻松工作:

    Graphics2D g2d = (Graphics2D)g;
    g2d.fill(rectOne);
    

    【讨论】:

    • 感谢您回答我的问题。我现在有一个新问题,你可以帮我解决,我使用了 fillRect(rectOne.getX()... 并得到一个错误,说方法 fillRect 需要 (float,float,float.float) 而不是(double,double,double,double),我认为这可能是因为我的变量,我的 rectOne 需要 shiftX 和 shiftY 变量,而 rectTwo 需要 buckyPositionX 和 buckyPositionY,所有这些变量都是 int,如果我将它们更改为浮动我的 Rectangle 变量得到错误,但如果我将它们更改为 int,fillRect 会出现错误,请问我该如何解决?
    • 将它们转换为 double 或使用 Rectangle2D.Double 代替 Rectangle,这是一个内部类。
    • 我已经尝试过,但在 fillRect 下不断出现以下错误:“图形类型中的此方法 fillRect(float,float,float,float) 不适用于参数 (double,double,double ,双)"
    • 然后尝试使用 Rectangle2D.Float 类并请开始阅读文档和 API 参考。
    • 我之前也尝试过float方法,得到了同样的错误,这也是API参考docs.oracle.com/javase/6/docs/api吗?
    【解决方案2】:

    只需使用:

    g.fillRect(myRect.getX(), myRect.getY(), myRect.getWidth(), myRect.getHeight());
    

    其中myRect 是您要绘制的矩形。如果你有很多矩形要绘制,你甚至可以创建一个自定义方法drawRect(Graphics g, Rectangle myRect);

    使用Graphics2D 也不是那么困难,因为提供Graphics 对象通常是Graphics2D 对象:

    Graphics2D g2d = (Graphics2D) g;
    g2d.fill(myRect);
    

    【讨论】:

    • 感谢您回答我的问题。我现在有一个新问题,你可以帮我解决,我使用了 fillRect(rectOne.getX()... 并得到一个错误,说方法 fillRect 需要 (float,float,float.float) 而不是(double,double,double,double),我认为这可能是因为我的变量,我的 rectOne 需要 shiftX 和 shiftY 变量,而 rectTwo 需要 buckyPositionX 和 buckyPositionY,所有这些变量都是 int,如果我将它们更改为浮动我的 Rectangle 变量得到错误,但如果我将它们更改为 int,fillRect 会出现错误,请问我该如何解决?
    • 只需将double 的值转换为float,当您将它们传递给fillRect() 时,由于屏幕上的精度较低,您不会看到差异。
    • 我尝试了您的方法并将所有内容更改为浮动,但无论我尝试什么,我都会在 fillRect 下继续收到以下错误:“此方法 fillRect(float,float,float,float) 在类型图形中是不适用于参数 (double,double,double,double)"
    • 打开一个新问题,在其中陈述您的新问题,包括更新的代码,我们似乎无法在 cmets 中解决您的新问题...
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2022-10-30
    相关资源
    最近更新 更多