Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jorge245 en 21 Marzo 2018, 23:46 pm



Título: Problema con pantalla completa en SDL2(solucionado)
Publicado por: jorge245 en 21 Marzo 2018, 23:46 pm
En el modo pantalla completa y SDL_WINDOW_FULLSCREEN_DESKTOP de SDL2 cuando  le pongo alguna imagen  a  la ventana (pantalla completa), al minimizarla y volver a entrar solo aparece una imagen de mi escritorio o  como fondo y nada más.Si es en FULLSCREEN sale la  imagen  con zoom.

Nota: Uso linux y para minimizar uso el botón de windows de mi teclado.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: Kenji-chan en 21 Marzo 2018, 23:52 pm
pon tu código, pero si no estoy mal es porque no limpias el la SDL_surface que hace de pantalla


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 22 Marzo 2018, 00:00 am
kenji:
Código:
#include<iostream>
#include"milib.h"
#include<SDL2/SDL.h>
#include<SDL2/SDL_image.h>
using namespace std;


int main(){
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *window = SDL_CreateWindow("pst",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,0, 0,SDL_WINDOW_FULLSCREEN_DESKTOP);
SDL_Surface*windowSurface=SDL_GetWindowSurface(window);
SDL_Surface*fondo=IMG_Load("fondo.png");
SDL_Event tecla;
SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
while(true){
SDL_UpdateWindowSurface(window);
SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
while (SDL_PollEvent(&tecla)) {
if (tecla.type == SDL_QUIT) {
exit(0);
}
}
}
return 0;
}
este  programa lo hice para probar el modo pantalla completa


Título: Re: Problema con pantalla completa en SDL2
Publicado por: Kenji-chan en 22 Marzo 2018, 00:08 am
si lo que pensé en tu while solo estas capturando los eventos por eso el buffer se esucia que lo que estaba en la pantalla cuando lo minimizas y cundo lo maximizas te muestra eso
lo que tienes que hacer es un gameLoop que se encargue de limpiar el el buffer de la pantalla y lo pinte ademas desde dentro del gameLoop también podes capturar los eventos



disculpa esque no vi el primer while que hace de gameLoop XD el problema es el segundo while que tienes para capturar los eventos cámbialo por switch

[MOD] No hacer doble post, usar el botón "modificar" para añadir comentarios.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 22 Marzo 2018, 00:52 am
El if lo cambio por switch?
si es así , por favor puedes explicarme porque usar switch en vez de if.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: Kenji-chan en 22 Marzo 2018, 01:04 am
con el switch(SDL_PollEvent(&tecla)) vas ha hacer un caso por cada evento
porlo tanto el if se combierte en un case:, en ete caso case: SDL_QUIT; breake;


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 22 Marzo 2018, 21:33 pm
con el
Código:
switch(SDL_PollEvent(&tecla)){
case: SDL_QUIT; breake;
}
no me captura el evento. no se capturar eventos usando switch en SDL ayudame con eso.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: Kenji-chan en 22 Marzo 2018, 22:44 pm
para que sea mas facil lo haremos haci

Código
  1. while (SDL_PollEvent(&tecla) != 0) {
  2.  if (tecla.type == SDL_QUIT) {
  3.   exit(0);
  4.  }
  5. }
  6.  

ya que
int SDL_PollEvent(SDL_Event* event)

es una funcion que devuelve 1 si hay un evento pendiente o 0 si no hay ninguno disponible.

y en el while cundo capturabas el evento te decía que quedaban eventos pendientes por
procesar de ese modo al no tratarlos el bucle se estancava dentro de sa parte del codigo

ademas te recomindo que agas una funcion booleana que te permita salir del gameLoop asi

