CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 23 Oct 2017 19:54

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 17 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 21 Jul 2014 04:15 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
Hola, vengo con otra consulta.

¿Cómo puedo "multiplicar" un objeto que pertenece a una clase?

Les explico:

Tengo una clase:
Código:
Class Pajaro
with
   Salud 20,
   Velocidad 30,
...


Y tengo varios objetos que pertenece a esa clase:
Código:
Pajaro PajaroPequeno1 "pájaro pequeño";
Pajaro PajaroGrande1 "pájaro grande";


Y resulta que lo puedes capturar y, al hacerlo, entra a tu equipo:
Código:
Global Equipo1;
Global Equipo2;
...
Equipo1 = PajaroPequeno1;
Equipo2 = PajaroGrande1;
...


Resulta que, en el juego, ese PajaroPequeno1 puedes encontrarlo SIEMPRE en localidades específicas, pero es cosa tuya si lo capturas o no. Al capturarlo entra a tu equipo, y puedes reducirse su salud, etc., pero pasa que el original que está en la localidad X, sufre los mismos cambios que el que está en mi equipo.

¿Cómo podría hacer para que, al capturar el pájaro, sea un objeto "nuevo" que se multiplicó del original enocontrado, sin que el original sufra cambios? (espero haberme explicado).

Saludos.

PD: Se me ocurrió que, al capturarlo, entre a mi equipo, que es una variable global. Si mi método está mal y hay otro, les agradecería que me lo dijeran.


Arriba
 Perfil  
 
NotaPublicado: 21 Jul 2014 09:43 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Ya entiendo, realmente el objeto pájaro en tu equipo y el objeto pájaro en esa localidad son el mismo, ¿no? Inform te permite "multiplicar" objetos, com tú dices, pero siempre debes adjuntar el máximo.

Código:
Class Pajaro(20)
with
   Salud 20,
   Velocidad 30,
...


Así, como máximo sólo puede haber 20 pájaros en tu sistema. Para crear un pájaro nuevo, lo que puedes hacer es lo siguiente (te pongo además cómo adicionarlo a tu jugador, que creo que queda más ordenado que una variable global):

Código:
object Jugador [
private
    equipo Nothing,
with
    creaPajaro [;
        if ( Pajaro.remaining() < 1 ) {
            print "*** ERROR: max. de pajaros alcanzado.";
        }

        self.equipo = Pajaro.create();
    ],
];


Fíjate en que tienes, para este tipo de clases, el método remaining(), que te devolverá el número de objetos que aún puedes crear.

Si lo deseas, puedes eliminar un Pajaro creado llamando al método destroy:

Código:
self.equipo.destroy();


Todo esto está muy bien, aunque quizás no seas capaz de decir cuántos objetos Pajaro debes crear como máximo (en el caso de que sí puedas hacerlo, hazlo y no te comas más la cabeza).

http://inform-fiction.org/extensions/complete.html

Hay una extensión de I6 para crear objetos sin proponer un máximo:
http://mirror.ifarchive.org/if-archive/ ... s/dynobj.h

También necesitarás esta librería:
http://ifarchive.flavorplex.com/if-arch ... debuglib.h

¿Que cómo funciona? Solo debes incluir ambas en tu código, y definir tu clase Pajaro como:

Código:
class Pajaro(0)
with
    ! ...
;


Para crear un objeto de la clase Pajaro:

Código:
self.equipo = Pajaro.create();


Es decir, exactamente igual que antes. Para eliminarlo, llamas a destroy(). Eso sí, ten en cuenta que ahora el método remaining() siempre devolverá uno.

Espero que te ayude.

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 21 Jul 2014 18:02 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
baltasarq escribió:
Hola,

Ya entiendo, realmente el objeto pájaro en tu equipo y el objeto pájaro en esa localidad son el mismo, ¿no? Inform te permite "multiplicar" objetos, com tú dices, pero siempre debes adjuntar el máximo.

Código:
Class Pajaro(20)
with
   Salud 20,
   Velocidad 30,
...


Así, como máximo sólo puede haber 20 pájaros en tu sistema. Para crear un pájaro nuevo, lo que puedes hacer es lo siguiente (te pongo además cómo adicionarlo a tu jugador, que creo que queda más ordenado que una variable global):

