CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Nov 2018 02:54

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 26 mensajes ]  Ir a página Anterior  1, 2
Autor Mensaje
NotaPublicado: 06 Nov 2009 17:16 
Desconectado
Archivero
Archivero

Registrado: 08 Sep 2008 22:04
Mensajes: 266
Eliuk Blau escribió:
No, short_name() no sirve para eso.


Cierto, ahora que he encontrado un rato en el curro para hacer pruebas veo que no, que contra mis esperanzas short_name sólo devuelve una cadena si se declara expresamente como tal. En caso de hacerlo, efectivamente, esa cadena serviría para pasarla a un array y de este array sacar la longitud y con ella calcular la posición de centrado.

En la práctica, claro, lo mismo da declarar un short_name que usar una propiedad creada por el usuario para lo mismo, al final vas a tener que escribir la cadena con ese texto para cada localidad de todas, todas. Redundante... (mientras no se nos ocurra algo mejor :-) )

--


Arriba
 Perfil  
 
NotaPublicado: 06 Nov 2009 23:12 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 726
Después de volveros locos me lo he pensado y creo que la aventura me gusta más sin que use ninguna barra de estado. Pero de todas formas, sigo muy interesado en saber cómo se hace sin tener que definir la propiedad short_name en todas la localidades de la aventura.

Y se que posiblemente va a ser algo demasiado rebuscado y difícil de entender, pero también siento curiosidad por ese hack feo del que has hablado, Eliuk.

Un saludo!


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2009 03:19 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Ya Makinaimo, aquí está el código que te prometí. Funciona en Inform6 (INFSP6) y es biplataforma (te funka tanto en Z como en Glulx). Para usarlo, debes hacer un Replace DrawStatusLine; antes del Include Parser; en el código de tu juego. Y debes copiar el siguiente código entre el Include "VerbLib"; y el Include "SpanishG"; :D

Código:
! un buffer temporal para calcular el largo de textos
#Ifdef VN_1630; ! compilador 6.30 o superior
  Array _AlmacenDeTexto_ buffer 160; ! 150 y algo caracteres deberian bastar
#Ifnot; ! compiladores viejitos
  Array _AlmacenDeTexto_ -> 160 + WORDSIZE;
#Endif; ! VN_1630

! sirve tanto para imprimir el nombre de la localidad como para
! redirigir su salida a PrintToBuffer() para contar caracteres
[ ImprimirNombreLocalidad;
    if (location == thedark) {
        print (name) location;
    }
    else {
        FindVisibilityLevels();
        if (visibility_ceiling == location)
            print (name) location;
        else
            print (The) visibility_ceiling;
    }
];

[ DrawStatusLine width pos;
    #Ifdef TARGET_GLULX;
    ! If we have no status window, we must not try to redraw it.
    if (gg_statuswin == 0)
        return;
    #Endif;

    ! If there is no player location, we shouldn't try to draw status window
    if (location == nothing || parent(player) == nothing)
        return;

    StatusLineHeight(gg_statuswin_size);
    MoveCursor(1, 1);

    width = ScreenWidth();
    spaces width;

    ! primero calculamos la posicion inicial para imprimir centrado
    ! IMPORTANTE: si cambias nombre o tamaño del buffer de texto temporal,
    ! debes cambiar los primeros 2 argumentos de PrintToBuffer() abajo
    pos = (width - PrintToBuffer(_AlmacenDeTexto_, 160, ImprimirNombreLocalidad)) / 2;
    MoveCursor(1, pos);        ! movemos cursor a posicion calculada
    ImprimirNombreLocalidad(); ! imprimimos ahora nombre de localidad

    MainWindow(); ! set_window
];


Sobre el hack, es este...
http://ifarchive.plover.net/if-archive/infocom/compilers/inform6/library/contributions/stringmaker.h

:D Saludos! Cualquier duda me avisas. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2009 11:47 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2909
Ubicación: España (Galicia)
Hola !

[quote="Eliuk Blau"]Ya Makinaimo, aquí está el código que te prometí. Funciona en Inform6 (INFSP6) y es biplataforma (te funka tanto en Z como en Glulx). Para usarlo, debes hacer un Replace DrawStatusLine; antes del Include Parser; en el código de tu juego. Y debes copiar el siguiente código entre el Include "VerbLib"; y el Include "SpanishG"; :D

Pero todas esas llamadas que hace el código, supongo que tendrás que utilizar Damusix o una de esas librerías tuyas, ¿no?

¿Y qué ha pasado con la librería de barras de estado de Presi?

Recordaba haberla utilizado en algún programa, y resulta ser ¡Qué noche!:

Código:
Replace DibujarLineaEstado;
Include "barra";

