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

(幅または高さを変更して)画像を拡大縮小すると、他のフレームが表示され始めますか?画像の幅または高さをデフォルトのサイズのままにすると、機能します。sourcecoordsとdestcoordsを定義することで、これはできないと思いました。

明確にするために、画像は640x480のサイズの内部フレームにペイント/レンダリングされています。また、フレームとは、スプライトシートのことで、シート内の各画像はフレームです。もちろんアニメーション用です。

明確にするもう1つのことは、画像がコンポーネントの上に描画されていないことです。ただの内部フレーム。

これを修正するにはどうすればよいですか?

スクリーンショット

すべてがデフォルトの場合、これは次のようになります: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 に答える