CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 12 Jul 2020 10:53

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 07 Ene 2011 15:00 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
¿Algún modo rápido de vacíar el inventario?

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 15:14 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Así:

Código:
Inventory inv = criatura.getInventory();
for ( int i = inv.size() - 1 ; i >= 0 ; i-- )
{
  criatura.removeItem( inv.get(i) );
}

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 15:21 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Así:

Código:
Inventory inv = criatura.getInventory();
for ( int i = inv.size() - 1 ; i >= 0 ; i-- )
{
  criatura.removeItem( inv.get(i) );
}


Sí con eso estaba pero no me salía, siempre se me quedaba uno en la bolsa. :lol:
Y es que estaba sumando en vez de restando... :oops:

Pensé que habría algo del estilo removeAll, pero ya veo que no.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 15:36 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
jenesis escribió:
Y es que estaba sumando en vez de restando... :oops:


Es un error típico que todo el mundo comete alguna vez en lenguajes de programación que usan listas accesibles por índices... el tema es que si vas borrando desde el principio hasta el final, los índices van cambiando.

O sea, tienes una lista con 4 elementos [1,2,3,4]. Así que borras el primer elemento, que es el 1. Te queda [2,3,4]. Así que cuando vas a borrar el segundo elemento... resulta que ahora el segundo elemento es el 3. Te has saltado el 2. :D

El truco típico para evitar esto es borrar o modificar los elementos del último al primero, de forma que los índices no cambien por el camino.

Estaba tan cantado que alguien se iba a encontrar alguna vez con este tema, que en la documentación puse un ejemplo de ello ( http://www.caad.es/aetheria/doc/doku.ph ... _inventory )

P.D: El método removeAll realmente existe en la clase Inventory, lo que pasa es que no se debe modificar realmente el Inventory de una criatura porque internamente las cosas guardan información sobre qué criatura las lleva. Si haces cambios directamente sobre el Inventory en lugar de llamar a métodos de la clase Mobile como removeItem, estarías rompiendo el enlace de la criatura a la cosa pero no el de la cosa a la criatura.

Se podría definir un método para quitarle todas las cosas a una criatura rompiendo las referencias bien, y que hiciese precisamente lo que has puesto, lo que pasa es que no me ha parecido que sea una operación muy común como para hacer al programador que recuerde un método más.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 16:01 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Se podría definir un método para quitarle todas las cosas a una criatura rompiendo las referencias bien, y que hiciese precisamente lo que has puesto, lo que pasa es que no me ha parecido que sea una operación muy común como para hacer al programador que recuerde un método más.


Hombre no es tan raro.
El personaje se cae y pierde toda sus cosas.
El personaje es atracado y se queda sin nada.
La aventura termina y no quieres que el usuario se ponga a jugar con las cosas del inventario.

El último es mi caso :lol:

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 16:18 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
En realidad para tu caso es más fácil hacer esto:

Código:
if ( un verbo que se puede usar después de acabar )
{
  bla bla bla...
}
else if ( otro verbo que se puede usar después de acabar )
{
  bla bla bla...
}
...
else //caso para todos los demás verbos
{
  aCreature.writeDenial("¡Eh, que la aventura ya ha terminado!\n");
  end();
}


¿No?

De todas formas, me apunto lo del removeAll.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 17:07 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
En realidad para tu caso es más fácil hacer esto:

Código:
if ( un verbo que se puede usar después de acabar )
{
  bla bla bla...
}
else if ( otro verbo que se puede usar después de acabar )
{
  bla bla bla...
}
...
else //caso para todos los demás verbos
{
  aCreature.writeDenial("¡Eh, que la aventura ya ha terminado!\n");
  end();
}


¿No?


No, porque el orden de preferencia del parseado pasa antes por los objetos, y ese código está en una localidad. De ahí la necesidad de deshacerme primero de todos los objetos.

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 17:10 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
jenesis escribió:
No, porque el orden de preferencia del parseado pasa antes por los objetos, y ese código está en una localidad. De ahí la necesidad de deshacerme primero de todos los objetos.

Bueno, pero para eso puedes ponerle al jugador una propiedad "acabó" a true, y meter ese código en el jugador (que tiene máxima prioridad) de forma que se ejecute sólo si "acabó" es true. Y así te ahorras todo ese tema de los inventarios o cualquier otra cosa que pueda intentar hacer después de acabar.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
NotaPublicado: 07 Ene 2011 17:41 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
jenesis escribió:
No, porque el orden de preferencia del parseado pasa antes por los objetos, y ese código está en una localidad. De ahí la necesidad de deshacerme primero de todos los objetos.

Bueno, pero para eso puedes ponerle al jugador una propiedad "acabó" a true, y meter ese código en el jugador (que tiene máxima prioridad) de forma que se ejecute sólo si "acabó" es true. Y así te ahorras todo ese tema de los inventarios o cualquier otra cosa que pueda intentar hacer después de acabar.


El parseCommand específico del jugador es un método muy potente y un arma de doble filo.
Hay que tener mucho cuidado cuando se manipula, porque puede mandar al traste al resto del mundo. Así que solo se toca cuando no hay más remedio y con muuuucha precaución. :lol:
Nah, prefiero dejarlo como está. :)

_________________
Si la mentira tuviera color, todos seríamos daltónicos...


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 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