目次 - SDL 3.0 API(機能別) - マウス - SDL_CreateCursor

SDL_CreateCursor

指定のビットマップデータとマスク(MSB形式)からマウスカーソルを生成する

ヘッダ

SDL3/SDL_mouse.h

構文

SDL_Cursor * SDL_CreateCursor(const Uint8 *data, const Uint8 *mask, int w, int h, int hot_x, int hot_y);

引数

const Uint8 *dataカーソルの各ピクセルの色
const Uint8 *maskカーソルの各ピクセルのマスク
intwカーソルの幅
inthカーソルの高さ
inthot_xカーソルの左上の実際のカーソルからの相対位置のX座標
inthot_yカーソルの左上の実際のカーソルからの相対位置のY座標

戻り値

(SDL_Cursor *) 成功のとき新しく生成されたカーソル, 失敗のときNULLを戻す. SDL_GetError()で詳細を知ることができる.

詳細

maskはMSB形式である.

カーソルの幅(w)は8の倍数の必要がある.

生成されるカーソルの黒と白は次の表に従う.

datamaskスクリーン上の結果
01
11
00透明
10可能なら反転, 不可能なら黒

この関数で生成されたカーソルはSDL_DestroyCursor()で解放する必要がある.

色のついたカーソルや, SDL_Surfaceからカーソルを作りたい場合は, SDL_CreateColorCursor()を使うべきである. または, カーソルを非表示にして, ゲームのレンダリングとして描画してもよいが, その場合はフレームレートに拘束される.

また, SDL_CreateSystemCursor()で既にある11のシステムカーソルが使える.

スレッドセーフ

この関数を呼べるのはメインスレッドのみである.

バージョン

SDL 3.2.0以降

サンプルコード

/* メーリングリストから拝借 */
/* 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"
};

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

関連項目

SDL Wikiへのリンク

SDL_CreateCursor - SDL Wiki