3

現在、SDL2 を使用して、いくつかの図形 (正方形、円、三角形など) をキャンバスにドラッグし、回転させて移動できる簡単なプログラムを作成しています。各シェイプは、PNG ファイルから作成された SDL テクスチャによって視覚的に表現されます (SDL_image ライブラリの IMG_LoadTexture 関数を使用)。

問題は、テクスチャの特定のピクセルが透明かどうかを知りたいので、誰かが画像をクリックしたときに、何らかのアクションを実行する必要があるかどうかを判断できるようにすることです (クリックが非透明領域にあるため)。 . これは学校の課題であるため、いくつかの制限に直面しています。つまり、SDL2 ライブラリのみを使用し、画像が動的に選択されているため、問題のピクセルが透明であるかどうかを調べることができるマップを作成できません。さらに、元の画像から作成するこのタスクに SDL サーフェスを使用することを考えましたが、テクスチャを介して形状が回転しているため、機能しませんでした。

4

2 に答える 2

4

これは、レンダー ターゲットを使用して実現できます。

SDL_SetRenderTarget(renderer, target);
... render your textures rotated, flipped, translated using SDL_RenderCopyEx
SDL_RenderReadPixels(renderer, rect, format, pixels, pitch);

最後のステップでは、SDL_RenderReadPixelsを使用してレンダー ターゲットからピクセルを読み取り、目的のピクセルのアルファ チャネルがゼロ (透明) かどうかを判断する必要があります。レンダー ターゲットから必要な 1 つのピクセルだけを読み取ることも、テクスチャ全体を読み取ることもできます。どちらのオプションを使用するかは、実行する必要があるヒット テストの数、テクスチャが回転/移動する頻度などによって異なります。

于 2013-10-01T12:10:58.320 に答える
1

SDL_TEXTUREACCESS_STREAMING フラグを使用してテクスチャを作成し、ピクセル データを操作する前にテクスチャをロックする必要があります。特定のピクセルがテクスチャで透明かどうかを確認するには、次のように呼び出します。

SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

これにより、テクスチャがアルファ チャネルを認識できるようになります。

次のようなことを試してください:

SDL_Texture *t;

int main()
{
    // initialize SDL, window, renderer, texture
    int pitch, w, h;
    void *pixels;

    SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

    SDL_QueryTexture(t, NULL, &aw, &h);
    SDL_LockTexture(t, NULL, &pixels, &pitch);
    Uint32 *upixels = (Uint32*) pixels;

    // you will need to know the color of the pixel even if it's transparent
    Uint32 transparent = SDL_MapRGBA(SDL_GetWindowSurface(window)->format, r, g, b, 0x00);

    // manipulate pixels
    for (int i = 0; i < w * h; i++)
    {
        if (upixels[i] == transparent)
            // do stuff
    }

    // replace the old pixels with the new ones
    memcpy(pixels, upixels, (pitch / 4) * h);

    SDL_UnlockTexture(t);

    return 0;
}

ご不明な点がございましたら、お気軽にお問い合わせください。私はこのトピックの専門家ではありませんが。

さらに詳しい資料やチュートリアルについては、 http://lazyfoo.net/tutorials/SDL/index.phpをチェックしてください。チュートリアル 40 では、特にピクセル操作を扱います。

メソッド名に誤りがありましたらお詫び申し上げます(勝手に書きました)。

これが役に立ったことを願っています。

于 2014-05-25T07:25:03.643 に答える