Código:
object Jugador [
private
    equipo Nothing,
with
    creaPajaro [;
        if ( Pajaro.remaining() < 1 ) {
            print "*** ERROR: max. de pajaros alcanzado.";
        }

        self.equipo = Pajaro.create();
    ],
];


Fíjate en que tienes, para este tipo de clases, el método remaining(), que te devolverá el número de objetos que aún puedes crear.

Si lo deseas, puedes eliminar un Pajaro creado llamando al método destroy:

Código:
self.equipo.destroy();


Todo esto está muy bien, aunque quizás no seas capaz de decir cuántos objetos Pajaro debes crear como máximo (en el caso de que sí puedas hacerlo, hazlo y no te comas más la cabeza).

http://inform-fiction.org/extensions/complete.html

Hay una extensión de I6 para crear objetos sin proponer un máximo:
http://mirror.ifarchive.org/if-archive/ ... s/dynobj.h

También necesitarás esta librería:
http://ifarchive.flavorplex.com/if-arch ... debuglib.h

¿Que cómo funciona? Solo debes incluir ambas en tu código, y definir tu clase Pajaro como:

Código:
class Pajaro(0)
with
    ! ...
;


Para crear un objeto de la clase Pajaro:

Código:
self.equipo = Pajaro.create();


Es decir, exactamente igual que antes. Para eliminarlo, llamas a destroy(). Eso sí, ten en cuenta que ahora el método remaining() siempre devolverá uno.

Espero que te ayude.


Genial baltasarq. Lo entiendo. Probaré de ambas formas: con máximo y sin límites.

Muy buena explicación, gracias.

EDITO: Me aparecieron problemas. En el método "sin límites", incluí las librerías dynobj y la debuglib, pero al compilar me aparece esto:
Código:
.\dynobj.h(1): Error:  Expected directive, '[' or class name but found <
> Include "dynobj";<
.\dynobj.h(1): Error:  Too much text for one pair of quotations '...' to hold
>  <div id="wrapper"

El signo < que está después del ; no lo puse yo, pero me aparece al compilar.

En el método "con límite máximo", pude multiplicar la Clase, pero no a los objetos que pertenece a esa clase (porque tengo pájaros grandes, pequeños, agresivos, etc., y todos pertenecen a la clase Pajaro). Al intentar multiplicar la Clase no tengo problemas, pero al multiplicar el objeto que pertenece a esa clase, al jugar la aventura me aparece esto:
Código:
[** Programming error: pájaro pequeño (object 114681) has no property create to send message **]


¿Cómo puedo hacer para multiplicar el objeto que pertenece a X clase?

Gracias.


Arriba
 Perfil  
 
NotaPublicado: 21 Jul 2014 21:17 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

En cuanto al error que dices, tiene toda la pinta de que te hayas bajado mal las librerías, parece que tienen código HTML mezclado. Prueba a bajártelas desde la página de extensiones, con el botón derecho y guardar como.

Lo que dices de los pájaros pequeños, grandes... en realidad el problema es que tú has decidido que eso son objetos, cuando no lo son. El pájaro grande es una clase que hereda de pájaro, y tú crearás objetos a partir de esa clase (no se pueden crear objetos a partir de objetos). Por ejemplo:

Código:
class Pajaro
with
    ! ...
;

class PajaroGrande
class Pajaro
with
    ! ...
;


Así estás diciendo que la clase PajaroGrande hereda de Pájaro, o lo que es lo mismo, que es un tipo de pájaro. Piensa que, al fin y al cabo, las clases sirven exactamente para crear objetos.

Tienes explicada la herencia en el DM4:
http://inform-fiction.org/manual/html/s3.html#s3_8

Y está explicado también para InformATE! (lo explicado se aplica a I6Sp):
http://www.caad.es/informate/docs/html/ ... jetos.html

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2014 04:02 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
baltasarq escribió:
Hola,

En cuanto al error que dices, tiene toda la pinta de que te hayas bajado mal las librerías, parece que tienen código HTML mezclado. Prueba a bajártelas desde la página de extensiones, con el botón derecho y guardar como.