objeto_barra_estado barra_estado
  with
    modo BE_COMPUESTO,
    lineas_inv
       BE_INV_TOTAL,   
    disposicion  1  1 true BE_LOCALIDAD
                30  1 true BE_SOLO_HORA_AMPM
                50  1 true BE_TURNOS
                70  1 true BE_PUNTUACION
;

[ dibujarlineaestado; barra_estado.dibujar(); ];


Lo digo porque es mucho más flexible, y no hay que hacer "cosas raras". Ahora no lo recuerdo, pero supongo que permite centrar cosas.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2009 17:19 
Desconectado
Archivero
Archivero

Registrado: 08 Sep 2008 22:04
Mensajes: 266
baltasarq escribió:
Hola !
-Pero todas esas llamadas que hace el código, supongo que tendrás que utilizar Damusix o una de esas librerías tuyas, ¿no?
-¿Y qué ha pasado con la librería de barras de estado de Presi? (...) Lo digo porque es mucho más flexible, y no hay que hacer "cosas raras". Ahora no lo recuerdo, pero supongo que permite centrar cosas.


Corrijanme si me equivoco, pero juraría que las respuestas a ambas cosas son respectivamente no y no :)
El código aportado por Blauk no hace referencia a ninguna función externa a Inform y la librería de presi, según su documentación (salvo que también esté leyendo una versión vieja) permite hacer centrados... siempre que el usuario aporte la longitud del item a centrar , y precisamente el problema de Maki era, en última instancia, cómo averiguar esa longitud en el caso del nombre de la localidad, algo que resultaba ser bastante más complicado de lo que aparentaba a simple vista...

...hasta ahora, es decir, :wink: Blauk ha dado con la respuesta... ¡pero se limita a dar un código a copypastear sin explicarnos lo que nos interesa saber de verdad, es decir, cómo acceder a esa longitud. Rastreando su código se puede ver que el meollo de la cuestión radica en pasar el resultado de la función "print (name)" aplicada a location a la rutina "PrintToBuffer" que anda escondida por parserm.h (ver aquí (Z) y aquí (Glulx)). Síííí señoooor, ¡ahí estaba el truco! ¡Muy bueno!

--


Arriba
 Perfil  
 
NotaPublicado: 07 Nov 2009 21:47 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
DrVanHalenFan escribió:
...hasta ahora, es decir, :wink: Blauk ha dado con la respuesta... ¡pero se limita a dar un código a copypastear sin explicarnos lo que nos interesa saber de verdad, es decir, cómo acceder a esa longitud. Rastreando su código se puede ver que el meollo de la cuestión radica en pasar el resultado de la función "print (name)" aplicada a location a la rutina "PrintToBuffer" que anda escondida por parserm.h (ver aquí (Z) y aquí (Glulx)). Síííí señoooor, ¡ahí estaba el truco! ¡Muy bueno!


Exactamente :D.

Me excuso por no explicarlo detalladamente, porque ando muy corto de tiempo, y creí que Makinaimo necesitaría el código pronto para no "desmoralizarse", :wink:.

En fin, que sucede básicamente por esto: todas las funciones que vienen dentro de la rutina DrawStatusLine que copié vienen por defecto en Lib. 6/11 (que no en InformATE!) y son todas biplataforma (es por eso que he animado a Morgul a pasar InformATE! a Lib 6/11 para benificiarse de estas MUY UTILES rutinas y varias más). Además, ese código es exacto al de la StatusLine por defecto de 6/11, salvo que yo quité todos lo relacionado con la puntuación y otra hierbas y dejé sólo lo del título centrado.

El truco es el siguiente: no tenemos forma de acceder al título en la cabecera de un objeto (por medio de una propiedad) ni tenemos la seguridad de que el nombre siempre esté en short_name() [porque podría estar sólo en la cabecera del objeto]. Así que lo que tenemos que hacer es redirigir la salida de texto, cualquier texto que sea impreso en un momento determinado [ej: nombre de la localidad], hacia un buffer de texto (un array especial). Esto en Z se hace fácilmente, pero en Glulx es una cosa de diablos [el que no me crea, que mire la rutina PrintAnyToArray(), por dentro, que es la que usa PrintToBuffer() para funkar en Glulx]. En Z se redirige el texto hacia una salida especial, en Glulx hay que imprimir en la memoria... y otras cosas bien extrañas.

