我正在尝试使用下面的代码缩放图像(来自精灵表)。
Point pos = new Point(100, 100); //this shows where to display the image
Rectangle a = getAnimatedPos(); //just gets the coordinates of a specified image (which works correctly)
g.drawImage(img, pos.x, pos.y, pos.x+getWidth(), pos.y+getHeight(), a.x, a.y, a.x+a.width, a.y+a.height, null);
the function getWidth() returns the width of the frame. The formula is (imageWidth/rows).
the function getHeight() returns the height of the frame. The formula is (imageHeight/cols).
当我缩放图像(通过改变宽度或高度)时,它会开始显示其他帧吗?如果我将图像的宽度或高度保留为默认大小,则可以使用。我认为通过定义源coords和dest coords它不会这样做。
为了澄清,图像正在内部框架上绘制/渲染,例如尺寸为640x480。另外,当我的意思是框架时,我正在谈论一个精灵表,并且工作表中的每个图像都是一个框架。当然是动画。
要澄清的另一件事是,图像不是在组件之上绘制的。只是一个内部框架。
我应该尝试解决这个问题?
屏幕截图
如果一切都是默认的,那就是它的样子:http://wisemindstudios.com/good.png
当我改变某些内容时:http://wisemindstudios.com/bad.png
非常感谢!
答案 0 :(得分:1)
我不知道这对你是否可行,但是。
基本上,我提取要渲染的帧,然后绘制它。
这可以避免我的可怜的小脑从所有参数中被破坏
Rectangle frameBounds = //... calculate the frame bounds to be extracted from the sprite sheet
BufferedImage cell = spriteSheet.getSubimage(frameBounds.x, frameBounds.y, frameBounds.width, frameBounds.height);
Rectangle renderBounds = //... calculate the location and size of the sprite to be rendered
g2d.drawImage(cell, renderBounds.x, renderBounds.y, renderBounds.width, renderBounds.height, this);
在我的测试中,这导致了非常糟糕的结果。你真的应该看一个更好的缩放算法;)
<强>已更新强>
我使用了这张精灵表
产生了这个输出
现在我添加了帧编号,将帧边界添加到渲染中以帮助它脱颖而出。
使用此方法从上一帧/下一帧中掉落的唯一原因是样式表错误(即帧大小不均匀)或当前帧的计算错误。
答案 1 :(得分:0)
我发现了这个问题。它在我的getAnimatedPos函数中。我传递了框架的新宽度和高度,而不是框架的原始宽度和高度(对于源坐标)。所以,毕竟这是一个非常简单的修复。
我确定绘图有问题而不是我的代码。但是,它通常始终是用户的错(或者在这种情况下是程序员)。那好吧。就是这样。
感谢您帮助我!