CAAD
http://foro.caad.es/

[INFORMATE] ¿Crear objeto nuevo, a partir de otro?
http://foro.caad.es/viewtopic.php?f=12&t=5647
Página 1 de 2

Autor:  camilo_o [ 21 Jul 2014 04:15 ]
Asunto:  [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  baltasarq [ 21 Jul 2014 09:43 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  camilo_o [ 21 Jul 2014 18:02 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  baltasarq [ 21 Jul 2014 21:17 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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

Autor:  camilo_o [ 22 Jul 2014 04:02 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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é.

Autor:  baltasarq [ 22 Jul 2014 09:34 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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

Autor:  camilo_o [ 22 Jul 2014 20:19 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  dddddd [ 22 Jul 2014 20:36 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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

Autor:  camilo_o [ 22 Jul 2014 23:44 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  tesheñes [ 23 Jul 2014 03:53 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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í.

Autor:  camilo_o [ 24 Jul 2014 23:02 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Autor:  camilo_o [ 25 Jul 2014 04:10 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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

Autor:  tesheñes [ 25 Jul 2014 22:14 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

prueba compilar para z8 (o para glulx)

Autor:  camilo_o [ 27 Jul 2014 03:12 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

tesheñes escribió:
prueba compilar para z8 (o para glulx)


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

Autor:  Fernando Gregoire [ 27 Jul 2014 06:41 ]
Asunto:  Re: [INFORMATE] ¿Crear objeto nuevo, a partir de otro?

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.

Página 1 de 2 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/