• Domingo 28 de Abril de 2024, 20:42

Autor Tema:  Como Dejar Algo Impreso Estatico  (Leído 6586 veces)

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Como Dejar Algo Impreso Estatico
« en: Viernes 30 de Julio de 2004, 19:34 »
0
bueno estoy haciendo un juego de rol... y es necesario si o si que algo quede estatico mientras van a pareciendo cosas.
Lo he estado pensando y pensando... y se me ocurrio la gran cls e imprimir de vuelta pero.. el programa se me alargaria mucho y no funcionaria en algunos casos.

si jugaron al gran juego zork van a entender de que hablo

ej.


nombre: X      vida: X

(aca van surgiendo cosas incluso que llenen toda la pantalla... pero el nombre y vida que se mantengan arriba de la pantalla).

La verdad es que el juego ya esta muy bien armado pero seria primordial que tenga eso...

Noel Solw

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #1 en: Sábado 31 de Julio de 2004, 09:31 »
0
No se que compilador estas usando. Si trabajas con algun producto de Borland, puedes escribir lo que quieres en la parte superior de la pantalla, en las dos primeras lineas por ejemplo, y luego declarar window(1,3,80,25).
La pantalla activa tendra las dimensiones de window y todo lo que hagas en el no afectara a lo escrito al principio.
Lo anterior en mogo texto, existen procedimientos paralelos en grafica.

Electroduende

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #2 en: Sábado 31 de Julio de 2004, 12:03 »
0
creo que deberias ser un poquito mas especifico sobre la plataforma, compilador, etc... que estas utilizando

hasta luego,  :hola:
Electroduende
 :alien:

Blag

  • Moderador
  • ******
  • Mensajes: 697
    • Ver Perfil
    • http://atejada.blogspot.com
Re: Como Dejar Algo Impreso Estatico
« Respuesta #3 en: Lunes 2 de Agosto de 2004, 03:00 »
0
Creo que lo más sencillo, sería que declares una función que contenga los datos quieres mostrar, y la llames cada vez que la necesites  B)

Aunque si la solución de Noel Solw funciona para el Dev-C++......Sería mejor  :lol:

Saludos,

Blag  :devil:

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #4 en: Martes 3 de Agosto de 2004, 01:56 »
0
:o  zarpadisimo.. no pense que me llegaran a responder (espere varios dias y nada, incluso pregunte en xpertia y nada :S)...

Bueno estoy utilizando el dev-c++.

Noel Solw gracias por la data... algo asi queria hacer yo pero no sabia como.. si con un comando que se llame static o algo asi o de alguna otra forma... pero esa forma de escribir algo y declarar que la ventana empieza desde un poco mas abajo me parecio una idea que no se me ocurrio.

Blag lo que pasa es que imaginate que estoy en una batalla.. el texto se me alargaria un monton.

Binary

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #5 en: Martes 3 de Agosto de 2004, 03:01 »
0
yo lo haria con gotoxy(int x, int y);
haces

#include <conio.h>

gotoxy(40, 20);
cout<<"Hello World"<<endl;

y todo lo del juego de la misma forma... asi es bastante portatil, definiendo los y y x al inicio...

Aunque no se, tal vez el metodo de la ventana sea un poco mas sofisticado... yo por decir no mas :D

A mi me ha funcionado en todos los trabajos con posiciones en pantalla.

Saludos!

Blag

  • Moderador
  • ******
  • Mensajes: 697
    • Ver Perfil
    • http://atejada.blogspot.com
Re: Como Dejar Algo Impreso Estatico
« Respuesta #6 en: Martes 3 de Agosto de 2004, 04:12 »
0
Citar
yo lo haria con gotoxy(int x, int y);
haces

#include <conio.h>

gotoxy(40, 20);
cout<<"Hello World"<<endl;

 :rolleyes:  Esto no funciona en Dev-C++

Citar
Blag lo que pasa es que imaginate que estoy en una batalla.. el texto se me alargaria un monton.

No veo porque.......simplemente en tu función harías algo así:

Código: Text
  1.  
  2. void Estatico()
  3. {
  4. system(&#34;cls&#34;);
  5. cout&#60;&#60;&#34;Tus puntos de vida: &#34;&#60;&#60;iVida;
  6. cout&#60;&#60;&#34;Puntos del Enemigo: &#34;&#60;&#60;iSuVida;
  7. }
  8.  
  9.  

Y lo llamarías cada vez que lo necesites.......

Código: Text
  1.  
  2. Estatico();
  3. cout&#60;&#60;&#34;Empieza la pelea contra Sauron......&#34;;
  4.  
  5.  

Saludos,

Blag  :devil:

Binary

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #7 en: Martes 3 de Agosto de 2004, 05:03 »
0
Ups... :D
Pense que Dev tenia el gotoxy() :D
Sorry, mi error.

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #8 en: Martes 3 de Agosto de 2004, 08:17 »
0
a ver... primero respondo a Binari

aunque se pudiera hacer (que si se puede, ahora lo explico mas adelante) no me serviria ya que imprimo mis puntos de vida... mi mana mi exp y todo eso... lucho contra el orco y tendria que ir de vuelta arriba con el gotoxy y sobreescribir.. y de vuelta volver a la parte del combate.

vida: X exp: X

aparece sauron te saka 10.000 puntos de vida.  (aca harias el gotoxy para arriba para volver a arriba y cambiar mis puntos de vida x-10.000) pero tendria que hacer de vuelta un gotoxy para voler a seguir con la pelea... :S asi que no sirve.

bueno ahora con lo de gotoxy en dev... jejejeje como buen aprendiz que soy  :smartass:  si en vez de pones conio.h pones conio.c el getch() y el gotoxy funcionan perfectamente en dev.

y con lo de void estatico.... tampoco me serviria.. ya que si peleo con sauron cuando llega al final de la pantalla se me "borra" el estatico ej.

Código: Text
  1.  
  2. Estatico();
  3. cout&#60;&#60;&#34;Empieza la pelea contra Sauron......&#34;;
  4. sauron me saka 10. puntos de vida; iVida-10;
  5. le sakas 3. puntos de vida; SuVida-3;
  6. (si se repite esto muchas veces..)
  7. sauron me saka 10. puntos de vida; iVida-10;
  8. le sakas 3. puntos de vida; SuVida-3;
  9. sauron me saka 10. puntos de vida; iVida-10;
  10. le sakas 3. puntos de vida; SuVida-3;
  11. sauron me saka 10. puntos de vida; iVida-10;
  12. le sakas 3. puntos de vida; SuVida-3;
  13.  
  14.  

tendria que volver a poner el estatico y se me borraria la pantalla.
Lo pense todo.. lo de gotoxy y lo de llamarlo pero no es lo que quiero

lo que yo digo es algo asi



van surgiendo acciones y lo de arriba nunca se borra



parece muy facil pero no lo es... la mejor solucion me parece que es la de Noel Solw pero no se como hacerlo o si funciona en dev-c++.

gracias a todos por intentar solucionar este problema, a ver si lo sakamos entre todos XD.

Blag

  • Moderador
  • ******
  • Mensajes: 697
    • Ver Perfil
    • http://atejada.blogspot.com
Re: Como Dejar Algo Impreso Estatico
« Respuesta #9 en: Martes 3 de Agosto de 2004, 16:33 »
0
Citar
bueno ahora con lo de gotoxy en dev... jejejeje como buen aprendiz que soy :smartass:  si en vez de pones conio.h pones conio.c el getch() y el gotoxy funcionan perfectamente en dev.
 

:huh:  No tenía ni la menor idea  :huh:    Gracias por el tip  :hola:

Saludos,

Blag  :devil:

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #10 en: Jueves 5 de Agosto de 2004, 23:41 »
0
Talves el gotoxy() no funcione, lo de escribir primero y despues usar una venta [window(1,3,80,25)] parece lo mejor pero como editas lo escrito antes si ya solo puedes trabjar en la ventana.

No se si funcione el editar todo el tiempo la primera linea de la pantalla mediante la direccion de memoria de video(modo texto) 0xb800. asi no no hay problema de mover el cursor al escribir y despues tener que regresar.

REDD

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #11 en: Jueves 5 de Agosto de 2004, 23:57 »
0
Yo creo que la mejor solucion es la que propone noel solw ya que puedes dividir practicamente la pantalla en 2 la primera seria:

  window(1,1,80,2);

y la segunda:

  window(1,3,80,24);

asi  puedes actualizar cualquiera de las dos pantallas(borrarlas por completo sin que afecten a las otras)y para escribir en cada una unicamente llamas nuevamente a window() con sus valores correspondientes.

Lenko

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #12 en: Viernes 6 de Agosto de 2004, 10:31 »
0
Supongo que lo más fácil sería hacer una función que guardara la posición del cursor, lo moviera a la línea superior, escribiera los datos y volviera a restaurar el cursor a su posición inicial.

Si no me acuerdo mal había algo como wherex y wherey en la conio.

Código: Text
  1.  
  2. void estado()
  3.   {
  4.   int ant_x = wherex();
  5.   int ant_y = wherey();
  6.  
  7.   gotoxy(POS_X_ESTADO, POS_Y_ESTADO);
  8.   // Imprimes lo que quieras
  9.  
  10.   gotoxy(ant_x, ant_y);
  11.   }
  12.  
  13.  
- Lenko -

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #13 en: Sábado 7 de Agosto de 2004, 06:47 »
0
pero como hago eso de window? lo escribo asi nomas?

porque me dice 'window' undeclared

necesito agregar alguna libreria?

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #14 en: Sábado 7 de Agosto de 2004, 08:08 »
0
Hi!! Antes de nada decir que realmente yo no se como hacerlo :( , aunque lo de window supongo que estara en alguna libreria...

De las soluciones, asi a simple vista me parece mejor la de window que la de reimprimir toda la pantalla, ya que si se actualiza con mucha frecuencia puede ser bastante molesto. La opcion de gotoxy tb me parece buena....

De todos modos con lo que tengas nos avisas a todos, por que a mi tb me gustaria saber como se hace :)

Suerte con el juego :lightsabre:
   

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #15 en: Lunes 9 de Agosto de 2004, 00:29 »
0
bueno entonces quedaron dos posibles formas de hacerlo.. lo de las diferentes ventanas y lo de grabar donde estaba x e y subir, imprimir algo y volver a donde estaba en un principio...


con respecto a la primera... puede ser que esto tenga algo que ver? http://www.lsi.us.es/cursos/xlib-3.html


y la segunda todavia no la probe...

gracias a todos por participar en este pequeño gran problema por el que tube que pasar...

si alguien tiene la solucion exacta con un ejemplo lo podria escribir aca por fabor?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como Dejar Algo Impreso Estatico
« Respuesta #16 en: Lunes 9 de Agosto de 2004, 02:46 »
0
bueno aunque ya te has resuelto el proble , lo cierto y en mi opinion es ue deberias reimprimirlo en cada ciclo..
porque?

pues porque asi se programaria si fuera un videojuego... no de modo texto sino de modo grafico ...
es decir cada iteracion que sucede se reaclcula y se vuelve a dibujar todo.. es decir un juego minimo debe ser asi:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
while(jugar)
{
  CapturarEntrada();//teclado , joystick, mouse, etc
  ProcesarSiguienteCuadro();//Hacer que los personajes hagan algo (moverce morir, vivir.. etc) pero solo calcualndo lo que sucedera en el siguinte cuadro de animacion
  Ejecutar();  //Dibujar, realizar sonido
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
o bueno un enfoque mas simple y reducido:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
while(jugar)
{
  ProcesarSiguienteFrame();
  EsprarBarrido depantalla();
  Dibujar();
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Para juegos completos se deberia usar un cilo iterativo aparte para cada evento desta manera:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
while(estadojuego != 'Salir')
{
   switch(estadoJuego)
  {
     case 'MenuPrincipal'
          MenuPrincipal();
          break;
     case 'Jugar'
          Jugar();
          break:
  }
}
...
...
...
public Accion MenuPrincipal()
{
  while(EstadoMenu == 'Menu')
  {
     Accion p=ProcesarMenu();
     DibujarMenu(&p);    
  }
  return p;
}

public void Jugar()
{
  while(EstadoJugar !='Salir')
  {
    ProcesarEntrada();
    Dibujar();
  }
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Bueno en fin los ejemplos los acabe de digitar y hay muchas fallas(programe en un hibrido entre C# y C++, use comilla sencilla en vez de comilla doble, declare variables dentro del cilco.. etc etc y demas problemas de eficiencia.)
pero el hechpo es que esta es la logica que se supone que deberia seguir un videojuego... o por lo menos ha esa logica he llegado con la poca experiencia que tengo en juegos...
tambien hice un juego de texto usando esa metodologia.. claro que propiamente no era un juego sino todos los estados del juego menos el estado jugar ya que solo era un ejercicio para verificar unas unciones de escritura en XML y en general se realizo para verificar que los estados del juego eran los qwue se encesitaban.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Blag

  • Moderador
  • ******
  • Mensajes: 697
    • Ver Perfil
    • http://atejada.blogspot.com
Re: Como Dejar Algo Impreso Estatico
« Respuesta #17 en: Lunes 9 de Agosto de 2004, 06:19 »
0
Citar
bueno aunque ya te has resuelto el proble , lo cierto y en mi opinion es ue deberias reimprimirlo en cada ciclo..

Justo como yo lo dije  :lol:

Saludos,

Blag  :devil:

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #18 en: Lunes 9 de Agosto de 2004, 06:51 »
0
Juank vos me estas diciendo que lo haga con la segunda forma no?

bueno ya lo hice pero.... surgio un problema con eso... miren.. :

Código: Text
  1.  
  2. //primero ponemos lo que dice lenko.
  3.  
  4. void estado()
  5.   {
  6.   int ant_x = wherex();
  7.   int ant_y = wherey();
  8.  
  9.   gotoxy(1,1);
  10. print (----------)
  11. print (&#092;nmi vida)
  12. print (&#092;n--------)
  13.   gotoxy(ant_x, ant_y);
  14.   }
  15. //despues entrariamos al main
  16. int main()
  17. {
  18. //aca mando un while hasta que sauron muera
  19. while(Sauron_vida&#60;=0)
  20.   {
  21.   print (Empieza la batalla contra Sauron)
  22.   print (Sauron me saka 10 puntos de vida)
  23.   mi vida=mi vida-10
  24.   estado();
  25. //ahi arriba estaria llendo arriba de todo a la izquiera y volviendo a imprimir algo que supuestamente hasta que no llene la pantalla estaria bien (igual hay algo que esta mal porque cuando se renueva con el estado() el numero de la vida se vuelve loko... :S
  26.  
  27. //Y si seguimos con la batalla...
  28.   print (le sakas 30 puntos de vida a Sauron)
  29.   vida sauron= vida sauron-30
  30.   estado();
  31.   print (Sauron me saka 10 puntos de vida)
  32.   mi vida=mi vida-10
  33.   estado();
  34. }
  35. //Todo lo impreso se iria hacia arriba y cuando se llame al estado() en vez de ponerlo arriba a la izquiera lo pondria en el 1,1 osea al principio de todo que ni se ve XDDD
  36.  
  37. por eso sigo pensando que lo de window quizas sea mejor.... pero la verdad no se como es...
  38.  
  39. window(1,1)
  40. print  (----------)
  41. print  (&#092;nmi vida)
  42. print  (&#092;n--------)
  43. window(2,2)
  44. while(Sauron_vida&#60;=0)
  45.   {
  46.   print (Empieza la batalla contra Sauron)
  47.   print (Sauron me saka 10 puntos de vida)
  48.   mi vida=mi vida-10
  49.   print (le sakas 30 puntos de vida a Sauron)
  50.   vida sauron= vida sauron-30
  51.   }
  52.  
  53. //algo asi es???
  54.  
  55.  
  56.  

Bueno... espero que entiendan lo que escribi... la verdad que hace muy poco empece a programar y bueno.. se nota que quiero programar un jueguito.. pero surgieron pequeños problemas... que al parecer no es tan pequeño ya que resulta ser mas dificil de lo que parece.

espero puedan ayudarme...  :(

P.D: si ya se que no puse printf y ; al final y que tampoco puse el while si era yo el que llegaba a 0 pero espero que se sobreentienda que no estoy poniendo los detalles pero que si me dijeran como son los detalles con el tema de las ventanas.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Como Dejar Algo Impreso Estatico
« Respuesta #19 en: Lunes 9 de Agosto de 2004, 16:52 »
0
creo que estas confundido.. deberia ser asi:
Código: Text
  1.  
  2. while(sauron)//donde sauron indica si el personaje esta o no esta vivo
  3. {
  4.    /*donde se procesaria un cuadro de animacion..
  5.     *es decir lo que se pasara con sauron y con los demas
  6.     *personajes y con el escenario en el siguiennte cuadro
  7.     *a procesar.*/
  8.   estado= proccsessnextframe();
  9.  
  10.   /*
  11.    *Donde se trataran todos los dibujos
  12.    *de acuerdo al nuevo estado procesado
  13.    *y donde adicionalmente se controlara el barrido
  14.    *de pantalla y todo lo demas. */
  15.   Dibujar(&estado)
  16. }
  17. ...
  18. ..
  19. ...
  20. public estado  proccsessnextframe()
  21. {
  22.   if(tiempo ==500)
  23.   {
  24.     print (Empieza la batalla contra Sauron)
  25.     print (Sauron me saka 10 puntos de vida)
  26.     mi vida=mi vida-10
  27.     estado();
  28.     /*ahi arriba estaria llendo arriba de todo a la
  29.      *izquiera y volviendo a imprimir algo que supuestamente
  30.      *hasta que no llene la pantalla estaria bien
  31.      *(igual hay algo que esta mal porque cuando se renueva
  32.      * con el estado() el numero de la vida se vuelve loko... */:S
  33.   }
  34.  
  35.   if (tiempo==1000)
  36.   {
  37.     //Y si seguimos con la batalla...    
  38.     vida sauron= vida sauron-30
  39.     estado=algo;
  40.   }
  41.  
  42.   if(tiempo ==1500)
  43.   {
  44.     mi vida=mi vida-10
  45.     estado = algo;
  46.   }
  47.  return estado;
  48. }
  49.  
  50. public void Dibujar(estado *p)
  51. {
  52.   switch(p)
  53.   {
  54.     case algo:
  55.       print (Empieza la batalla contra Sauron);
  56.       print (Sauron me saka 10 puntos de vida);
  57.     break;
  58.     case algo2:
  59.       print (le sakas 30 puntos de vida a Sauron);
  60.     break;
  61.     case algo3:
  62.      print (Sauron me saka 10 puntos de vida);
  63.     break;
  64.   }
  65. }
  66.  
  67.  


Listo este es un ejemplo de lo que hay que hacer .. oogicamente faltan muchas optimizaciones de acuerdo a tus necesidades.. y tendras que hecharle una mano para que sea realmente funcional.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Super_G

  • Miembro MUY activo
  • ***
  • Mensajes: 375
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #20 en: Lunes 9 de Agosto de 2004, 20:18 »
0
Que tal esto, sobre la idea de escribir en la memoria de video.

usando la funcion :
Código: Text
  1.  
  2. void coutxy(char unsigned x,char unsigned y,char*texto ) //funcion que pone texto
  3. { int unsigned des = int(x)*2 + int(y)*2*80;          //en lapantalla de video modo texto
  4.   asm{ push es                                        // en una direccion dada
  5.        mov di,des
  6.        mov ax,0xb800  //direcion de la pantalla en modo texto
  7.        mov es,ax
  8.      }
  9.   char unsigned car;
  10.   int i=0;
  11.   while(texto[i]!= '&#092;0')
  12.    {  car=int(texto[i]);
  13.       asm {  mov al,car
  14.        mov ah,0x07
  15.        stosw       //se almacena el caracter de la cadena en la memoria de video
  16.     }
  17.       if(kbhit())break;// si hay un error en la cadena pulsando una tecla se sale de un posible ciclo infinito
  18.       i++;
  19.    }
  20.  asm pop es
  21.  
  22. }
  23.  
  24.  
las coordenadas no funcionan bien pero en este caso para 0,0 no hay problema

copilado en Borlandc.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

vanship

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Como Dejar Algo Impreso Estatico
« Respuesta #21 en: Sábado 14 de Agosto de 2004, 03:12 »
0
Muchas gracias a todos, despues voy a probar bien como es todo esto.... perdon por el retraso de agradecimiento lo que pasa es que el colegio me saka mucho tiempo.... :lol:

suerte a todos y gracias de vuelta.