Lo que dices de los pájaros pequeños, grandes... en realidad el problema es que tú has decidido que eso son objetos, cuando no lo son. El pájaro grande es una clase que hereda de pájaro, y tú crearás objetos a partir de esa clase (no se pueden crear objetos a partir de objetos). Por ejemplo:

Código:
class Pajaro
with
    ! ...
;

class PajaroGrande
class Pajaro
with
    ! ...
;


Así estás diciendo que la clase PajaroGrande hereda de Pájaro, o lo que es lo mismo, que es un tipo de pájaro. Piensa que, al fin y al cabo, las clases sirven exactamente para crear objetos.

Tienes explicada la herencia en el DM4:
http://inform-fiction.org/manual/html/s3.html#s3_8

Y está explicado también para InformATE! (lo explicado se aplica a I6Sp):
http://www.caad.es/informate/docs/html/ ... jetos.html


Descargué la librería de nuevo y no me dio el mismo error.

Tienes razón, con clases puedo crear objetos. Lo malo es que, sumando todos los límites de las clases (alrededor de 60) no me compila, y me sale un mensaje parecido al que aparece cuando incluyo "dynobj" y "debuglib" (por cierto, me pidió "dynmem" pero ya la encontré):
Código:
C:\Program Files\InformATE!\lib\dynmem.h(57): Fatal error: The memory setting MAX_STATIC_DATA (which is 10000 at present) has been exceeded.  Try running Inform again with $MAX_STATIC_DATA=<some-larger-number> on the command line.


No sé qué hacer... hasta estoy pensando que es problema de InformATE! o no sé.


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2014 09:34 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

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

Citar:
Tienes razón, con clases puedo crear objetos. Lo malo es que, sumando todos los límites de las clases (alrededor de 60) no me compila, y me sale un mensaje parecido al que aparece cuando incluyo "dynobj" y "debuglib" (por cierto, me pidió "dynmem" pero ya la encontré):
Código:
C:\Program Files\InformATE!\lib\dynmem.h(57): Fatal error: The memory setting MAX_STATIC_DATA (which is 10000 at present) has been exceeded. Try running Inform again with $MAX_STATIC_DATA=<some-larger-number> on the command line.

No sé qué hacer... hasta estoy pensando que es problema de InformATE! o no sé.


Si te dijas en el mensaje, sólo te está diciendo que has sobrepasado cierto límite que viene preconfigurado en el compilador. Así, en lugar de compilar con:

Código:
inform miaventura.inf


Tendrás que hacerlo con:

Código:
inform $MAX_STATIC_DATA=20000 miaventura.inf

_________________
-- Baltasar, el arquero


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2014 20:19 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
baltasarq escribió:
Hola,

Citar:
Tienes razón, con clases puedo crear objetos. Lo malo es que, sumando todos los límites de las clases (alrededor de 60) no me compila, y me sale un mensaje parecido al que aparece cuando incluyo "dynobj" y "debuglib" (por cierto, me pidió "dynmem" pero ya la encontré):
Código:
C:\Program Files\InformATE!\lib\dynmem.h(57): Fatal error: The memory setting MAX_STATIC_DATA (which is 10000 at present) has been exceeded. Try running Inform again with $MAX_STATIC_DATA=<some-larger-number> on the command line.

No sé qué hacer... hasta estoy pensando que es problema de InformATE! o no sé.


Si te dijas en el mensaje, sólo te está diciendo que has sobrepasado cierto límite que viene preconfigurado en el compilador. Así, en lugar de compilar con:

Código:
inform miaventura.inf


Tendrás que hacerlo con:

Código:
inform $MAX_STATIC_DATA=20000 miaventura.inf


No sabía como compilar en la línea de comandos. Pero ya está, gracias por la ayuda. En caso que alguien esté en Windows, le copio cómo me funcionó:
Código:
"C:\Program Files\InformATE!\bin\inform.exe" -G -~D -~S +.\,"C:\Program Files\InformATE!\lib" $MAX_STATIC_DATA=50000 "C:\_JUEGOS_CREADOS_POR_MI\13\Borrador20.inf"

