• Publicidad

Problemas con SDL::TTFont

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problemas con SDL::TTFont

Notapor josago » 2006-03-20 05:41 @278

Hola a todos, este es mi problema:

Estoy intentando hacer un motor 2D usando los bindings de SDL para Perl, y ahora me toca hacer la parte que muestra el texto. Como uso fuentes TrueType, para averiguar la longitud en píxels de una determinada cadena de texto hago lo siguiente:

Código: Seleccionar todo
my $ancho = $VENTANA{fuente} -> width( $_[1] );


Siendo $VENTANA{fuente} la fuente que he creado con SDL::TTFont -> new() y $_[1] la cadena de texto. Viene a ser lo que me dicen de hacer todos los manuales que he podido encontrar en internet. Sin embargo, en vez de devolverme el número de píxels, me devuelve lo siguiente:

Código: Seleccionar todo
> print $ancho."\n";
ARRAY(0x8421938)


Como no se me ocurre nada más, estoy intentando probar con el módulo GD::Text, a ver si tuviese más suerte...
josago
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-03-20 05:29 @270

Publicidad

Notapor kidd » 2006-03-20 09:51 @452

Hola:

Por lo que te regresa parece indicar que te está regresando una referencia a un array, intenta imprimir tu variable de la siguiente manera:

Código: Seleccionar todo
print @{$ancho}."\n";


Ahora, te recomiendo que leas de nuevo el manual para ver si te indica que tipo de variable te regresa una vez que pide el width.


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor josago » 2006-03-20 10:01 @459

Muchas gracias por tu respuesta 8)

He hecho lo que decías y siempre me devuelve el número 2, independientemente de la longitud de la cadena de texto. Por cierto, no entiendo la diferencia entre $ancho y @{$ancho}.

El manual que uso es el CPAN y las páginas man del módulo en cuestión, pero lo único que hacen es nombrar la función, ni siquiera me dicen qué es lo que devuelve. :(
josago
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-03-20 05:29 @270

Re: Problemas con SDL::TTFont

Notapor explorer » 2006-03-20 12:49 @576

josago escribiste:He hecho lo que decías y siempre me devuelve el número 2, independientemente de la longitud de la cadena de texto.
Eso es muy raro... he leído la documentación y he visto las fuentes:
Código: Seleccionar todo
sub width {
    my ($self,@text) = @_;
    my $aref = SDL::TTFSizeText($$self{-font},join(" ",@text));
    $$aref[0];
}
y el resultado debería ser el esperado: el ancho de lo que ocupa el texto. En la documentación pone que el comportamiento puede ser errático si se pasa NULL como texto. Haz una prueba con "Hola".
josago escribiste:Por cierto, no entiendo la diferencia entre $ancho y @{$ancho}.
La función debería devolverte un escalar, el ancho del texto, pero en realidad te está devolviendo un puntero a un array. El ponerlo en forma @{$ancho} es una forma de desreferenciarlo (queremos que nos de el contenido del array apuntado por $ancho).
josago escribiste:El manual que uso es el CPAN y las páginas man del módulo en cuestión, pero lo único que hacen es nombrar la función, ni siquiera me dicen qué es lo que devuelve. :(
Mira aquí.
Si no lo consigues funcionar, prueba llamando a SDL::TTFSizeText, como ves en el código. Te devolverá un apuntador a un array, con dos valores, siendo el ancho y alto del texto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor josago » 2006-03-20 14:00 @625

Creo que el problema está en la versión del SDL-Perl que estoy usando: la 1.20.3, ya que los links que me pones son para la 2.x.

Creo que voy a probar con la versión 2.x. (si es que consigo compilarla, porque creo que no hay paquete para Debian...).

Por cierto que el código de mi TTFont.pm es este:

Código: Seleccionar todo
sub width {
        my ($self,@text) = @_;
        SDL::TTFSizeText($$self{-font},join(" ",@text));
}


He probado por curiosidad a poner el tuyo pero sigue sin ir.
josago
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-03-20 05:29 @270

Notapor explorer » 2006-03-20 14:25 @642

En el código que pones, entonces vemos donde está el error: la salida de la función SDL::TTFSizeText, según la documentación, es un puntero a un array de dos valores, y por eso te sale lo del ARRAY(...).

Lo que me extraña ahora es que poniendo el código anterior (sacada de la v2), dicen que te sigue fallando. ¿Has dejado tu código como estaba al principio? Me refiero a cuando hacías $ancho = .... -> width( ... );

Es decir, ¿te falla esa línea aun cuando has puesto el núevo código de la función width en SDL::TTFont.pm? Cuando haces un print, ¿qué te sale ahora?
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor josago » 2006-03-21 12:33 @565

Gracias por tu respuesta.
Después de hacer lo que me dices me sigue saliendo el mismo 2 :evil: :evil:
Pienso que el problema está en que le estoy preguntando el número de elementos del array, y no el contenido de los mismos. Seguiré investigando a ver si consigo algo 8)
josago
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-03-20 05:29 @270

Notapor josago » 2006-03-21 12:39 @569

¡Ya lo he conseguido! :D :D :D

El código queda así:

Código: Seleccionar todo
my $ancho = $VENTANA{fuente} -> width( $_[1] );
print @{$ancho}[0]."\n";


Salida:
Código: Seleccionar todo
17
34
34
[...]
34
34
34
165
289
51
68
68
68
68
68
68
68
[...]
68
68


Muchísimas gracias por tu ayuda. :P

P.D.: Qué cosas tiene Perl, jejeje
josago
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2006-03-20 05:29 @270


Volver a Avanzado

¿Quién está conectado?

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

cron