2011-03-22 7 views
9

Muy nuevo en Inform7 y su estilo. He revisado los documentos proporcionados y la navegación por Internet no me ha dado nada ... esta es una versión simplista de lo que estoy buscando. Quiero escribir algo como esto:Necesita ayuda Creación de nuevos objetos en inform7

breakroom is a room. "A run of the mill breakroom." 

soda pop is a kind of thing. "A refreshing soda pop." 

soda machine is in the breakroom. dispense button is on the soda machine. 

instead of pushing dispense button: 
    say "A soda can dispenses". 
    create a soda pop (called pop) in the breakroom. 

"crear una gaseosa (llamada pop) en la sala de descanso." no es un comando válido, obviamente, pero espero que transmita lo que quiero hacer. No sé cómo crear instancias de objetos en tiempo de ejecución. ¿Se puede hacer esto de manera razonable? Cualquier ayuda sería apreciada. Soy consciente de que no hay muchos seguidores aquí para Informar, pero creo que lo probaría.

Respuesta

8

Informar no maneja muy bien los objetos dinámicos, pero a menudo no son el mejor enfoque de todos modos. La sección 10.3. Dispensers and Supplies of Small Objects en el manual puede ser útil.

Creo que el mejor modelo para esto es uno físico: crear un suministro limitado de latas en la máquina. Por ejemplo:

Breakroom is a room. "A run of the mill breakroom." 

A soda pop is a kind of thing. The description is "A refreshing soda pop." 

The soda machine is in the breakroom. It is fixed in place and transparent. 
The description is "Just an average soda machine, with a large dispense 
button." 

There are three soda pops in the soda machine. 

The dispense button is a part of the soda machine. 

Instead of pushing the dispense button: 
     if a soda pop (called the can) is in the soda machine: 
       move the can to the breakroom; 
       say "A soda can dispenses."; 
     otherwise: 
       say "The machine is empty, so nothing happens.". 

Test me with "look/x machine/push button/look/push button/
push button/push button/look". 

(hacer que la máquina en lugar de opaquetransparent si usted prefiere!). En lo anterior, también modifiqué la descripción de un refresco: si solo dice "Blah" en lugar de The description is "Blah" después de una definición de objeto, establece la descripción inicial (impresa como parte de la descripción de la habitación) en lugar de "examinar" descripción, que no creo que sea lo que quiere aquí, y he hecho del botón una "parte" de la máquina, en lugar de un objeto separado.

El resultado:

Welcome 
An Interactive Fiction 
Release 1/Serial number 110324/Inform 7 build 6G60 (I6/v6.32 lib 6/12N) SD 

Breakroom 
A run of the mill breakroom. 

You can see a soda machine (in which are three soda pops) here. 

>test me 
(Testing.) 

>[1] look 
Breakroom 
A run of the mill breakroom. 

You can see a soda machine (in which are three soda pops) here. 

>[2] x machine 
Just an average soda machine, with a large dispense button. 

In the soda machine are three soda pops. 

>[3] push button 
A soda can dispenses. 

>[4] look 
Breakroom 
A run of the mill breakroom. 

You can see a soda pop and a soda machine (in which are two soda pops) here. 

>[5] push button 
A soda can dispenses. 

>[6] push button 
A soda can dispenses. 

>[7] push button 
The machine is empty, so nothing happens. 

>[8] look 
Breakroom 
A run of the mill breakroom. 

You can see three soda pops and a soda machine (empty) here. 

> 
+0

Gracias por la ayuda aquí. Me di cuenta del ejemplo que mencionaste esta mañana. Esta es una buena ayuda. Sin embargo, un seguimiento sobre esto, si dijera que 2000 pops estaban en la máquina, consumiría una gran cantidad de memoria o almacenaría una pila de objetos idénticos en una cantidad mínima de espacio. (es decir, si 1 pop tiene 100 bytes, ¿2000 pops son 100x2000 bytes?) – deepee1

+0

No importa en este caso. Usando el enlace provisto había una oración que describía que cada objeto, de hecho, consumía la memoria. – deepee1

6

me escribió una extensión que hacer este tipo de cosas: http://inform7.com/extensions/Jesse%20McGrew/Dynamic%20Objects/index.html

Para usarlo, habría que crear un objeto prototipo (por ejemplo, "el refresco originales pop "), luego use la expresión a new object cloned from the original soda pop para crear una instancia del nuevo objeto. Esto es más eficiente en cuanto a la memoria que la creación de un grupo grande de objetos estáticos, pero no funciona en la máquina Z (solo Glulx) y tiene algunas advertencias si los objetos son complicados.

Además, piense seriamente si realmente necesita la creación dinámica de objetos. Puede ser más fácil y menos confuso para los jugadores si se les ocurre una razón sensata para rechazar la acción, como "No puedes permitirte gastar el dinero cuando ni siquiera has terminado el último refresco que compraste". Tener un par de miles de latas de refrescos es probable que haga el juego más lento sin agregar muchos beneficios.

+0

Tiene sentido. Aquí hay 1 ejemplo específico de lo que estaba planeando hacer. Tengo un arbusto que produce bayas cada 6 horas. Estas bayas pueden ser consumidas o almacenadas por el jugador más adelante. Aunque puedo encontrar fácilmente un límite práctico para la cantidad de bayas que un jugador puede llevar a la vez, me pareció que estaría escribiendo código para resucitar estas bayas del vacío después de ser comido o descartado, y ese código simplemente no me pareció muy elegante vs instanciar y destruir las bayas en la creación y la comida. De todos modos, gracias por el enlace de la extensión, lo verificaré. – deepee1

+0

La extensión no le permite destruir objetos, solo crear nuevos (ya que I7 carece de las características de introspección necesarias para evitar punteros colgantes).Entonces todavía necesitarías escribir algún tipo de código de reciclaje. –

Cuestiones relacionadas