Código
  1. bool quit = false;
  2.  
  3. while(!quit){
  4. SDL_UpdateWindowSurface(window);
  5. SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
  6. while (SDL_PollEvent(&tecla)) {
  7.  if (tecla.type == SDL_QUIT) {
  8.   quit = true;
  9.  }
  10. }
  11.  
  12. return 0;
  13.  

de ese modo no cierras la ejecución del programa inesperada mente, de esa forma dejas que la función main finalice correcta mente sin errores ademas de permitirte destruir los
SDL_Window *window
SDL_Surface*windowSurface
SDL_Surface*fondo

como es devido y no dejarlos almacenados en la memoria ram


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 26 Marzo 2018, 19:37 pm
no me funciona :,(


Título: Re: Problema con pantalla completa en SDL2
Publicado por: MAFUS en 26 Marzo 2018, 20:07 pm
Has probado de hacer así:
Código
  1. bool quit = false;
  2.  
  3. while(!quit){
  4. SDL_UpdateWindowSurface(window);
  5. SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
  6. while(SDL_PollEvent(&tecla)) {
  7.  if (tecla.type == SDL_QUIT) {
  8.    quit = true;
  9.  }
  10.  if(tecla.type == SDL_WINDOWEVENT_RESTORED) {
  11.    SDL_UpdateWindowSurface(window);
  12. }
  13.  
  14. return 0;


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 26 Marzo 2018, 20:33 pm
ya probé pero no funciona.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: MAFUS en 26 Marzo 2018, 21:17 pm
A ver, qué tal esto...
Código
  1. while(!quit){
  2. SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
  3. SDL_Flip(windowSurface);
  4. while(SDL_PollEvent(&tecla)) {
  5.  if (tecla.type == SDL_QUIT) {
  6.    quit = true;
  7.  }
  8. }

Flip lo que hace es llevar la imagen que hay en el la superficie al hardware. A ver si era eso.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 26 Marzo 2018, 21:54 pm
 :-(


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 26 Marzo 2018, 22:20 pm
enlace para descargar la carpeta con la magen y programa .solo funciona en linux
https://drive.google.com/open?id=1urwyoX6Rgus2tKi4LU3n3EpexGfZSlfW


Título: Re: Problema con pantalla completa en SDL2
Publicado por: MAFUS en 26 Marzo 2018, 22:24 pm
No tengo Linux ni SDL.

Se me ocurre que a lo mejor no sale del bucle de eventos.
Cambia el while por un if, a ver que ocurre. Si ya no funciona así entonces es que fondo no se redibuja a windowSurface.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 26 Marzo 2018, 22:35 pm
No, la imagen si se presenta en pantalla. es solo cuando minimizo que deja de presentarla ,ubuntu presenta una captura de pantalla del  escritorio en la ventana si esta no tiene ninguna imagen, y así pasa al minimizar y entrar con pantalla completa.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: MAFUS en 26 Marzo 2018, 23:26 pm
Has cambiado el while por el if?
Ya, y al pasarle con otra ventana por encima se queda dibujada el trazo de esa pantalla?


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 27 Marzo 2018, 00:54 am
si,
Código:
// ! u+21
// &  u+26
// u+5c0 ׀
// %  u+25
// Ʃ  u+1a9
#include<iostream>
#include"milib.h"
#include<SDL2/SDL.h>
#include<SDL2/SDL_image.h>
using namespace std;


int main(){
bool quit=false;
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *window = SDL_CreateWindow("pst",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,0, 0,SDL_WINDOW_FULLSCREEN_DESKTOP);
SDL_Surface*windowSurface=SDL_GetWindowSurface(window);
SDL_Surface*fondo=IMG_Load("fondo.png");
SDL_Event tecla;
SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
while(!quit){
SDL_BlitSurface(fondo,NULL,windowSurface,NULL);
SDL_UpdateWindowSurface(window);
if(SDL_PollEvent(&tecla)) {
if (tecla.type == SDL_QUIT) {
quit=true;
}
}
}
return 0;
}

y con lo otro, no porque es pantalla completa así que no me es posible.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 17 Abril 2018, 21:46 pm
Creo que ese problema me ara abandonar SDL. :,(


Título: Re: Problema con pantalla completa en SDL2
Publicado por: MAFUS en 17 Abril 2018, 21:59 pm
Buscando encontré esto: https://discourse.libsdl.org/t/restore-sdl-app-previously-minimized-after-screen-saver/20127

Al parecer había un bug en libsdl 2.0.1 que no reconocía cuando se minimizaba la pantalla. Si usas esa versión cámbiate a una más moderna.


Título: Re: Problema con pantalla completa en SDL2
Publicado por: jorge245 en 11 Mayo 2018, 19:33 pm
Muchas gracias a todos por sus respuestas , ya solucione el problema,bueno en realidad 2 problemas con esa solución ,y es convertir la surface de la  imagen en una en una textura, así al entrar después de haber salido sigue la imagen, y ademas, el programa no necesita saber el tamaño de la pantalla para colocar la imagen. qui les dejo el código:
Código:
// ! u+21
// &  u+26
// | u+7c
// %  u+25
// Ʃ  u+1a9
//\ u+5c  'u+27
#include<iostream>
#include<SDL2/SDL.h>
#include<SDL2/SDL_image.h>
using namespace std;
const int SCREEN_WIDTH = 1900;
const int SCREEN_HEIGHT = 1080;
SDL_Event tecla;

// g++ enginere.cpp -w -lSDL2 -lSDL2_image -lSDL2_gfx -o enginere
void iniciar();
//SDL_Init(SDL_INIT_VIDEO)


int main(int argc, char *argv[]){

        SDL_Window*window = SDL_CreateWindow("juego", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,SCREEN_WIDTH,SCREEN_HEIGHT,SDL_WINDOW_FULLSCREEN_DESKTOP);
               SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
               SDL_Surface * image = IMG_Load("fondo.png");
               SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, image);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
while(true){
  SDL_RenderCopy(renderer, texture, NULL, NULL);
  SDL_RenderPresent(renderer);
   while (SDL_PollEvent(&tecla)) {
if (tecla.type == SDL_QUIT) {
      SDL_DestroyTexture(texture);
SDL_FreeSurface(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
exit(0);
}

  }
 }
    return 0;
}

void iniciar(){
if(SDL_Init(SDL_INIT_VIDEO)<0){
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Error inciando subsistema","Se produjo un error cargando el subsitema de video, porfavor , vuelva a iniciar el juego ",NULL);
exit(1);
}
}