No me gusta reinventar la rueda, y Lib. 6/11 tiene varias rutinas biplataforma para hacerlo casi todo. Simplemente es cosa de usarlas y ya. PrintAnyToArray() es la forma de imprimir a un array, y es muy práctica porque te devuelve el número de caracteres impresos. Si quieres obtener sólo el numero de caracteres, y que el array no se modifique, le pones al segundo parámetro cero (el primero es el array). Lamentablemente, esta es sólo para Glulx. Pero para hacerlo portable, encapsularon su funcionalidad en PrintToBuffer(), que funka en Z y en Glulx. :D, así que usamos esta.

Lo que hacemos es encapsular todo el código que "infiere" el nombre de la localidad en una rutina que devuelva texto [ImprimirNombreLocalidad()]. Y luego, le decimos a PrintToBuffer() que imprima a un array el texto "devuelto" por esa rutina. Usamos la cantidad de caracteres impresos devueltos por PrintToBuffer() para hacer el cálculo de la posición centrada... cambiamos el cursor a la posición deseada, y luego llamamos de nuevo a ImprimirNombreLocalidad() para que imprima "efectivamente" el nombre.

:) Esa es toda la ciencia.

Saludos! :)

P.S.1: No Balta, como habrás visto, no usa ninguna librería externa. Si así hubiera sido, hubiera indicado las dependencias inmediatamente antes de poner nada. :)

[EDITADO]
P.S.2: También puede usarse la Barra.h para conseguir el mismo efecto. Entiendo que los valores de "disposición" pueden convertirse en rutinas y la librería los ejecutará. Si conviertes en rutina y metes dentro de la rutina el código para que se calcule el largo de texto con PrintToBuffer() debería funcionar también. OJO: La rutina ImprimirNombreLocalidad() es muy importante: imprimir el nombre de la localidad no es simplemente hacer "print (name) location" y ya... hay que hacer una serie de comprobaciones menores, como se ve en la rutina, para evitar errores. Así que si usas barra, de todas formas deberías imprimir el nombre con ImprimirNombreLocalidad(). Saludos!

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2009 15:03 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3039
Ubicación: Chile
baltasarq escribió:
Incanus escribió:
¡Grande, Baltasar!

Bueh, he engordado un poco, pero tampoco es para tanto. :-)


Era en modalidad de loa, parabién o saludo, estimado, no con intencíon de dimensionamiento, peso o tara :-P

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2009 15:14 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 10 Sep 2004 00:17
Mensajes: 3039
Ubicación: Chile
Eliuk Blau escribió:
Me excuso por no explicarlo detalladamente, porque ando muy corto de tiempo, y creí que Makinaimo necesitaría el código pronto para no "desmoralizarse", :wink:.

O sea... a la ahora que lo tirai con detalle... :-P

Porque, lo de arriba, estaba resumidito ¿no? Yaaaaa... 8)

Te pasaste, Eliuk ¡impresionante "resumen"! Estoy que te paso el testigo para la mantención de la web de InformATE! ya que estás lejos más capacitado que yo para programar en InformATE! (desarrollar y mantener InformATE!) que yo, que desarrollo con InformATE! (lo uso, pero no mantengo ni una mísera coma :oops: de la plataforma).

Lan verdad, como mantenedor de webs del CAAD (la de InformATE!, el Almacén de la Aventura) este año he estado más bien flojazo :oops:

¿Qué te parece, te animas a reemplazarme en la mantención de la web de InformATE! ?

_________________
[Incanus]
El Escritorio - Blog Aventurero y Literario


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2009 16:23 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 23 Abr 2004 08:49
Mensajes: 2909
Ubicación: España (Galicia)
Hola !

Eliuk Blau escribió:
P.S.1: No Balta, como habrás visto, no usa ninguna librería externa. Si así hubiera sido, hubiera indicado las dependencias inmediatamente antes de poner nada. :)


Es una pena que no haya un compendio de esas funciones tan útiles. Como en lo de newRoom(), yo buscando como un loco y no encontraba nada.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 08 Nov 2009 19:53 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 726
¡Eso era justo lo que estaba intentando hacer, Eliuk!
Me sabe faltal andar con tanta prisa y no tener tiempo suficiente para extenderme en elogios y palabras de agradecimiento, pero en fin. ¡Gracias por la ayuda!


Arriba
 Perfil  
 
NotaPublicado: 09 Nov 2009 06:41 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
baltasarq escribió:
Es una pena que no haya un compendio de esas funciones tan útiles. Como en lo de newRoom(), yo buscando como un loco y no encontraba nada.


Hay, lo que pasa es que se debe buscar con lupa. Mi próximo "INFSP6: Kit del Programador" (sí, ya va de una buena vez) viene con un compendio de todo el mejor material para Inform6. Son como 20 megas. Esos son, lejos, mi referencia obligatoria para todo mi trabajo habitual con el sistema de desarrollo. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 26 mensajes ]  Ir a página Anterior  1, 2

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM