Desarrollo de videojuegos en SDL VI - Ratón

Llegados hasta aquí, me gustaría recordar que nada de esto es mi autoría y viene del Tutorial de libSDL para la programación de videojuegos. Tampoco está escrito a modo de divulgación, sino a modo de constancia de lo aprendido en mi viaje y, por tanto, hasta para mi opinión, es un poco desastre las entradas escritas hasta ahora.


Ratón
Tiene dos tipos de eventos
De movimiento: contiene la posición del puntero, posición relativa respecto al anterior movimiento y si hay botón pulsado y cuál.
De pulsación: muy similar al de teclado.

typedef struct{
Uint8 type; // SDL_MOUSEMOTION
Uint8 state;
Uint16 x,y;
Uint16 xrel, yrel; //posición relativa
} SDL_MouseMotionEvent

state: este campo contiene los flags de los botones. Puede ser consultado con SDL_BUTTON() pasándole 1, 2 ó 3 para preguntar por dicho botón. (1= botón izquierdo, 2=botón central, 3=botón derecho).

También tenemos las constantes SDL_BUTTON_LMASK,SDL_BUTTON_MMASK Y SDL_BUTTON_RMASK.

typedef struct{
Uint8 type; //SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP
Uint8 button; // SDL_BUTTON_LEFT, SDL_BUTTON_RIGHT, SDL_BUTTON_MIDDLE
Uint8 state; //información redundante SDL_PRESSED, SDL_RELEASED
Uint16 x,y;
} SDL_MouseButtonEvent;

Para consultar el estado del ratón tenemos:
Uint8 SDL_GetMouseState(int *x, int *y);
Uint8 SDL_GetRelativeMouseState(int *x, int *y);

Podemos cambiar la apariencia del cursor teniendo en cuenta la estructura del cursor
struct{
SDL_Rect area; //rectángulo que define el área del cursor
Sint16 hot_x, hot_y; //punto de acción del cursor
Uint8 *data; //datos de pixel del cursor en blanco y negro
Uint8 *mask; //máscara del cursor en blanco y negro
Uint8 *save[2]; //lugar donde se almacenará el cursor
WMCursor *wm_cursor; //puntero al cursor del gestor de ventanas
}SDL_Cursor

Crear el cursor:
SDL_Cursor *SDL_CreateCursor(Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y);
El ancho debe ser múltiplo de ocho.
Data y mask son dos imágenes monocromáticas que se combinan. Los tamaños cumplen: vectorSize= h * w/8. Ejemplo: para almacenar un cursor de 32x32 se necesita 32 x 4 bytes.
Las combinaciones dan:
Data+Mask=resultado 0+0=transparente
0+1=blanco
1+0=color invertido si se puede, si no, negro
1+1=negro

Para setear el cursor:
void SDL_SetCursor(SDL_Cursor *cursor);

Si queremos guardar el anterior cursor:
SDL_Cursor *SDL_GetCursor(void);

Para liberarlo:
void SDL_FreeCursor(SDL_Cursor *cursor);

Si queremos colocar el cursor en un determinado sitio tenemos:
void SDL_WarpMouse(Uint16 x, Uint16 y);

Para mostrar/ocultar el cursor:
int SDL_ShowCursor(int toggle);
El cual devuelve el estado anterior. Los valores son:
  • cero: oculto
  • uno:visible

Etiquetas: ,,,. Guarda el enlace permanente.

Deja un comentario ^^