0

我正在尝试使用下面的代码缩放图像(即来自精灵表)。

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).

当我缩放图像(通过更改宽度或高度)时,它开始显示其他帧?如果我将图像的宽度或高度保留为默认大小,则它可以工作。我认为通过定义源坐标和目标坐标它不会这样做。

澄清一下,图像是在一个内部框架上绘制/渲染的,比如大小为 640x480。另外,当我指的是框架时,我指的是精灵表,并且表中的每个图像都是一个框架。当然是用于动画。

需要澄清的另一件事是,图像不是绘制在组件之上的。只是一个内部框架。

我应该怎么解决这个问题?

屏幕截图

当一切都是默认的,这就是它的样子:http ://wisemindstudios.com/good.png

当我改变一些东西时:http ://wisemindstudios.com/bad.png

非常感谢!

4

2 回答 2

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);

在我的测试中,这导致了一个非常糟糕的结果。你真的应该看看更好的缩放算法;)

更新

我用了这个精灵表

精灵表

产生了这个输出

最后

现在我添加了帧号,将帧边界添加到渲染中以帮助它脱颖而出。

使用此方法可能会从上一帧/下一帧中失败的唯一原因是样式表错误(即帧大小不统一)或当前帧的计算错误。

于 2012-08-24T01:07:02.933 回答
0

我发现了问题。它在我的 getAnimatedPos 函数中。我传入了框架的新宽度和高度,而不是框架的原始宽度和高度(用于源坐标)。所以,这毕竟是一个非常简单的修复。

我确定这是绘图而不是我的代码有问题。但是,通常总是用户的错(或者在这种情况下是程序员)。那好吧。就是这样。

谢谢你的协助!

于 2012-08-24T06:15:53.990 回答