2012-03-21 4 views
2

私は最近数日でAndEngine(GLES2)を試しています。 ExamplesプロジェクトのSpriteExampleに問題があります。 サンプルプロジェクトのSpriteExampleでは、face_box.pngスプライトがきれいで鮮明に見えます。 しかし、同じコードとface_box.pngファイルを自分の別のプロジェクトにコピーすると、スプライトはピクセル化されて見えます。AndEngineのサンプルプロジェクトのスプライトの例です。私自身のプロジェクトにインポートするとピクセル化されています

コードはちょうど同じなので、いくつかの設定で問題があると思いますが、わかりませんでした。

私はGalaxy S2でICSを実行しています。

問題の原因は何ですか?

誰もが疑問に思った場合、これはコードです -

public class AndEngineMapActivity extends SimpleBaseGameActivity implements OnClickListener { 
// =========================================================== 
// Constants 
// =========================================================== 

private static final int CAMERA_WIDTH = 800; 
private static final int CAMERA_HEIGHT = 480; 

// =========================================================== 
// Fields 
// =========================================================== 

private ITexture mTexture; 
private ITextureRegion mFaceTextureRegion; 

// =========================================================== 
// Constructors 
// =========================================================== 

// =========================================================== 
// Getter & Setter 
// =========================================================== 

// =========================================================== 
// Methods for/from SuperClass/Interfaces 
// =========================================================== 

@Override 
public EngineOptions onCreateEngineOptions() { 
    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 

    return new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); 
} 

@Override 
public void onCreateResources() { 
    try { 
     this.mTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() { 
      @Override 
      public InputStream open() throws IOException { 
       return getAssets().open("gfx/face_box.png"); 
      } 
     }); 

     this.mTexture.load(); 
     this.mFaceTextureRegion = TextureRegionFactory.extractFromTexture(this.mTexture); 
    } catch (IOException e) { 
     Debug.e(e); 
    } 
} 

@Override 
public Scene onCreateScene() { 
    this.mEngine.registerUpdateHandler(new FPSLogger()); 

    final Scene scene = new Scene(); 
    scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f)); 

    /* Calculate the coordinates for the face, so its centered on the camera. */ 
    final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth())/2; 
    final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight())/2; 

    /* Create the face and add it to the scene. */ 
    final Sprite face = new Sprite(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager()); 
    scene.attachChild(face); 

    return scene; 
} 

