SDL2 C++ Como puedo poner un rectangulo encima de una imagen?

Iniciado por @XSStringManolo, 29 Mayo 2019, 08:38 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Tengo esto hecho, la segunda imagen que cargo tiene 4 cuadrados a los que quiero rebordear y que cuando le haga click ejecuten diversos codigos. Alguien sabe como se hace?
estuve mirando por los ejemplos de Foo pero los del raton no me compilan. Y solo hay un ejemplo con cuadrados. Ando a ver si lo doy hecho pero se me complica. Tengo otro codigo hecho, pero solo se ven los cuadrados, no se como cargarlos encima de las imagenes.

Código (cpp) [Seleccionar]

#include <SDL.h>
#include <iostream>

using namespace std;

const short int ANCHO_VENTANA = 454;
const short int ALTO_VENTANA = 340;
const int TIEMPO_DELAY_IMAGEN_UNO = 3000;
const int TIEMPO_DELAY_IMAGEN_MENU = 5000;

SDL_Window* pVentana = NULL;
SDL_Surface* pSuperficie = NULL;
SDL_Surface* pImagen = NULL;

bool Inicializar();

bool CargarImagen();

bool CargarImagenMENU();

void Cerrar();

void CargarImagenEnMain();

void CargarImagenMENUEnMain();

//-------------------------------------------------------------------------------


int main(int argc, char* args[])
{
if (!Inicializar())
{
cout << "Error al inicializar en main" << endl;
}

else
{
CargarImagenEnMain();
CargarImagenMENUEnMain();
}

Cerrar();
return 0;
}


//-------------------------------------------------------------------------------


bool Inicializar()
{
bool inicializado = true;
if (SDL_Init(SDL_INIT_VIDEO)<0)
{
cout << "Error Inicializando Video: " << SDL_GetError() << endl;
inicializado = false;
}

else
{
pVentana = SDL_CreateWindow("RPG DRAGON",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ANCHO_VENTANA, ALTO_VENTANA,/*SDL_WINDOW_FULLSCREEN &&*/ SDL_WINDOW_SHOWN);
if (pVentana == NULL)
{
cout << "Error al crear la ventana" << endl;
}

else
{
pSuperficie = SDL_GetWindowSurface(pVentana);
}
}
return inicializado;
}

//-------------------------------------------------------------------------------

bool CargarImagen()
{
bool inicializado = true;
pImagen = SDL_LoadBMP("DragonRPGINTRO.bmp");
if (pImagen==NULL)
{
cout << "Error al cargar Imagen1" << endl;
inicializado = false;
}
return inicializado;
}

//-------------------------------------------------------------------------------

bool CargarImagenMENU()
{
bool inicializado = true;
pImagen = SDL_LoadBMP("DragonRPGMENU.bmp");
if (pImagen==NULL)
{
cout << "Error al cargar ImagenMENU" << endl;
inicializado = false;
}
return inicializado;
}

//-------------------------------------------------------------------------------

void Cerrar()
{
SDL_FreeSurface(pImagen);
pImagen = NULL;

SDL_DestroyWindow(pVentana);
pVentana = NULL;

SDL_Quit();
}

//-------------------------------------------------------------------------------

void CargarImagenEnMain()
{
if (!CargarImagen())
{
cout << "Error al cargar la imagen en main." << endl;
}

else
{
SDL_BlitSurface(pImagen, NULL, pSuperficie, NULL);
SDL_UpdateWindowSurface(pVentana);
SDL_Delay(TIEMPO_DELAY_IMAGEN_UNO);
}
}

//-------------------------------------------------------------------------------

void CargarImagenMENUEnMain()
{
if (!CargarImagenMENU())
{
cout << "Error al cargar la imagenMENU en main." << endl;
}

else
{
SDL_BlitSurface(pImagen, NULL, pSuperficie, NULL);
SDL_UpdateWindowSurface(pVentana);
SDL_Delay(TIEMPO_DELAY_IMAGEN_MENU);
}
}

RayR

No programo en SDL (alguna vez la vi muy por encima, pero nada más) pero dando un vistazo rápido veo que lo del mouse es sencillo, muy similar a otras APIs. No sé por qué no te compile, pero básicamente es procesar el mensaje SDL_MOUSEBUTTONDOWN o SDL_MOUSEBUTTONUP. Luego, SDL_GetMouseState te devuelve las coordenadas del clic. Para ver si se dio dentro de un cuadro, puedes crear 5 SDL_Rect: 4 con las coordenadas y tamaños de cada cuadro, y uno con las coordenadas del mouse y ancho y alto en 1 pixel. Luego, comparas éste último con cada uno de los otros 4 mediante SDL_IntersectRect, que devuelve SDL_TRUE si las coordenadas se encuentran dentro.

Lo de los cuadrados, no sé a qué te refieras con cargarlos encima de las imágenes. Si es a dibujarlos, podría ser con SDL_RenderDrawRect, pero no sé si es lo que quieras.

@XSStringManolo

Probare con esas funciones. El problema es que cuando dibujo los rectangulos, la superficie me sobrescribe la superficie de la imagen mostrada. Sigo probando!