Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Como evitar el parpadeo

Estas en el tema de Como evitar el parpadeo en el foro de C/C++ en Foros del Web. Hola amigos tengo este pequeño juego comenzandolo pero me gustaria evitar un poco el parpadeo y olvide el comando en si alguien se lo sabe ...
  #1 (permalink)  
Antiguo 26/07/2015, 13:28
 
Fecha de Ingreso: julio-2015
Mensajes: 15
Antigüedad: 9 años, 4 meses
Puntos: 0
Como evitar el parpadeo

Hola amigos tengo este pequeño juego comenzandolo pero me gustaria evitar un poco el parpadeo y olvide el comando en si alguien se lo sabe me podria decir , gracias de antemano .
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. void jugar (int matriz [20][30]);
  6. void imprimir (int matriz [20][30]);
  7.  
  8. int i,j;
  9.  
  10. int main (){
  11.    
  12.  
  13. int matriz[20][30]= {6,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,6,1,1,1,1,1,1,1,1,1,1,1,1,3,
  14.                      2,7,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,
  15.                      2,0,6,1,1,1,1,3,0,6,1,1,3,0,2,0,2,0,6,1,1,1,3,0,6,1,1,3,0,2,
  16.                      2,0,5,1,1,1,1,4,0,5,1,1,4,0,5,1,4,0,5,1,1,1,4,0,5,1,1,4,0,2,
  17.                      2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
  18.                      2,0,6,1,1,3,0,6,1,3,0,1,1,1,3,0,6,1,1,1,0,6,1,3,0,6,1,3,0,2,
  19.                      2,0,5,1,1,4,0,2,0,2,0,0,0,0,2,0,2,0,0,0,0,2,0,2,0,5,1,4,0,2,
  20.                      2,0,0,0,0,0,0,2,0,5,1,1,3,0,2,0,2,0,6,1,1,4,0,2,0,0,0,0,0,2,
  21.                      2,0,6,1,1,3,0,2,0,6,1,1,4,0,5,1,4,0,5,1,1,3,0,2,0,6,1,3,0,2,
  22.                      2,0,2,0,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,
  23.                      4,0,5,1,1,4,0,5,1,4,0,0,0,0,6,1,3,0,0,0,0,5,1,4,0,5,1,4,0,5,
  24.                      0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
  25.                      3,0,6,1,0,1,1,1,1,1,0,1,3,0,2,0,2,0,6,1,1,1,1,1,1,1,1,3,0,6,
  26.                      2,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,
  27.                      2,0,2,0,6,1,1,1,1,1,3,0,0,0,2,0,2,0,5,1,1,1,1,1,1,1,1,4,0,2,
  28.                      2,0,0,0,5,1,1,1,1,1,4,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,
  29.                      2,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,6,1,1,1,1,1,1,1,1,3,0,2,
  30.                      2,0,5,1,1,0,1,1,1,1,1,1,4,0,5,1,4,0,5,1,1,1,1,1,1,1,1,4,0,2,
  31.                      2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,
  32.                      5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4};
  33.                      
  34.         jugar (matriz);              
  35.    
  36.     return 0;
  37. }
  38.  
  39.         void jugar (int matriz[20][30]){
  40.         char tecla;
  41.         int filas,columnas;
  42.         int i,j;
  43.        
  44.     for ( i=0;i<20;i++){
  45.         for( j=0;j<30;j++){
  46.             if (matriz[i][j]==7){
  47.                 filas=i; columnas=j;
  48.             }
  49.         }
  50.     }  
  51.            
  52.        
  53.         imprimir (matriz); 
  54.        
  55.         do{
  56.    
  57.    
  58.         matriz[filas][columnas]=0;
  59.         if (_kbhit()){
  60.             tecla=getch();     
  61.         }
  62.        
  63.         switch (tecla){
  64.             case 'w':{
  65.                 if(matriz[filas-1][columnas]==0){
  66.                     filas--;
  67.                 }
  68.                 break;
  69.             }
  70.             case 's':{
  71.                 if (matriz[filas+1][columnas]==0){
  72.                     filas++;
  73.                 }
  74.                 break;
  75.             }
  76.             case 'd':{
  77.                 if (matriz[filas][columnas+1]==0){
  78.                     columnas++;                
  79.                 }
  80.                 break;
  81.             }
  82.             case 'a':{
  83.                 if (matriz[filas][columnas-1]==0){
  84.                     columnas--;
  85.                 }
  86.                 break;
  87.             }
  88.            
  89.            
  90.         }
  91.         matriz [filas][columnas]=7;
  92.         imprimir (matriz);
  93.         tecla='p';
  94.     }while(tecla!='x');
  95.    
  96. }    
  97.  
  98. void imprimir(int matriz[20][30]){
  99.  
  100.     system ("cls");
  101.     for ( i=0;i<20;i++){
  102.         printf ("\n");
  103.         for ( j=0;j<30;j++){
  104.             switch (matriz[i][j]){
  105.                 case 0:{
  106.                     printf ("%c",0);
  107.                     break;
  108.                 }
  109.                 case 1:{
  110.                     printf ("%c",205);
  111.                     break;
  112.                 }
  113.                 case 2:{
  114.                     printf ("%c",186);
  115.                     break;
  116.                 }
  117.                 case 3:{
  118.                     printf("%c",187);
  119.                     break;
  120.                 }
  121.                 case 4:{
  122.                     printf("%c",188);
  123.                     break;
  124.                 }
  125.                 case 5:{
  126.                     printf("%c",200);
  127.                     break;
  128.                 }
  129.                 case 6:{
  130.                     printf("%c",201);
  131.                     break;
  132.                 }
  133.                 case 7:{
  134.                     printf("%c",189);
  135.                     break;
  136.                 }
  137.             }
  138.         }
  139.     }
  140.    
  141.     printf ("\n\n moverse: \nArriba: 'W' \nAbajo: 'S' \nIzquierda: 'A' \n Derecha: 'D' ");
  142.    
  143. }
  #2 (permalink)  
