Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: @XSStringManolo en 29 Mayo 2019, 08:38 am



Título: SDL2 C++ Como puedo poner un rectangulo encima de una imagen?
Publicado por: @XSStringManolo en 29 Mayo 2019, 08:38 am
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
  1. #include <SDL.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. const short int ANCHO_VENTANA = 454;
  7. const short int ALTO_VENTANA = 340;
  8. const int TIEMPO_DELAY_IMAGEN_UNO = 3000;
  9. const int TIEMPO_DELAY_IMAGEN_MENU = 5000;
  10.  
  11. SDL_Window* pVentana = NULL;
  12. SDL_Surface* pSuperficie = NULL;
  13. SDL_Surface* pImagen = NULL;
  14.  
  15. bool Inicializar();
  16.  
  17. bool CargarImagen();
  18.  
  19. bool CargarImagenMENU();
  20.  
  21. void Cerrar();
  22.  
  23. void CargarImagenEnMain();
  24.  
  25. void CargarImagenMENUEnMain();
  26.  
  27. //-------------------------------------------------------------------------------
  28.  
  29.  
  30. int main(int argc, char* args[])
  31. {
  32. if (!Inicializar())
  33. {
  34. cout << "Error al inicializar en main" << endl;
  35. }
  36.  
  37. else
  38. {
  39. CargarImagenEnMain();
  40. CargarImagenMENUEnMain();
  41. }
  42.  
  43. Cerrar();
  44. return 0;
  45. }
  46.  
  47.  
  48. //-------------------------------------------------------------------------------
  49.  
  50.  
  51. bool Inicializar()
  52. {
  53. bool inicializado = true;
  54. if (SDL_Init(SDL_INIT_VIDEO)<0)
  55. {
  56. cout << "Error Inicializando Video: " << SDL_GetError() << endl;
  57. inicializado = false;
  58. }
  59.  
  60. else
  61. {
  62. pVentana = SDL_CreateWindow("RPG DRAGON",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ANCHO_VENTANA, ALTO_VENTANA,/*SDL_WINDOW_FULLSCREEN &&*/ SDL_WINDOW_SHOWN);
  63. if (pVentana == NULL)
  64. {
  65. cout << "Error al crear la ventana" << endl;
  66. }
  67.  
  68. else
  69. {
  70. pSuperficie = SDL_GetWindowSurface(pVentana);
  71. }
  72. }
  73. return inicializado;
  74. }
  75.  
  76. //-------------------------------------------------------------------------------
  77.  
  78. bool CargarImagen()
  79. {
  80. bool inicializado = true;
  81. pImagen = SDL_LoadBMP("DragonRPGINTRO.bmp");
  82. if (pImagen==NULL)
  83. {
  84. cout << "Error al cargar Imagen1" << endl;
  85. inicializado = false;
  86. }
  87. return inicializado;
  88. }
  89.  
  90. //-------------------------------------------------------------------------------
  91.  
  92. bool CargarImagenMENU()
  93. {
  94. bool inicializado = true;
  95. pImagen = SDL_LoadBMP("DragonRPGMENU.bmp");
  96. if (pImagen==NULL)
  97. {
  98. cout << "Error al cargar ImagenMENU" << endl;
  99. inicializado = false;
  100. }
  101. return inicializado;
  102. }
  103.  
  104. //-------------------------------------------------------------------------------
  105.  
  106. void Cerrar()
  107. {
  108. SDL_FreeSurface(pImagen);
  109. pImagen = NULL;
  110.  
  111. SDL_DestroyWindow(pVentana);
  112. pVentana = NULL;
  113.  
  114. SDL_Quit();
  115. }
  116.  
  117. //-------------------------------------------------------------------------------
  118.  
  119. void CargarImagenEnMain()
  120. {
  121. if (!CargarImagen())
  122. {
  123. cout << "Error al cargar la imagen en main." << endl;
  124. }
  125.  
  126. else
  127. {
  128. SDL_BlitSurface(pImagen, NULL, pSuperficie, NULL);
  129. SDL_UpdateWindowSurface(pVentana);
  130. SDL_Delay(TIEMPO_DELAY_IMAGEN_UNO);
  131. }
  132. }
  133.  
  134. //-------------------------------------------------------------------------------
  135.  
  136. void CargarImagenMENUEnMain()
  137. {
  138. if (!CargarImagenMENU())
  139. {
  140. cout << "Error al cargar la imagenMENU en main." << endl;
  141. }
  142.  
  143. else
  144. {
  145. SDL_BlitSurface(pImagen, NULL, pSuperficie, NULL);
  146. SDL_UpdateWindowSurface(pVentana);
  147. SDL_Delay(TIEMPO_DELAY_IMAGEN_MENU);
  148. }
  149. }


Título: Re: SDL2 C++ Como puedo poner un rectangulo encima de una imagen?
Publicado por: RayR en 30 Mayo 2019, 20:53 pm
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.


Título: Re: SDL2 C++ Como puedo poner un rectangulo encima de una imagen?
Publicado por: @XSStringManolo en 31 Mayo 2019, 12:27 pm
Probare con esas funciones. El problema es que cuando dibujo los rectangulos, la superficie me sobrescribe la superficie de la imagen mostrada. Sigo probando!