Autore Topic: [C] Creare una finestra e modificare il cursore del mouse con l'API di SDL2  (Letto 815 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.262
  • Ne mors quidem nos iunget
    • Mostra profilo
Di seguito il codice in linguaggio C per creare mediante le risorse del API di SDL2 una semplice finestra colorata e modificare l'aspetto del cursore del mouse quando entra nella predetta finestra.

Codice: [Seleziona]
#include "SDL2/SDL.h"
#include "SDL2/SDL_mouse.h"
#include "SDL2/SDL_timer.h"


/* Formato immagine XPM */
static const char *cursore[] = {
  /* width height num_colori caratt_per_pixel */
  "    32    32        3            1",
  /* colori */
  "X c #000000",
  ". c #FFFFFF",
  "  c None",
  /* pixel */
  "X                               ",
  "XX                              ",
  "X.X                             ",
  "XXXX                            ",
  "X...X                           ",
  "XXXXXX                          ",
  "X.....X                         ",
  "XXXXXXXX                        ",
  "X.......X                       ",
  "XXXXXXXXXX                      ",
  "X.....XXXXX                     ",
  "XXXXXXX                         ",
  "X.X X..X                        ",
  "XX  XXXX                        ",
  "X    X..X                       ",
  "     XXXX                       ",
  "      X..X                      ",
  "      XXXX                      ",
  "       X..X                     ",
  "       XXXX                     ",
  "        X..X                    ",
  "        XXXX                    ",
  "         XX                     ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "                                ",
  "0,0"
};

static SDL_Cursor *Crea_cursore()
{
  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 (cursore[4+row][col]) {
        case 'X':
          data[i] |= 0x01;
          mask[i] |= 0x01;
          break;
        case '.':
          mask[i] |= 0x01;
          break;
        case ' ':
          break;
      }

    }
  }
  sscanf(cursore[4+row], "%d,%d", &hot_x, &hot_y);

  return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);

}


int main() {

SDL_Window *window;
SDL_Renderer *rend;
SDL_Cursor *cursor;

SDL_Init(SDL_INIT_VIDEO);

window = SDL_CreateWindow(
        "Una finestra SDL2",               // titolo della finestra
        SDL_WINDOWPOS_CENTERED,            // posizione iniziale x
        SDL_WINDOWPOS_CENTERED,            // posizione iniziale y
        640,                               // larghezza, in pixel
        480,                               // altezza, in pixel
        SDL_WINDOW_RESIZABLE               // flag
        );

if (window == NULL) {
    printf("Impossibile creare una finestra: %s\n", SDL_GetError());
    return 1;
}

rend = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED);
if (rend == NULL) {
            printf("Impossibile creare un contesto rendering 2D per una finestra: %s\n", SDL_GetError());
            return 1;
    }

SDL_SetRenderDrawColor(rend, 255, 255, 0, 255);

SDL_RenderClear(rend);
SDL_RenderPresent(rend);

cursor = Crea_cursore();
if (cursor == NULL) {
    printf("Impossibile creare un cursore !");
}

SDL_SetCursor(cursor);

/* La finestra resta attiva per 10 secondi */
SDL_Delay(10000);

SDL_DestroyWindow(window);

SDL_Quit();


        return (0);

}
Il predetto codice C va compilato con la riga di comando:

 ~ $ gcc -o /percorso/programma  /percorso/sorgente.c -lSDL2
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Mi ha fatto tornare in mente la ridefinizione del cursore che si faceva con gli interrupt del DOS. :D
O addirittura la ridefinizione dei caratteri che facevo con il Commodore 16. :D :D
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.