13

LibGDX を使用してプラットフォーマーを作成しています。プラットフォームに正方形のタイルを使用していますが、それらを描画すると、それらの間にギャップが生じるものがあります。ズームイン/ズームアウトしたり、ギャップの周りでカメラを動かしたりすると、位置が移動します。

詳細:

  • タイルは 32x32 で、32x32 と 64x64 の両方を試しました。
  • タイルは 32 ピクセル間隔で並べられます (たとえば、最初のタイルは x=0 y=0、2 番目のタイルは x=32 y=0 というように、x 方向と y 方向の両方で続きます)。
  • これを確認したので、ギャップはテクスチャ アーティファクトではありません。
  • TexturePackerパディング付きを使用しています。

私の最善の推測では、テクスチャをスクリーン座標に変換するときに問題が発生する可能性がありますが、これを修正する方法がわからず、解決策が見つかりませんでした。タイルのサイズとそれらを並べて精度を確認し、再確認しました。

誰かが同じ問題を抱えているか、それを修正する方法を知っていますか?

4

6 に答える 6

12

クラスのduplicatePaddingフィールドを に設定することで修正しました。TexturePacker.Settingstrue

コード例:

import com.badlogic.gdx.tools.texturepacker.TexturePacker;
import com.badlogic.gdx.tools.texturepacker.TexturePacker.Settings;

Settings settings = new Settings();
settings.maxWidth = 1024;
settings.maxHeight = 1024;
settings.duplicatePadding = true;

TexturePacker.process(settings, "source", "destination", "name");
于 2015-03-04T22:22:19.680 に答える
6

さて、私はあなたの一日を救うためにここにいます!

解決策は「エッジパディング」と呼ばれます。タイルセットを使用している場合は、これが機能することを保証できます。

個人的には、タイルセットの余白と間隔を調整できる Tiled を使用しています。これによる唯一の欠点は、このプラグインで GIMP を使用する必要があることです: http://registry.gimp.org/node/26044

このプラグインを使用すると、タイルセットにエッジ パディングを適用できます。醜いアーティファクトはもうありません。

于 2014-01-22T09:44:58.397 に答える
4

出血

ギャップ

短い答えは、おそらく NEAREST に設定する必要があるフィルターである可能性があるということです。

また、 Libgdxで作業チュートリアルを確認することもできます。

于 2013-09-05T22:37:17.513 に答える
3

それは「テクスチャ出血」と呼ばれます。タイルにパディングを追加して、テクスチャがにじんだときに正しいピクセル データを収集してギャップを埋める必要があります。

于 2014-12-05T13:15:55.677 に答える
2

この投稿で回答するのが少し遅いことはわかっていますが、解決策を探していたときにここに来ました。

しかし、私は、タイル間にランダムに現れるちらつきやギャップを取り除くためのはるかに簡単な方法を見つけました.

プレイヤーの位置を取得した非常に長い 10 進数にキャストを追加しただけです。

camera.position.set((int)robot.position.x, (int)robot.position.y, 0);

これにより、プレーヤーの動きが非常に奇妙になり、再び滑らかに動くようにするために、render メソッドにもキャストを追加しました。

batcher.draw(robotSprite, (int)robot.position.x, (int)robot.position.y, 16, 16);

ほら!私にとって完璧に機能しています。

于 2014-12-16T21:57:44.480 に答える
0

ここに解決策を投稿し、この問題についてLibgdxで試したことを投稿します。

--

T1。どこかからダウンロードしたオリジナルのスプライトシート(アトラスファイルなし)をパディング2に作成します。

A1. これは、アトラスのないスプライトシートを再パックすることは不可能です。スライス/スプリッター ツールを見つけたとしても、TiledMap(.tmx) 用に適切に再パックする必要がある画像の束である必要があります。

A1(更新)。@Nine Magics が提供するスクリプトは、これを行うための最良の方法です! (これを最終的な解決策として使用します)

--

T2。libgdx - nightyまたはgdx-toolgTiledMapPackerによって提供されるものを使用します。バッチ コードは次のようになります。

java -classpath "gdx.jar";"gdx-natives.jar";"gdx-backend-lwjgl.jar";"gdx-backend-lwjgl-natives.jar";"gdx-tiled-preprocessor.jar";"extensions/gdx-tools/gdx-tools.jar" com.badlogic.gdx.tiledmappacker.TiledMapPacker "PathToYourProject\android\assets\RawMap" "PathToYourProject\android\assets\Map" --strip-unused

A2. ファイルを分類するために複雑なフォルダー パスを使用している場合、 Tiledで読み取ることができなかった出力 .tmx .png。また、出力ファイルは によってロードに失敗する可能性がありますAtlasTmxMapLoader

--

T3。カメラ位置補正、カメラ位置を整数にします。@Julian や libgdx tiledmap の @strangecat が好きなコードは、Nearest フィルタリングでちらつきます

A3. 私はこのソリューションを問題なく使用しており、それらとは異なるコードを投稿しています。

    float cameraX = (int)(mainCamera.position.x * Game.PPM_X) / Game.PPM_X;
    float cameraY = (int)(mainCamera.position.y * Game.PPM_X) / Game.PPM_X;
    float cameraZ = mainCamera.position.z;
    mainCamera.position.set(cameraX, cameraY, cameraZ);

また、それをロードしますTmxMapLoader.Parameters

    TmxMapLoader.Parameters params = new TmxMapLoader.Parameters();
    params.textureMinFilter = Texture.TextureFilter.Linear;
    params.textureMagFilter = Texture.TextureFilter.Nearest;
    params.generateMipMaps = true;
    assetManager.load(TILED_MAP_SETS.FIRST_MAP, TiledMap.class, params);

PPMを使用していて、ピクセルごとに移動したい場合は、この整数補正をゲームに使用できます。そうでない場合は、位置を整数に変換するだけです。

私はこの問題を解決するために 1 日をほとんど無駄にしました。これらの調査がすべてのゲーム開発者に役立つことを願っています :)

編集(2018/04/21) Unityでも同じ問題が発生していることがわかりましたが、Libgdxにデフォルトで2x Anti-Alias設定があるかどうかはテストしていません。Libgdx は、アンチエイリアスをオフにすることで Unity として問題を解決する場合があります。

于 2017-09-24T17:24:20.683 に答える