@Override 
public void onClick(final ButtonSprite pButtonSprite, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(AndEngineMapActivity.this, "Clicked", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

// =========================================================== 
// Methods 
// =========================================================== 

// =========================================================== 
// Inner and Anonymous Classes 
// =========================================================== 

}

**更新:**私は

@Override 
public void onCreateResources() { 
    try { 
     this.mTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() { 
      @Override 
      public InputStream open() throws IOException { 
       return getAssets().open("gfx/face_box.png"); 
      } 
     }, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 

     this.mTexture.load(); 
     this.mFaceTextureRegion = TextureRegionFactory.extractFromTexture(this.mTexture); 
    } catch (IOException e) { 
     Debug.e(e); 
    } 
} 

とは異なる結果をテクスチャをロードしようとしたJoenEyeのアドバイスに続いて改善され、スマイリー顔の画像が少し良く見えますが、例のプロジェクトほどシャープではありません。

****別の更新:****

これらは私が得る結果の画像です。 - これは、これは私のプロジェクトから1であるオリジナルのサンプルプロジェクト(最良の結果)から1 This is the one from the original example project (best result) あるTextureOptions.BILINEAR_PREMULTIPLYALPHA なしThis is the one from my project without the TextureOptions.BILINEAR_PREMULTIPLYALPHA これはTextureOptions.BILINEAR_PREMULTIPLYALPHA(現在の結果と私のプロジェクトから一つです 双方向ところで

This is the one from my project with the TextureOptions.BILINEAR_PREMULTIPLYALPHA (current result - 興味深い結果、かつて私はそれでだけ、このクラスで別の空のプロジェクトを作成し、それが完璧に働いたと良く見え

をだから私はそれが設定problのいくつかの種類でなければならないと思います。私自身のプロジェクトで。

これ以上のアイデアを得るのはうれしいですね!

ありがとうございます!

+1

あなたはイメージをロードする奇妙な方法を使用していますが、AndEngineではこれまで見たことがありません。とにかく、適切なTextureOptionsを設定していない可能性があります。私はBitmapTextureのコンストラクタで新しいBitmapTextureAtlas(1024,512、TextureOptions.BILINEAR_PREMULTIPLYALPHA)を実行します。あなたのバージョンのAndEngineは異なるので、あなたの実装は異なるかもしれません。 – JohnEye

+0

ありがとうJohnEye私はBILINEAR_PREMULTIPLYALPHAであなたの助言に従い、結果が改善しました。しかし、例題プロジェクトの同じ例がはるかに鮮明に見えるので、まだ完璧ではありません。私はBilinearやNEARESTなどの他のオプションも試しましたが、Nearestはそれを悪化させました.BilinearはBILINEAR_PREMULTIPLYALPHAのようにしか見えませんでした。他に何ができるの? – Dror

答えて

1

最終的に私は新しいプロジェクトを開き、すべてのコードを新しいプロジェクトに移動することにしました。

これは機能します。

私はそれが悪い解決策だと知っていますが、それは問題を解決しました。

私がこの問題をもう一度考え出し、本当の解決策を見つけたら、ここでそれを更新します。

1

何らかの理由で使用する方法が必要でない限り、画像を読み込む標準的な方法を試してください。

mTexture = new BitmapTexture(1024, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
BitmapTextureRegionFactory.createFromAsset(mTexture, this, "face_box.png", 0, 0); 

テクスチャにイメージを自動的に配置するビルド可能なテクスチャを使用すると、おそらく問題がどこにあるのかを判断するのに役立ちます。

+0

提案していただきありがとうございますが、同じAPIで作業していない可能性があります。あなたのコードをコピーしようとすると、コンパイラは両方の行に不満を抱いています。これらのパラメータを受け入れるBitmapTextureコンストラクタはなく、 "BitmapTextureRegionFactory"は認識しません。私はGLES2を使用しているので、多分それはなぜですか?また、このメソッドを使ってテクスチャをロードする理由は、それがサンプルプロジェクトに含まれているだけなので、私は他の方法も知らないからです。私は何か間違ったことをしていますか?それにもかかわらず、ありがとうございました。 – Dror

+0

おっと、申し訳ありませんが、私はあなたのバージョンから同等のコードを使用すべきであるとは言いませんでした。 BitmapTextureAtlasでもかまいませんが、少し異なるパラメータが必要です。 BitmapTextureatlasTextureRegionFactoryを試してください。あなたのバージョンのAndEngineで動作するコンビネーションがあります。ソースコードを掘り下げたり、使用しているIDEが示唆していることを知る必要があります。 GLES2で劇的に変化しない限り、画像をロードするための好ましい方法は私の例に似ています。 – JohnEye

+0

もう一度、このコードでもう一度試しました。 - BitmapTextureAtlas a =新しいBitmapTextureAtlas(this.getTextureManager()、32,32、TextureOptions.BILINEAR_PREMULTIPLYALPHA); \t \t \t a.load(); \t \t \t mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(a、this.getAssets()、 "gfx/face_box.png"、0,0);それは何かに影響を与えたとは思わない:/それはスプライトやカメラが偶数ピクセルなどで動作しない可能性がありますので、画像が歪んでいます。これ以上のアイデアはありますか? – Dror

2

私は、サンプルプロジェクトと悪い結果を持つプロジェクトの違いは、スプライトのサブピクセル位置か、わずかに伸びたり/ゆがんだりすることです。ピクセル境界に正確にスプライトを描くように注意していますか?

フラグメントが描画されているときにフラグメントが完全にサンプリングされていないテクスチャで整列されていない場合、正確にはテクスチャに含まれていない色が生成される必要があります。たとえば、10x10ピクセルのテクスチャがあり、それをスクリーン座標(0.5、0.5)で描画する場合、各ピクセルは最も近いテクセル(NEARESTサンプリング)を選択するか、近くのテクセル(LINEARまたはBILINEARサンプリング) 。 NEARESTは、2つのテクセルが標本点から等距離にある場合には丸めの問題を抱えている可能性があります(これは、最初の悪い結果でわずかに醜い画像を説明するかもしれません)。 LINEARのサンプリングを使用すると、最も近いテクセルがブレンドされ、2番目の結果にわずかにぼやけたイメージが表示されることがあります。

小さなフィーチャを持つ小さな画像でこれを補正するには、必ずピクセル境界線と正確に並ぶように画像を描画する必要があります。アプリケーションでこれを実行しているかどうか確認できますか?

詳細については、「ピクセル完全サンプリング/レンダリング」のいくつかのGoogle検索を行い、より多くの情報を提供します。

EDIT、私はまた、説明もよく、これに気づいた:

final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth())/2; 
final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight())/2; 

あなたが画像ならば半画素によってオフ「の中心」の値を取得するためにあなたを引き起こす可能性があり、ここでは整数の除算をやっています幅/高さは奇数です。次に、この値をAndEngineに渡すと、中心が半ピクセルずれて、サブピクセルの問題が説明されます。

+0

こんにちはTimさん、ありがとうございました!うん、私はピクセルが完全に整列していないものが問題になるかもしれないと考えましたが、私はまだ理由を理解できません。私は400,400または0,0のような固定値にxとyの値を変更しようとしました。しかし、私はそれを399.5fに変更しても、少しでも改善されましたが、まだ十分ではありません。私は自分の活動のxmlレイアウトのテーマを変更しようとしましたが、それもいいことではありませんでした。これがどうやって悪くなったのか分かりませんでした。それ以上のアイデアがあるかもしれませんか?2.2.3ではなく4.0.3しかしそれは良くありませんでした。 – Dror

+0

残念ながら私は他のことは考えられません。私は、フードの中で何がやっているのかを知るためにAndEngineについて十分に知りません。ここで回答が見つからない場合は、フォーラムを試してみてください。 – Tim

関連する問題