SDL_Cursor* SDL_CreateCursor(const Uint8* data, const Uint8* mask, int w, int h, int hot_x, int hot_y)
data | カーソルの各ピクセルの色 |
mask | カーソルの各ピクセルのマスク |
w | カーソルの幅 |
h | カーソルの高さ |
hot_x | カーソルの左上の実際のカーソルからの相対位置のX座標 |
hot_y | カーソルの左上の実際のカーソルからの相対位置のY座標 |
/* メーリングリストから拝借 */
/* XPMから新しいマウスカーソルを生成する */
/* XPM */
static const char *arrow[] = {
/* width height num_colors chars_per_pixel */
" 32 32 3 1",
/* colors */
"X c #000000",
". c #ffffff",
" c None",
/* pixels */
"X ",
"XX ",
"X.X ",
"X..X ",
"X...X ",
"X....X ",
"X.....X ",
"X......X ",
"X.......X ",
"X........X ",
"X.....XXXXX ",
"X..X..X ",
"X.X X..X ",
"XX X..X ",
"X X..X ",
" X..X ",
" X..X ",
" X..X ",
" XX ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"0,0"
};
static SDL_Cursor *init_system_cursor(const char *image[])
{
int i, row, col;
Uint8 data[4*32];
Uint8 mask[4*32];
int hot_x, hot_y;
i = -1;
for (row=0; row<32; ++row) {
for (col=0; col<32; ++col) {
if (col % 8) {
data[i] <<= 1;
mask[i] <<= 1;
} else {
++i;
data[i] = mask[i] = 0;
}
switch (image[4+row][col]) {
case 'X':
data[i] |= 0x01;
mask[i] |= 0x01;
break;
case '.':
mask[i] |= 0x01;
break;
case ' ':
break;
}
}
}
sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
}
maskはMSB形式である.
カーソルの幅(w)は8の倍数の必要がある.
生成されるカーソルの黒と白は次の表に従う.
data | mask | スクリーン上の結果 |
---|---|---|
0 | 1 | 白 |
1 | 1 | 黒 |
0 | 0 | 透明 |
1 | 0 | 可能なら反転, 不可能なら黒 |
この関数で生成されたカーソルはSDL_FreeCursor()で解放する必要がある.
色のついたカーソルや, SDL_Surfaceからカーソルを作りたい場合は, SDL_CreateColorCursor()を使うべきである. または, カーソルを非表示にして, ゲームのレンダリングとして描画してもよいが, その場合はフレームレートに拘束される.
また, SDL 2.0.0以降ではSDL_CreateSystemCursor()で既にある11のシステムカーソルが使える.