Siguiendo con el tema de hacer un juego en consola MSDOS molaría poder hacer algunos grafiquillos. No quiero utilizar ninguna librería que no sea ANSI+conio :wink:
S2.
Cita de: "J_F_NASH"Siguiendo con el tema de hacer un juego en consola MSDOS molaría poder hacer algunos grafiquillos. No quiero utilizar ninguna librería que no sea ANSI+conio :wink:
S2.
Que yo sepa si se puede.
Sin embargo la gente toma otras rutas. Por ejemplo, Dwarf Fortress utiliza OpenGL para simular una consola.
Podria incluso ocurrir que el modo grafico sea mas rapido que el modo texto. Asi que a menos que quieras explicitamente hacer un juego de ascii art (como Nethack) salta al modo grafico.
Nada de openGL, SDL, DirectX,... solo ANSI+conio y solo Windows paso de Linux 8)
S2.
Cita de: "J_F_NASH"Nada de openGL, SDL, DirectX,... solo ANSI+conio y solo Windows paso de Linux 8)
La mejor libreria de graficos ascii, si insistes en usar ascii, es AALIB, una libreria de software libre para Linux, que tiene un porte para VGA.
http://aa-project.sourceforge.net/aalib/
http://prdownloads.sourceforge.net/aa-project/vga.zip
Es la ostia de rapida (supuestamente). Creo que hay gente que la ha utilizado para ver videos en consola (convirtiendo cada frame en ascii art)
Aparentemente es un poco absurdo que yo te proponga usar esta libreria cuando dices explicitamente que no quieres usar otra cosa mas que conio etc.. ¿Que quieres concremente?. Al principio te entendi modificar el charset, por ejemplo que el grafico de la P sea la de un champiñon, pero ahora no tengo nada seguro. Aparte de que dices que molaria hacer algo asi, pues si, molaria en un "freak-sentido". Por otra parte los juegos puro ascii tienen un componente de anti-usabilidad que impide que mucha gente los disfrute.
Tengo hecho un mini-juego con caracteres ASCII. Solo quiero saber si puedo mejorar su aspecto gráfico sin utilizar librerías mas que las comentadas. A bote pronto solo se me ocurre cambiando los caracteres por otros pero ¿se puede hacer esto de alguna forma que no sea metiendo otra librería? :?
S2.
char c = 0x00 -> 0xFF
printf("%c",c);
el único problema es que si el carácter 'c' que quieres mostrar no es imprimible tu placa base pitará.
no se si es esto lo que buscas o alguna forma de cambiar las fuentes etc.
---
cuando empecé a programar en borland podía hacer goto(x,y), printf(".");
y me pintaba un punto en las coordenadas x,y de pantalla que quería.
Cita de: "Buffon"char c = 0x00 -> 0xFF
printf("%c",c);
el único problema es que si el carácter 'c' que quieres mostrar no es imprimible tu placa base pitará.
no se si es esto lo que buscas o alguna forma de cambiar las fuentes etc.
---
cuando empecé a programar en borland podía hacer goto(x,y), printf(".");
y me pintaba un punto en las coordenadas x,y de pantalla que quería.
creo que la conio tiene esa goto(x,y). Sino tambien es muy apañado escribir directamente en memoria de video, creo que en 0xA000, o era 0xBnoseque.... hace tantos años que lo tengo olvidado.
con un puntero a la pantalla puedes hacer cosas como esta:
punteroApantalla[ x + y * TAMFILA] = "*";
esto es MUU clasico.
la siguiente cosa es la de esperar al retrace, para no tener parpadeo.
Cita de: "Tei"Sino tambien es muy apañado escribir directamente en memoria de video, creo que en 0xA000, o era 0xBnoseque.... hace tantos años que lo tengo olvidado.
con un puntero a la pantalla puedes hacer cosas como esta:
punteroApantalla[ x + y * TAMFILA] = "*";
Pero ahora con eso de la memoria protegida y esas historias de Windows 2000/XP/Vista muchos programas DOS petaban al intentar escribir en memorias como la de video, no? Pregunto desde la mas profunda ignoracia.
Salu2...
Si quieres pueder pillarte el dosbox e instalar el Turbo C++ o algo de eso, entonces si que podras hacer movidas de modo 13 y demas :lol:
Vaya, que interesante eso de escribir directamente en memoria de pantalla. ¿Podeis poner un ejemplo que funcione en los Windows actuales? es que con el pseudo-codigo que habeis puesto no me entero :roll:
S2.
Cita de: "[EX3"]Cita de: "Tei"Sino tambien es muy apañado escribir directamente en memoria de video, creo que en 0xA000, o era 0xBnoseque.... hace tantos años que lo tengo olvidado.
con un puntero a la pantalla puedes hacer cosas como esta:
punteroApantalla[ x + y * TAMFILA] = "*";
Pero ahora con eso de la memoria protegida y esas historias de Windows 2000/XP/Vista muchos programas DOS petaban al intentar escribir en memorias como la de video, no? Pregunto desde la mas profunda ignoracia.
Salu2...
Aquí hay un hilo sobre el tema:
http://www.thescripts.com/forum/thread128325.html
Citar
> Well, I don't know that much about linux, but it should be pretty much
> the same as in windows in this case - we can open several terminals when
> we run gui, so I assume every terminal process gets it's own chunk of
> memory and when I try to access segment b800, it simply works it out
What you say is true only if your program is an MS-DOS program, and even then it works not because your program is writing to the real hardware video buffer, but rather a simulated one -- part of a "virtual MS-DOS machine" created by the operating system
Asi que probablemente windows hace "pooling"[1] de escrituras en memoria de video (b800 y A000 quizas?) y copia los datos a otro buffer para que sea renderizado de verdad. MS-DOS en windows esta emulado, al menos a partir del kernel NT.
Por otra parte.
No es lo mismo un programa Win32 de consola, que un programa MS-DOS en windows. Puede que el Win32 de consola pete al intentar escribir en B800.
Yo sigo pensando que es un absurdo negarse a utilizar alguna buena libreria (como ncurses o aalib). No estamos en 1986.
[1] Soy asi de mal pensado.
---
UPDATE:
punteroApantalla[ x + y * TAMFILA] = "*"; no es pseudocodigo, es C valido. TAMAÑO_FILA es el numero de columnas en una fila, y punteroApantalla es un puntero.. a la zona de memoria de la pantalla de texto.
en un programa de ms-dos, puede tener algo así como este aspecto:
char far* punteroApantalla = (char far*)0xb800;
Creo que lo que buscas es algo como lo que se hacía en el viejo Spectrum: redefinir el juego de caracteres (los famosos UDG).
Eso es perfectamente posible simplemente modificando la dirección de memoria donde están esos datos. Cada carácter creo que era un array de 14 bytes (uno por fila) y, evidentemente, tienen 8 de ancho.
Hace muuuucho hice un programa que redefinía el juego de caracteres leyendo los datos de un fichero de texto algo como esto:
'A' = {
00000000b
00001000b
00011100b
00111110b
01111111b
00011100b
00011100b
00011100b
00011100b
00001000b
00000000b
00000000b
00000000b
00000000b
}
Luego sólo tenías que imprimir una 'A' para ver el dibujo que habías definido.
Es simple, pero efectivo. Lo utilicé para meter gráficos en un Mastermind y un Tetris en COBOL :lol:
Si tienes mucho interés, puedo buscarlo por ahí, supongo que incluso puedo pasarte el código fuente.
Eso sí... sólo funciona en DOS, olvídate de Windows en modo consola. Usa DOS puro o DOS BOX (supongo que ahí también funcionará).
Cita de: "sés"Creo que lo que buscas es algo como lo que se hacía en el viejo Spectrum: redefinir el juego de caracteres (los famosos UDG).
Eso es exactamente lo que buscaba
sés. Pero ¿¿no puedo hacerlo en modo consola MSDOS de Windows??
s2.
No creo, hacerlo requiere acceso directo a memoria del sistema... y Windows como que no te deja.
Hace años lo probé en un Windows NT y no hacía nada (tampoco daba error). No sé, quizás en un 2000 haga otra cosa, pero lo dudo.
Un texto curioso sobre el tema.
http://www.procon.com.au/HVFullSc.htm
Citar
Before we can replace these fonts with better alternatives, we must know which fonts the PC is currently using.
If you have never customized your system to load a CPI file (like most English speaking PC users) - you probably assume that your PC is only using video ROM BIOS fonts in full screen modes.
If the PC is running MS-DOS - or Windows 95/98/Me - that is probably correct.
However, Windows NT/2000/XP/Vista only use video ROM fonts in 16 bit modes. (This is during the boot process and when running NTVDM.EXE, the NT virtual DOS machine that 32 bit Windows launches to run COMMAND.COM and DOS applications).
CMD.EXE - the standard shell used in NT Console modes - is a 32 bit program - it does not use 16 bit mode unless it runs DOS programs.
Windows NT/2000/XP/Vista automatically loads a CPI file - usually EGA.CPI from the System32 subdirectory. (If a CPI file is not available 32 bit Windows will not support full screen modes.)
MS-DOS and Windows 95/98/Me can use CPI files - but the commands to initialize the display, and load the CPI file, must be explicitly given in the CONFIG.SYS and AUTOEXEC.BAT files. (If a CPI file is specified the PC only uses its video ROM fonts while booting.)
No muy util.
Cita de: "sés"No creo, hacerlo requiere acceso directo a memoria del sistema... y Windows como que no te deja.
[FRIKADA]Siempre puedes ejecutar tu programa en el ring0, que yo sepa asi tienes acceso directo al hardware y supongo que tambien a la memoria de video, busca en google "modificacion de tabla IDT" o "callgates"[/FRIKADA]
Cita de: "Marci"Cita de: "sés"No creo, hacerlo requiere acceso directo a memoria del sistema... y Windows como que no te deja.
[FRIKADA]Siempre puedes ejecutar tu programa en el ring0, que yo sepa asi tienes acceso directo al hardware y supongo que tambien a la memoria de video, busca en google "modificacion de tabla IDT" o "callgates"[/FRIKADA]
Demsiado avanzado para mi :oops: . ¿No existe algún programa que te permita editar la tabla ascii?
S2.
Dado que estamos recordando viejas glorias:
es sencillo pillar en C y programarte una interrupción.
Luego todas las interrupciones se ejecutan en modo administrador, pueden acceder a cualquier posicion de memoria, memoria que tienes tu definida con la información que quieres mostrar por pantalla, y esa interrupción la ejecutaría como si hicieras un gluSwapBuffers();
El problema es que hace mucho que no toco C + asm y dejé de hacer interrupciones, pero estaría bien retomar el tema jeje.