私はわずかな問題があります。私はSDL画面のピクセルを変更できません。SDLを使用してピクセルを変更するにはどうすればよいですか?
具体的には、次のコードは機能しません。
Uint32 * pixels = (Uint32 *) screen -> pixels;
screen -> pixels = pixels;
これはコンパイルされますが、何も表示されません。私は何が欠けていますか?
私はわずかな問題があります。私はSDL画面のピクセルを変更できません。SDLを使用してピクセルを変更するにはどうすればよいですか?
具体的には、次のコードは機能しません。
Uint32 * pixels = (Uint32 *) screen -> pixels;
screen -> pixels = pixels;
これはコンパイルされますが、何も表示されません。私は何が欠けていますか?
SDL_Surface構造の内容を変更しないでください。ピクセルをコピーしたい場合は、malloc()とmemcpy()を実行してください。
私の目標は、ピクセルで回り込むことです。 – nory
私たちは**変更してはならない** ** SDL_Surfaceの内容を明確にすることはできますか?ウィル/それはバグ/予期しない動作につながる可能性がありますか? – snapfractalpop
@snapfractalpop: 'SDL_video.h'ファイルから:"この構造体[SDL_Surface]は、 'pixels' [...] 'を除いて、読み取り専用として扱う必要があります。あなたが準拠していなければ、構造体の不変式が破られているので、ライブラリは正しく動作しません。 – rodrigo
私はSDL_Surfaceのピクセルを設定するために、次のような機能を持っていました。 32ビット、24ビット、16ビット、および8ビットの各サーフェスには2つのバージョンがあります。 1つのピクセルを設定したいだけなら、通常のバージョンを使用します。しかし、たくさんのピクセルを設定したい場合は、最初にサーフェスをロックしてから、ノーロックバージョン(サーフェスをロックしないため)を使用してロックを解除します。この方法では、表面を繰り返しロックしたりアンロックしたりすることはありませんが、これは高価な操作であると考えられています。 screen->pixels
の内容を操作
void PutPixel32_nolock(SDL_Surface * surface, int x, int y, Uint32 color)
{
Uint8 * pixel = (Uint8*)surface->pixels;
pixel += (y * surface->pitch) + (x * sizeof(Uint32));
*((Uint32*)pixel) = color;
}
void PutPixel24_nolock(SDL_Surface * surface, int x, int y, Uint32 color)
{
Uint8 * pixel = (Uint8*)surface->pixels;
pixel += (y * surface->pitch) + (x * sizeof(Uint8) * 3);
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
pixel[0] = (color >> 24) & 0xFF;
pixel[1] = (color >> 16) & 0xFF;
pixel[2] = (color >> 8) & 0xFF;
#else
pixel[0] = color & 0xFF;
pixel[1] = (color >> 8) & 0xFF;
pixel[2] = (color >> 16) & 0xFF;
#endif
}
void PutPixel16_nolock(SDL_Surface * surface, int x, int y, Uint32 color)
{
Uint8 * pixel = (Uint8*)surface->pixels;
pixel += (y * surface->pitch) + (x * sizeof(Uint16));
*((Uint16*)pixel) = color & 0xFFFF;
}
void PutPixel8_nolock(SDL_Surface * surface, int x, int y, Uint32 color)
{
Uint8 * pixel = (Uint8*)surface->pixels;
pixel += (y * surface->pitch) + (x * sizeof(Uint8));
*pixel = color & 0xFF;
}
void PutPixel32(SDL_Surface * surface, int x, int y, Uint32 color)
{
if(SDL_MUSTLOCK(surface))
SDL_LockSurface(surface);
PutPixel32_nolock(surface, x, y, color);
if(SDL_MUSTLOCK(surface))
SDL_UnlockSurface(surface);
}
void PutPixel24(SDL_Surface * surface, int x, int y, Uint32 color)
{
if(SDL_MUSTLOCK(surface))
SDL_LockSurface(surface);
PutPixel24_nolock(surface, x, y, color);
if(SDL_MUSTLOCK(surface))
SDL_LockSurface(surface);
}
void PutPixel16(SDL_Surface * surface, int x, int y, Uint32 color)
{
if(SDL_MUSTLOCK(surface))
SDL_LockSurface(surface);
PutPixel16_nolock(surface, x, y, color);
if(SDL_MUSTLOCK(surface))
SDL_UnlockSurface(surface);
}
void PutPixel8(SDL_Surface * surface, int x, int y, Uint32 color)
{
if(SDL_MUSTLOCK(surface))
SDL_LockSurface(surface);
PutPixel8_nolock(surface, x, y, color);
if(SDL_MUSTLOCK(surface))
SDL_UnlockSurface(surface);
}
これは古い質問/回答ですが、サーフェスの範囲外にあるピクセルを取得しようとするとプログラムがクラッシュすることを指摘したいと思います。たとえば、最後のピクセルが63であるため、64幅サーフェスからX座標64のピクセルを取得しようとするとクラッシュします。 – TyCobb
は、警告のカップルと、ピクセルを変更します。
まず、コードスニペットで示したように、screen->pixels
はサーフェスのピクセルデータへのポインタです。ピクセルデータそのものは、サーフェスの幅(surface->pitch
)とバイト単位のピクセルサイズに基づいて、そのポインタから線形配列としてアクセスされます。 ピクセルサイズ(別名奥行き)は、初期化中にSDL_SetVideoMode()
を使用して設定され、screen->format->BytesPerPixel
にあります。
変更する前に表面をロックする必要があります。
また、SDL_SetVideoMode()
に渡されたオプションによっては、変更内容を表示するためにSDL_Flip()
に電話する必要があります。
ピクセル操作の実例はhereです。
コメントで指摘したように、質問に記載されているコードは、実際には変更が画素データに行われていないされているように見える何かをするつもりはありません。
ない表面ではなく、レンダラ内のピクセルを操作SDL2バリアントを追加(および以前の回答とは異なり、画面の外のピクセルを操作しようとするとクラッシュしない)
void putPixelRGB(SDL_Renderer* renderer, int x, int y, unsigned char r, unsigned char g, unsigned char b)
{
SDL_SetRenderDrawColor(renderer, (Uint8)r, (Uint8)g, (Uint8)b, 255);
SDL_RenderDrawPoint(renderer, x, y);
}
なぜピクセルを変更?
新しい表面&ここに任意の特定のピクセルを変更していないのRect
// CODE ------------>
SDL_Surface *screen, *PIXEL = NULL;
SDL_Rect PIXELRect;
PIXELRect.h=5;
PIXELRect.w=5;
PIXELRect.x=100;
PIXELRect.y=100;
screen = SDL_SetVideoMode(640, 468, 32, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT);
while(running){
SDL_FillRect(screen, &PIXELRect, (#color));
}
イムを作ります。私は単純にすべてをコピーして、それをすべてコピーし直しています。フォーマットでは、どういう意味ですか? – nory
あなたのコードは何もしません。 'screen-> pixels = screen-> pixels;'。もちろん –
。私はちょうど回って、シンタックスと物事を知ることを得ることは – nory