我正在创建一个游戏,我有一个带有自定义Canvas的JFrame。 奇怪的是,当我将JFrame设置为 BE RESIZABLE 时,渲染结果如下所示:
但是当我将JFrame设置为 NOT BE RESIZABLE 时,结果如下所示:
将纹理的像素阵列添加到BufferedImage的像素阵列的方法如下所示:
// DRAW A TEXTURE ON THE CANVAS
public void drawTexture(Texture texture, Vector2i location) {
// Store the current texture coordinates
int tx = 0, ty = 0;
// Scroll through each pixel on the screen horizontally (begin at the X coordinate specified by the 'location')
for(int x = location.x; (x < getWidth() && x < location.x + texture.getWidth()); x++) {
// Scroll through each pixel on the screen vertically (begin at the Y coordinate specified by the 'location')
for(int y = location.y; (y < getHeight() && y < location.y + texture.getHeight()); y++) {
// Set each pixel to the color of the corresponding pixel on the Texture
pixels[x + y * getWidth()] = texture.getPixels()[tx + ty * texture.getWidth()];
// Add one to the texture Y coordinate
ty++;
}
// Reset the ty variable
ty = 0;
// Add one to the texture X coordinate
tx++;
}
}
BufferedImage
是在我的自定义画布的run方法中的循环内绘制的
自定义画布类(扩展Canvas
offcourse)实现Runnable
,它还包含一个自己的Thread
用于渲染。
我想知道是否有人知道为什么会这样,也许是如何解决它,因为我无法弄明白......
答案 0 :(得分:1)
嗯,&#34;应该是一个方形&#34; - 看起来好像是这样画的,因为背景被拉开&#34;在它下面。 (想象一下,试图在一张纸上画画,而有人慢慢将纸张拉开。)
所以,我猜测,设置窗口的线程正在慢慢地将其调整为正确的大小,而试图绘制你的方块的线程并不知道简单地利用移动的背景。
可能最简单的解决方案(如果这实际上就是为什么会这样做的话),就是在开始绘图之前简单地将你绘制方块的线程暂时休眠一会儿。
您可以使用Thread.sleep(1000)
执行此操作。
(不过,你不应该在实际的程序中这样做。)
如果是这样,您可以尝试获取帧上的访问权限并使其内容同步。
答案 1 :(得分:0)
好吧,我找到了正确的答案here,因为我发现Canvas比我设定的要大,所以我用Google搜索,这个答案解决了这两个问题。
引用the other question的答案:
交换
pack
和setResizable
来电,以便pack
成为第二个电话。
和
这是一个已知问题&#34;
问题here。