Získat informace obrazových hodin SDL2 textury

hlasů
2

Mám následující problém, ten, který jsem nemohl vyřešit vyhledávání na webu.

Jsem v současné době psaní jednoduchý program pomocí SDL2, kde si můžete přetáhnout některé tvary (čtverec, kruh, trojúhelník, etc) do plátna a otáčet je a pohybovat kolem nich. Každý tvar je reprezentována vizuálně SDL texturou, která je vytvořena ze souboru PNG (pomocí funkce IMG_LoadTexture z knihovny SDL_image).

Jde o to, že bych chtěl vědět, zda určitý pixel z textury je transparentní, takže když někdo klikne na obrázek bych mohl zjistit, jestli budu muset udělat nějakou akci (protože kliknutí na neprůhledná prostoru) nebo ne , Protože se jedná o nějaký úkol škola čelím určitá omezení, to znamená, že používat pouze SDL2 knihovny a nemohu mít nějakou mapu, kde jsem se podívat až v případě, že pixel v pochybnost je transparentní, protože obrazy jsou dynamicky vybrána. Dále jsem přemýšlel o použití SDL plochu pro tento úkol vytvářet je z originálních obrazů, ale vzhledem k tomu, že tyto tvary jsou pootočené o texturu, že to nebude fungovat.

Tam opravdu není moc dokumentace o SDL2 a nemohl jsem najít uspokojující odpověď kdekoliv, takže jakýkoliv pomoci si můžete dát bude vysoce ocenil.

Dík!!

Položena 01/10/2013 v 02:32
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Tuto operaci lze provést pomocí renderovacích targets .

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

S posledním kroku si přečíst pixelů z terče činí pomocí SDL_RenderReadPixels a pak přijít na to, v případě, že alfa kanál požadovaného pixelu je nula (transparentní), nebo ne. Si můžete přečíst jen jeden pixel, který chcete od cíle omítky nebo celého textura, kterou možnost budete mít závisí na počtu úspěšných testech je třeba provést, jak často je textura otáčí / přesouvat, atd.

Odpovězeno 01/10/2013 v 11:10
zdroj uživatelem

hlasů
2

Musíte vytvořit texturu pomocí příznaku SDL_TEXTUREACCESS_STREAMING a předtím, než je schopen manipulovat s daty pixelů zamknout strukturu. Chcete-li zjistit, zda určitý pixel průhledný v textuře se ujistil, že budete volat

SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);

to umožňuje texturu rozpoznávat alfa kanál.

Zkuste něco takového:

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

Máte-li jakékoli dotazy, neváhejte se zeptat. I když nejsem odborník na toto téma.

Pro další čtení a výukové programy, podívejte se na http://lazyfoo.net/tutorials/SDL/index.php . Cvičení 40 se zabývá manipulací pixelů konkrétně.

Omlouvám se, jestli existují nějaké chyby v názvy metod (napsal jsem to z vrcholu mé hlavy).

Doufám, že to pomohlo.

Odpovězeno 25/05/2014 v 06:25
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more