我基本上是在编程一个简单的游戏引擎,但是我的精灵/图像在应该出现的时候……或根本没有出现问题!
我将尽力使其尽可能简单。我有一个Sprite,GameEngine和Display类。在游戏循环中,我有一个方法可以设置Sprite的新位置(因此只需设置x和y变量)。接下来,我调用执行以下操作的transform方法:
public void transform() {
affineTransform.setToIdentity();
affineTransform.translate(x, y);
}
接下来,我在Sprite中调用draw方法:
public void draw() {
graphics2D.drawImage(image, affineTransform, jFrame);
}
最后,在我的线程中,然后在JFrame(Display类)上调用repaint()。我对该类的绘画方法如下:
public void paint(Graphics g) {
g.drawImage(backbuffer, insets.left, insets.top, this);
}
但是,除了黑屏外,什么也没有出现!
我也对Graphics g和Graphics2D以及何时使用两者之一感到困惑。 (覆盖的绘制方法使用Graphics g)。作为记录,我在类中确实有一个Graphics2D变量,该变量是通过调用backbuffer.createGraphics();创建的。
令我感到困惑的另一件事是这个AffineTransform ...我已经阅读了文档,但是我仍然对如何以及何时使用它-以及它似乎确切地工作感到完全困惑。是否有相对简单的解释?
当然这应该可行...我在这里错过了什么吗?
最佳答案
要回答部分问题:
From the Graphics2D JavaDoc
此Graphics2D类扩展了Graphics类,以提供对几何,坐标转换,颜色管理和文本布局的更复杂的控制。这是在Java(tm)平台上渲染二维形状,文本和图像的基本类。
本质上,使用Graphics2D
可以比使用Graphics
做更多的事情。对于Sun JVM 1.5 +,it should be safe to cast the Graphics
object you get in paint()
to Graphics2D
我刚刚注意到了这一点:为了便于记录,我在类中确实有一个Graphics2D变量,该变量是通过调用backbuffer.createGraphics();创建的。
您应该确保没有在以后丢弃的Graphics[2D]
画布上绘图(我将使用该术语指代Graphics[2D]
对象提供的可绘制区域)。如果要在单独的画布上绘制图像,则应确保将该图像绘制到实际的显示画布上。
我对AffineTransform
并没有很好的解释,但是也许这些会有所帮助?
http://www.javalobby.org/java/forums/t19387.html
https://secure.wikimedia.org/wikipedia/en/wiki/Affine_transformation
来自维基百科-通常,仿射变换由线性变换(旋转,缩放或剪切)和平移(或“移位”)组成。几个线性变换可以组合为一个。基本上,您可以使用此类执行诸如旋转,平移,缩放等操作。
关于java - 无法将图像移动到我想要的位置(并连续更新)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5211343/