Antiguo 26/07/2015, 15:25
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Como evitar el parpadeo

Eso pasa por que estas borrando toda la tela constantemente.
Lo que puedes hacer es usar gotoxy para borrar solo lo que es la letra que estas moviendo. Seria como imprimir un espacio en blanco donde estabas y pintar la C en la nueva posicion, todo lo demás estaria igual. Miere un ejemplo:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <conio.h>
  4. using namespace std;
  5.  
  6. void gotoxy ( int x, int y ) {
  7.     HANDLE hcon;
  8.     hcon = GetStdHandle ( STD_OUTPUT_HANDLE );
  9.     COORD dwPos;
  10.     dwPos.X = x;
  11.     dwPos.Y = y;
  12.     SetConsoleCursorPosition ( hcon, dwPos );
  13. }
  14.  
  15. int main () {
  16.     char mapa[17][27] = {
  17.         {"+-----+-----+-----+-----+"},
  18.         {"| \\   |   / | \\   |   / |"},
  19.         {"|  \\  |  /  |  \\  |  /  |"},
  20.         {"|   \\ | /   |   \\ | /   |"},
  21.         {"+-----+-----+-----+-----+"},
  22.         {"|   / | \\   |   / | \\   |"},
  23.         {"|  /  |  \\  |  /  |  \\  |"},
  24.         {"| /   |   \\ | /   |   \\ |"},
  25.         {"+-----+-----+-----+-----+"},
  26.         {"| \\   |   / | \\   |   / |"},
  27.         {"|  \\  |  /  |  \\  |  /  |"},
  28.         {"|   \\ | /   |   \\ | /   |"},
  29.         {"+-----+-----+-----+-----+"},
  30.         {"|   / | \\   |   / | \\   |"},
  31.         {"|  /  |  \\  |  /  |  \\  |"},
  32.         {"| /   |   \\ | /   |   \\ |"},
  33.         {"+-----+-----+-----+-----+"}
  34.     };
  35.    
  36.    
  37.     for ( int y = 0; y < 17; y++ ) {
  38.         for ( int x = 0; x < 27; x++ ) {
  39.             cout << mapa[y][x];
  40.         }
  41.         cout << endl;
  42.     }
  43.    
  44.     int x = 0;
  45.     int y = 16;
  46.     int cx = 0;
  47.     int cy = 0;
  48.    
  49.     //inicia em:
  50.     gotoxy ( 0, 16 );
  51.     printf ( "T" );
  52.    
  53.     int ch;
  54.     while ( ( ch = _getch() ) ) {
  55.         if ( ch == 27 ) {
  56.             return 0;
  57.         }
  58.         if ( ch == 72 ) {
  59.             //cout << "up" << endl;
  60.             if ( y > 0 ) {
  61.                 gotoxy ( x, y );
  62.                 printf ( "+" );
  63.                 y = y - 4;
  64.                 gotoxy ( x, y );
  65.                 printf ( "T" );
  66.             }
  67.            
  68.         } else if ( ch == 75 ) {
  69.             //cout << "left" << endl;
  70.             if ( x > 0 ) {
  71.                 gotoxy ( x, y );
  72.                 printf ( "+" );
  73.                 x = x - 6;
  74.                 gotoxy ( x, y );
  75.                 printf ( "T" );
  76.             }
  77.            
  78.         } else if ( ch == 77 ) {
  79.             //cout << "right" << endl;
  80.             if ( x <= 20 ) {
  81.                 gotoxy ( x, y );
  82.                 printf ( "+" );
  83.                 x = x + 6;
  84.                 gotoxy ( x, y );
  85.                 printf ( "T" );
  86.             }
  87.            
  88.            
  89.         } else if ( ch == 80 ) {
  90.             //cout << "down" << endl;
  91.             if ( y <= 12 ) {
  92.                 gotoxy ( x, y );
  93.                 printf ( "+" );
  94.                 y = y + 4;
  95.                 gotoxy ( x, y );
  96.                 printf ( "T" );
  97.             }
  98.            
  99.         } else {
  100.             gotoxy ( x, y );
  101.             printf ( "+" );
  102.             cx = x;
  103.             cy = y;
  104.             gotoxy ( x, y );
  105.             printf ( "T" );
  106.             x = cx;
  107.             y = cy;
  108.         }
  109.        
  110.     }
  111.    
  112.     cin.ignore();
  113.     return 0;
  114. }