Todo va en una sola línea. Sirve para Glulx.


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2014 20:36 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1855
Si no entiendo mal, esos valores de configuración se pueden establecer también en el propio código fuente.

DM4 escribió:
If you need to use Inform without benefit of either a command line or a fancy front-end, or if you want your source code to specify its own switch settings, you can still set (most) switches by placing the directive
Código:
Switches ‹some settings›;

at the very beginning of your source code. (So that you can still override such settings, the switch -i tells Inform to ignore all Switches directives.)

http://inform-fiction.org/manual/html/s39.html


Arriba
 Perfil  
 
NotaPublicado: 22 Jul 2014 23:44 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
dddddd escribió:
Si no entiendo mal, esos valores de configuración se pueden establecer también en el propio código fuente.

DM4 escribió:
If you need to use Inform without benefit of either a command line or a fancy front-end, or if you want your source code to specify its own switch settings, you can still set (most) switches by placing the directive
Código:
Switches ‹some settings›;

at the very beginning of your source code. (So that you can still override such settings, the switch -i tells Inform to ignore all Switches directives.)

http://inform-fiction.org/manual/html/s39.html


Gracias. No me funcionó escribiendo eso al inicio del código. Probé de varias formas: sin $, con $, entre ", entre ', entre <>, con ;, sin ;, y otras combinaciones más.

Pero bueno, en el método de ir al símbolo del sistema, para no andar anotando todo al compilar, guardé la instrucción en un archivo cmd.

Saludos.


Arriba
 Perfil  
 
NotaPublicado: 23 Jul 2014 03:53 
Desconectado
Archivero
Archivero

Registrado: 19 Nov 2008 12:32
Mensajes: 268
para usar las ICL desde dentro del código tienes que hacer algo como:


Código:
!% -s
!% $MAX_ARRAYS=10000
!% $MAX_CLASSES=200
!% $MAX_VERBS=255
!% $MAX_LABELS=200000
!% $MAX_ZCODE_SIZE=500000
!% $MAX_STATIC_DATA=180000


Desde la mismísima primera linea del código.

Más info aquí.

_________________
I7 Spanish / Notas de desarrollo


Arriba
 Perfil  
 
NotaPublicado: 24 Jul 2014 23:02 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
tesheñes escribió:
para usar las ICL desde dentro del código tienes que hacer algo como:


Código:
!% -s
!% $MAX_ARRAYS=10000
!% $MAX_CLASSES=200
!% $MAX_VERBS=255
!% $MAX_LABELS=200000
!% $MAX_ZCODE_SIZE=500000
!% $MAX_STATIC_DATA=180000


Desde la mismísima primera linea del código.

Más info aquí.


Gracias. Sí me funcionó, al tiro.


Arriba
 Perfil  
 
NotaPublicado: 25 Jul 2014 04:10 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
Otro problema... ¿cómo puedo solucionar esto al compilar? (aparte de la solución obvia de reducir el límite de las class que hice)

Código:
Fatal error: One of the memory blocks has exceeded 640K


Arriba
 Perfil  
 
NotaPublicado: 25 Jul 2014 22:14 
Desconectado
Archivero
Archivero

Registrado: 19 Nov 2008 12:32
Mensajes: 268
prueba compilar para z8 (o para glulx)

_________________
I7 Spanish / Notas de desarrollo


Arriba
 Perfil  
 
NotaPublicado: 27 Jul 2014 03:12 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 09 Jun 2013 03:54
Mensajes: 59
tesheñes escribió:
prueba compilar para z8 (o para glulx)


Lo compilo en ulx, pero, bueno... parece que tengo demasiados datos en el juego.


Arriba
 Perfil  
 
NotaPublicado: 27 Jul 2014 06:41 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1601
Ubicación: Argentina
camilo_o escribió:
tesheñes escribió:
prueba compilar para z8 (o para glulx)


Lo compilo en ulx, pero, bueno... parece que tengo demasiados datos en el juego.


¡Cáspita!
La máquina Glulx permite archivos de hasta 4 GB, con lo que en la práctica la cantidad de datos medida según memoria ocupada no suele ser un problema.


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

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 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:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM