【问题标题】:How to organize graphics and drawing in Java如何在 Java 中组织图形和绘图
【发布时间】:2012-08-13 03:55:36
【问题描述】:

我一直在使用 Java 图形编程,我觉得我了解它的工作原理。

我不喜欢/尚未掌握的一件事是如何管理在面板上绘制大量图形(形状、图像等)。

我目前正在阅读的所有书籍/教程都将您想要完成的所有绘图放入paintCompnents/paint 函数中。例如,

public void paint(Graphics g){
    //do stuff here....
}

事情是我有太多想要画的东西,以至于将一堆代码放在一个函数中很难看,难以阅读,并且难以管理/编辑......

我了解 OOP,但我是图形编程的新手。我应该如何管理我想在画布上绘制的所有“数据”(确切地说是 JPanel)。我目前正在调用 paint(..) 方法中的函数。例如,

public void paint(Graphics g){
    drawCars(g, x,y,wid,len,etc,etc);
}

那么……

drawCars(Graphics g, int x, int y, int wid, etc etc){
    g.drawSomething(x,y,wid,len,)
    g.drawAnotherThing(x+90,y+60,etc, etc);
}

问题出在我的 JPanel 类中,我必须管理所有这些杂散功能。

这仅用于绘制“一页”的东西。我无法想象必须切换视图或游戏屏幕,我可以在页面上显示一堆动画。

我只是在寻找有关如何在 java 中组织由 paint() 方法绘制的代码的方向,所以我不会因为看我的旧工作而发疯。任何教程、书籍(尤其是免费的)或好的代码都将非常感谢。

到目前为止,我发现的所有内容都是关于教授您“可以”用 graphics/graphics2D/java 做什么,但我正在寻找专家建议的组织/样式提示..

【问题讨论】:

    标签: java swing graphics awt


    【解决方案1】:

    为您绘制的逻辑事物(例如汽车)创建类。每个对象都会知道它需要知道的所有内容,以便像位置、大小和颜色一样进行自我绘制。如果你让所有这些对象实现一个通用接口,你就可以把它们放在一个列表中。当需要绘制它们时,您遍历列表并调用每个对象的绘制方法。

    除了该文档之外,绘图代码很好,因此对于每个绘图语句,它都清楚它是实际绘图的哪一部分。

    【讨论】:

    • 你的意思是让类实现一个draw(paint())方法并遍历它们?在这种情况下,我将不得不使用我的 Graphics/Graphics2D obj 并将其传递给这些类(因此,paint 方法会在当前面板上绘制)
    • 您可以将 Graphics 对象传递给 draw/paint 方法。
    • 尝试并考虑分层绘画。要么创建一系列允许您以逻辑方式复制这些层的方法,要么正如 Eelke 建议的那样,使用类来分离这些层。这归结为您设计的复杂性
    • 谢谢,这就是我希望做的事情。你有什么推荐的读物/材料吗? @MadProgrammer
    【解决方案2】:

    拆分它,在 g 中调用一个可以绘制某个部分的方法。 如果你画的是房子,而不是画矩形,等等

    drawRoof(g);
    drawDoor(g);
    

    然后在这些你有像drawRect这样凌乱的东西......

    这有帮助吗?我可能会误解您在寻找什么...

    【讨论】:

    • 这就是我目前正在做的事情。这只是因为当我有一堆东西时,它会变成很多功能,当我想做碰撞检测时,我没有对象可以快速获取数据,而是我必须通过我的函数并确定它们的空间'重新占用……等等……
    • 明白了,我认为@Eelke 有这样的想法,然后您可以存储更多信息并轻松访问。那么您的问题是否得到了解答,还是您还在寻找更多?
    • 我想我明白了。我没有意识到可以使用不同的类(非 jpanel 类)来创建形状并绘制它们。然后最后在我当前的 jpanel 类的paint方法中实例化这个类。
    • 是的,你甚至可以添加像doesContain(x,y)这样的属性来查看图像中是否包含一个点,祝你好运:)
    • 谢谢@Zeb,您不会碰巧知道有关该主题的任何好的代码/书籍/tuts吗?
    猜你喜欢
    • 2011-06-24
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多