Esto era para un juego llamado bagachal que obviamente no lo termine ya que era solo por tema de otro usuario que pedía una idea, observe como no imprimo todo el mapa si no que solo la 'T' que puedes mover con las fleshas, esa es la idea.

Puedes implementar un gotoxy tuyo, además la función system ("cls") es muy lenta, es obvio, la consola no esta para hacer jueguitos, en internet hay funciones proprias que son más efectivas(rápidas) a la hora de borrar la pantalla, pero repito, borrar toda la pantalla no es la solución.

Lo que sí puede que te convenga echar un ojo, es a una librería muy muy buena para eso que se llama miniwin, o incluso podrías hacerla con SFML o SDL.

Echa una mirada aquí y si te gusta pues seria muy fácil usar miniwin: http://www.forosdelweb.com/f96/dibujar-c-1105137/
  #3 (permalink)  
Antiguo 27/07/2015, 01:34
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Como evitar el parpadeo

Los juegos usan una doble pantalla para evitar ese parpadeo. Lo que se hace es escribir en la pantalla A y mostrarla. Escribir las modificaciones en la pantalla B y mostrar la B (haciendo un cambio del puntero de la pantalla a la nueva dirección de B). Ahora las modificaciones se escriben en A y luego se cambia la pantalla para que apunte a A.
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 27/07/2015, 01:58
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Como evitar el parpadeo

¿En aplicaciones de consola? O lo dices en modo gráfico?
  #5 (permalink)  
Antiguo 27/07/2015, 02:31
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Como evitar el parpadeo

Cita:
Iniciado por vangodp Ver Mensaje
¿En aplicaciones de consola? O lo dices en modo gráfico?
Antiguamente se hacia en ambas formas. Aunque hablo cuando se programaba también en ensamblador para optimizar este tipo de cosas xD Pero dudo que la "teoría" haya cambiado, lo que si es posible que al estar Windows de capa intermedia (antes solo estaba el DOS) la forma de hacerlo sea algo diferente, pero seguro que la solución pasa por ahí.
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 27/07/2015, 04:10
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Como evitar el parpadeo

Bueno... ¿Pues por probar no pasa nada no? XD
  #7 (permalink)  
Antiguo 27/07/2015, 08:28
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Como evitar el parpadeo

Aquí exponen más o menos lo que quería decir aunque parece que tiran de la API de Windows. Pero como decía es una técnica muy común y que seguro se puede implementar de alguna forma más estándar/independiente.
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 27/07/2015, 12:06
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Como evitar el parpadeo

Sí... al parecer tiene pinta de funcionar en consola, hay que hacer pruebas y tal. XD

La verdad no me molan mucho los juegos de consola, los prefiero practicar en 2D, a modo de estudios pues puede ser que lo pruebe. Es como dije, hay formas más efectivas de hacer eso que usando system("cls"). Quizás no haya ni que borrar nada simplemente lo que dijo el tema, crear un área del tamaño de la pantalla de la consola y volcar todos los dados en ella de una vez desde el buffer, parece interesante el tema. El creador del tema ya dispone de unas cuantas opciones por probar.

Es bueno saber todo eso. Gracias =)

Etiquetas: char, int, matriz, parpadeo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:11.