Wintermute Engine Forum

Spanish forum => Foro técnico => Topic started by: bamyito on January 14, 2011, 07:49:41 PM

Title: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 14, 2011, 07:49:41 PM
No sabía cómo generalizar este post para poder usarlo mas adelante. creo que el título es bastante apropiado. os voy a exponer, de nuevo, el problema de la basura. A ver si a alguien se le ocurre algo... una solución, u otro metodo para resolverlo sin errores. He aquí el script de la basura:
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  Game.Interactive = false;    // Que el juego deje de ser interactivo (opcional).

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {

  case "scenes\Room\basuraclosed.sprite":    // Si la fuente tiene su "sprite" por defecto.
     actor.Talk("puaj, basura.");
    break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\Room\basuraopen.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Antes he tocado algo muy blando... y húmedo...");
break;
  }

  Game.Interactive = true;
 
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.GoToObject(this);    // Que el actor vaya a él (opcional).
  Game.Interactive = false;    // Que el juego deje de ser interactivo (opcional).

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {

  case "scenes\Room\basuraclosed.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.Talk("A ver qué encuentro...");
 actor.Talk("Un segundo.");
   this.SetSprite("scenes\Room\basuraopen.sprite");    // Asignarle otro "sprite".
  Game.TakeItem("albal");
  actor.Talk("esto podrá serme util. A ver algo más...");
  actor.Talk("...");
  Game.TakeItem("martillo");
    actor.Talk("¡Un martillo y un trozo de papel albal!");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\Room\basuraopen.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Bastante he buscado ya. ¿No crees?");
break;
  }

  Game.Interactive = true;
  }
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("¿saldrá el bicho de barrio sésamo?");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.Talk("¡¡Ya voy!!");
  actor.GoToObject(this);
}
Siempre comienzo las pruebas en la escena en la que está la basura. Pues bien:

1º- Si abandono la scene y vuelvo, la basura ha desaparecido >:(, con todos sus sprites, objetos y letreros en el ratón.

2º- Si no abandono la escena, la basura funciona estupendamente: La observa de diferentes formas dependiendo de su sprite, la usa y coge los objetos sin problemas, añadiendolos al inventario y no permitiéndome volver a cogerlos de la basura, cambia el sprite como debe,... en fin, todo estupendo ;D. Pero en cuanto salgo de la scene y vuelvo, ocurre lo mismo que en el caso 1: desaparece, y ya no puedo ni observarla, ni marcarla con el ratón ni nada. >:(

¿Qué ocurre?
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 15, 2011, 12:35:28 PM
Por si acaso publica también el script desde el que cargues la scene de la basura cuando vuelvas depués de haber salido de ella, a ver si encontramos algo raro.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 15, 2011, 03:36:27 PM
Supongo que te refieres al script scene.init de esta scene. Si no, no sé a qué te refieres. Igual es que me falta un script... :( En cualquier caso, en este scene.init solo modifiqué el tema de las entradas a la scene.
Code: [Select]
#include "scripts\base.inc"

// here comes the stuff which initializes the scene
global Entrada;
switch(Entrada)
{
  case "camino1":  // Si la escena anterior se llamaba "UnaEscena", ejecutar el código siguiente hasta "break;".
            actor.SkipTo(52, 584);    // Llevar al personaje a las coordenadas señaladas (en este caso "40,267").
            actor.Direction = DI_UPRIGHT;    // Poner al personaje mirando hacia arriba (de espaldas al jugador).
            break;
  case "camino2":  // Si la escena anterior se llamaba "UnaEscena", ejecutar el código siguiente hasta "break;".
            actor.SkipTo(19, 108);    // Llevar al personaje a las coordenadas señaladas (en este caso "40,267").
            actor.Direction = DI_DOWNRIGHT;    // Poner al personaje mirando hacia arriba (de espaldas al jugador).
            break;
 case "Salida":  // Si la escena anterior se llamaba "UnaEscena", ejecutar el código siguiente hasta "break;".
            actor.SkipTo(586, 361);    // Llevar al personaje a las coordenadas señaladas (en este caso "40,267").
            actor.Direction = DI_DOWNLEFT;    // Poner al personaje mirando hacia arriba (de espaldas al jugador).
            break;
 default:    // Si la escena anterior no se llama "UnaEscena" ni "OtraEscena" ni "UnaEscenaMas", ejecutar el código siguiente hasta el final.
            actor.SkipTo(400, 400);
            actor.Direction = DI_RIGHT;
}


////////////////////////////////////////////////////////////////////////////////
// scene state
global StateRoom;


// default values
if(StateRoom==null)
{
  StateRoom.Visited = false;
  // add scene states here
}



////////////////////////////////////////////////////////////////////////////////
// setup scene according to state variables



////////////////////////////////////////////////////////////////////////////////
if(!StateRoom.Visited)
{
  StateRoom.Visited = true;

  // this is our first visit in this scene...
}

Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 16, 2011, 12:16:08 AM
No, no me refería a este script si no al de la escena desde la que vuelves a esta. Tendrás otra escena en la que tendrás una región que cuando hagas clic con el ratón cargue esta escena (la de la basura), me refiero a ese script al que carga esta escena de nuevo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 16, 2011, 09:03:11 PM
Ok. Lo que pasa es que hay 3 regiones desde las que vuelve a la escena de la basura: 2 caminos desde la scene BUS y otra desde la scene new_scene. Te dejo los 3, aunque son casi idénticos:
Camino1
Code: [Select]
#include "scripts\base.inc"

////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
actor.GoToObject(this);
global Entrada = "camino1";
Game.ChangeScene("scenes\Room\Room.scene");
}
on "LeftDoubleClick"    // Al darle doble clic izquierdo...
{
global Entrada = "camino1";
 Game.ChangeScene("scenes\Room\Room.scene");    // ...cambiar la escena.
}
Camino2
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
  global Entrada = "camino2";    // Declarar la variable global "Entrada" y darle el valor "X".
        Game.ChangeScene("scenes\Room\Room.scene");    // Cambiar a la escena B.
}
on "LeftDoubleClick"    // Al darle doble clic izquierdo...
{
 global Entrada = "camino2";
 Game.ChangeScene("scenes\Room\Room.scene");    // ...cambiar la escena.
}
Salida
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
  global Entrada = "Salida";
Game.ChangeScene("scenes\Room\Room.scene");
}
on "LeftDoubleClick"    // Al darle doble clic izquierdo...
{
global Entrada = "Salida";
 Game.ChangeScene("scenes\Room\Room.scene");    // ...cambiar la escena.
}
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 17, 2011, 09:25:59 AM
La verdad es que yo no veo nada raro. No me extrañaría que lo que te pasa esté relacionado con el tema de las rutas absolutas que hemos visto en el post de la compilación. Corrige las rutas absolutas para ponerlas relativas y tal vez resuelvas dos problemas de una tacada.
Otra cosa que he visto es que defines la variable global Entrada cada vez que la usas en un método, eso no es conceptualmente correcto. Dado el ámbito global de la variable lo lógico es que la definas una sola vez al inicio del script y luego la asignes donde necesites. Quedaría más o menos así:

Code: [Select]
#include "scripts\base.inc"

global Entrada;

////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
actor.GoToObject(this);
Entrada = "camino1";
Game.ChangeScene("scenes\Room\Room.scene");
}
on "LeftDoubleClick"    // Al darle doble clic izquierdo...
{
Entrada = "camino1";
Game.ChangeScene("scenes\Room\Room.scene");    // ...cambiar la escena.
}
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 17, 2011, 05:28:07 PM
Ruta relativa corregida, y variables globales entrada corregidas. Y la maldita basura sigue desapareciendo cuando salgo y vuelvo de la scene...  >:(

He intentado hacer otro caso de objetos que se combinan, cambian los sprites de determinados objetos de la scene y obtengo otros objetos diferentes. Y seguro que me estoy equivocando en una chorrada, pero no funciona.
lo que me gustaría que me dijeseis es: ¿cual es el mejor método para solucionar estas "interacciones"? Yo he usado el método por el cual conseguí encender la fuente, que cambiase de sprite, usar un objeto con ella y demás. Luego lo probé en la basura, y ya conoceis los resultados. Pues bien, ahora he probado con una chimenea, y me da errores en las partes que lo tengo dividido para que diga y haga cosas diferentes dependiendo de su sprite (al igual que hacía con la fuente), en este caso, en las funciones "on jarrolleno" y "on lookAt". El resto de órdenes sí que funcionan bien.
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
 Game.Interactive = false;
 
  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
  actor.TurnTo(this);
   actor.Talk("El fuego ese está muy fuerte.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
  actor.TurnTo(this);
actor.Talk("Solo han quedado algunas ascuas en el fondo.");
break;
  }
   Game.Interactive = true;
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.TurnTo(this);
  actor.Talk("Si, claro que si. ahora mismo lo cojo.");
  actor.Talk("¿Con la mano o con la boca, Torrente?");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.TurnTo(this);
  actor.Talk("Fueguecito fueguecito, mira que estás calentito.");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
on "jarrolleno"
{
 Game.Interactive = false;
 actor.GoToObject(this);

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.Talk("Ahí va.");
actor.PlayAnim("actors\molly\ur\take1.sprite");
    this.SetSprite("scenes\new_scene\fuegooff.sprite");    // Asignarle otro "sprite".
Game.DropItem("jarrolleno");
Game.TakeItem("jarro");
actor.PlayAnim("actors\molly\ur\take2.sprite");
actor.Talk("Ala, el fuego apagado.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Ya está suficientemente bien apagado.");
break;
  }
   Game.Interactive = true;
}

Igual es que hay otro método mas práctico para hacer esto mismo. de todas formas, os dejo tambien el script de la fuente, en el que me basé, que este sí que funciona a las mil maravillas:
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  Game.Interactive = false;    // Que el juego deje de ser interactivo (opcional).

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {

  case "scenes\BUS\fuente.sprite":    // Si la fuente tiene su "sprite" por defecto.
     actor.Talk("Es una fuente apagada. Tiene un botón.");
    break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\BUS\fuenteon.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("¡Mirala que bonica ella, hechando aguica y tó!");
break;
  }
 
  Game.Interactive = true;
}


////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.GoToObject(this);    // Que el actor vaya a él (opcional).
  Game.Interactive = false;    // Que el juego deje de ser interactivo (opcional).

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {

  case "scenes\BUS\fuente.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.Talk("Encendiendo motores...");
    this.PlaySound("scenes\BUS\stream-3.wav",true);    // Que la fuente reproduzca el sonido y que lo repita.
    this.SetSprite("scenes\BUS\fuenteon.sprite");    // Asignarle otro "sprite".
    actor.Talk("¡Funciona de maravilla!");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\BUS\fuenteon.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Mejor la vuelvo a dejar como estaba antes.");
    this.StopSound();    // Detener el sonido que estaba reproduciendo.
    this.SetSprite("scenes\BUS\fuente.sprite");    // Devolverle su "sprite" anterior.
break;
  }

  Game.Interactive = true;
  }
 
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("Fuentecita fuentecita, ¿quien es de todas la mas fresquita?");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.Talk("¡¡Ya voy!!");
  actor.GoToObject(this);
}
on "jarro"
{
actor.GoToObject(this);    // Que el actor vaya a él (opcional).
  Game.Interactive = false;    // Que el juego deje de ser interactivo (opcional).

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {

  case "scenes\BUS\fuente.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.Talk("No tiene agua.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\BUS\fuenteon.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Leno, por favor.");
   Game.DropItem("jarro");
Game.TakeItem("jarrolleno");
actor.Talk("¡Agüita fresquita pa la nena!");
break;
  }

  Game.Interactive = true;
}
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 17, 2011, 05:34:30 PM
La verdad es que no veo nada raro ¿qué errores te dan exactamente esos métodos?
Aunque ya imagino que sí pero ¿te has asegurado de que la ruta de los sprites que haya en el archivo .scene también sea relativa?
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 18, 2011, 12:07:50 AM
Ruta de sprites confirmada.

El segundo script (la fuente) no me da ningún problema. Hace exactamente lo que quiero. ::rock

El primer script (el fuego) no da ningún error en la consola, pero no hace lo que yo le pido. Los comandos (o funciones o como se llamen) que solo tienen una opción (que funcionan igual, sea cual sea su sprite) no dan ningún problema (es el caso de on Talk, on Take y "on leftClick"). Sin embargo, cuando uso los comandos "on jarrolleno" y "on lookAt" (que son los que difieren las opciones dependiendo del sprite del fuego) no realiza ninguna acción. Los ignora, como si no existieran.

Y el error de la basura, como ya he explicado, no es tal, ya que no sale nada en la consola. Sin embargo, al salir de la scene y volver, ha desaparecido.

si los scripts están bien, tanto la basura como el fuego deberían funcionar sin problemas... y no es así. :-\
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 18, 2011, 09:08:17 AM
Por lo que comentas de la chimenea da la impresión de que el sprite que tienes asignado no es ninguno de los dos por los que preguntas. Este extremo puedes confirmarlo añadiendo un default: al switch. Para saber que sprite tiene asignado lo más fácil es que uses un Game.Msg que te lo diga. Te pongo como quedaría el método con estas dos cosas que te acabo de decir:

Code: [Select]
on "LookAt"
{
 Game.Msg(this.GetSprite());  //Nos muestra en la parte superior izquierda del juego el nombre del sprite asignado a esta entidad
 Game.Interactive = false;
 
  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
  actor.TurnTo(this);
   actor.Talk("El fuego ese está muy fuerte.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
  actor.TurnTo(this);
actor.Talk("Solo han quedado algunas ascuas en el fondo.");
break;
   default:   //Si el sprite asignado no es ni fuegoon ni fuegooff
   actor.Talk("Parece que el sprite asignado no es ninguno de los anteriores.");
   }
   Game.Interactive = true;
}

Respecto a lo de la basura lo único que se me ocurre ya es que me pases el código fuente del proyecto y le echo un vistazo tranquilamente cuando tenga tiempo.

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 18, 2011, 07:14:32 PM
¿el codigo fuente? no sé lo que es. ???

Vale, error encontrado. tenía ligado al script un png en lugar del sprite ;D
Pero ahora me surge otro problema con el sprite, y es que no aparecen las imagenes enlazadas a el. O sea, not image found. Sin embargo, al editar el sprite, sí que tiene su imagen png asignada.
¿Sabes por qué podría ser?
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 18, 2011, 07:18:33 PM
y otra cosa: ha aparecido un archivo de texto en la carpeta de la scene de la chimenea, que se llama SpriteEdit. no ha aparecido en ninguna de las otras escenas.
¿Qué es?
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 18, 2011, 07:24:11 PM
Podría ser tema de que antes tuviese rutas absolutas y al cambiarlas a relativas ya no las encuentre porque en el fichero sprite sean absolutas o algo así, mírate el fichero .sprite a ver si es algo de eso. En cualquier caso a las malas siempre puedes volver a generar el sprite y listo.

Con el código fuente me refiero a que me pases la carpeta donde tengas el proyecto (con todos los archivos y subcarpetas naturalmente) y le echo un vistazo cuando pueda a ver si te localizo el error.

El fichero SpriteEdit creo que es el log del editor de sprites, échale un vistazo porque tal vez te de alguna pista acerca del Invalid Image.

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 18, 2011, 08:09:30 PM
 ;DVale, sprites de la chimenea corregidos. Era lo de las rutas absolutas. Tengo que aprender a organizarme para trabajar.

y ¿cómo te mando el archivo del proyecto, despues de comprimir la carpeta? creo que por aquí no se pueden mandar archivos. mandame un MP con tu cuenta de correo y te lo mando ahí. O si prefieres otro método, explicamelo por MP y lo hacemos como veas.

un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 18, 2011, 08:24:05 PM
Acabo de enviarte un MP con mi cuenta de correo electrónico.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 22, 2011, 12:03:30 AM
Bueno, pues ya está solucionado el misterio de la basura que no quería ser interactiva. Os dejo el relato de los hechos por si a alguien más le pasa algo similar. El problema era que había definidas dos entities en la misma zona de la pantalla en la que se encontraba la famosa basura (una sprite entity y una region entity). La región entity no estaba marcada como activa y por tanto no era interactiva con el ratón y además estaba puesta más abajo que la sprite entity en el árbol de nodos. Cuando el motor de WME pinta los nodos en la pantalla lo hace siguiendo el árbol, empezando por el que está más arriba y terminando por el que está más abajo. Esto hacía que la region entity (al estar más abajo) quedase pintada encima de la sprite entity y por lo tanto no se pudiese interactuar con la sprite entity que estaba oculta debajo de la region entity. Espero haberme explicado... La solución es tan sencilla como mover la region entity en el árbol de nodos justo encima de la sprite entity aunque, dado que nunca se marcaba como activa, si no se va a usar la region entity para nada yo la borraría para evitar consumos innecesarios de memoria.

Lo que no entiendo es porque nada más cargar el juego sí que te deja interactuar con la sprite entity pero eso creo que sólo Mnemonic podría explicárnoslo  ;D

Es fundamental que os leáis la ayuda de WME para entender este tipo de cosas y no volveros locos. Al menos deberíais leer la parte del tutorial en la que se explica como se crea una escena paso a paso, ya que ahí están muy bien explicadas todas estas cosas (y no es excusa no saber inglés que para eso me molesté yo en su día en traducir esa parte al español).

Un saludo.

Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 23, 2011, 09:47:56 PM
He leido todo el tutorial. Un par de veces. Lo que pasa es que se olvidan algunas cosillas, y claro, como la region estaba desactivada, pensaba que era inútil y no estorbaría. Una vez borrada, no hay problemas.
De todas formas, lo leeré todo de nuevo. Para que no haya mas dudas de este tipo.
Gracias por todo. Seguiré preguntando.
1 abrazo!
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 24, 2011, 05:25:01 PM
vale, otro problema:
Quiero, mediante un puzzle, echar agua al fuego, que este se apague y queden ascuas (conseguido).
tambien quiero colocar sobre una estreves un trozo de papel albal que tengo en el inventario, para poder colocar ahí las ascuas. y aquí es donde surge el problema.

Si no me equivoco mucho, debo poner un evento llamado on "albal" en el script de la estreves. Y en el script del albalvacio (el de la scene) he puesto this.active = false al principio, con lo cual consigo que no se vea al principio de la scene. El problema surge cuando quiero ponerlo en true desde el script de la estreves. Tambien he quitado en el editor de escenas el item, para poder hacer que aparezca y desaparezca de manera manual mediante el código (como me sugirió Juan Bonair hace tiempo).

Pues bien, resulta que no sé cómo poner el albalvacio.active = true, para que aparezca cuando combino el albal con la esteves. Me da el siguiente error:
Quote
17:03:27:  Compiling script 'scenes\new_scene\scr\estreves.script'...
17:03:27:    Error@line 33: Variable 'albalvacio' is referenced but not defined
¿por qué no está definido? ¿cómo lo defino? os dejo los 3 scripts, el de la estreves, el del item albal, y el del objeto de la escena albalvacio.

esteves:
Code: [Select]
#include "scripts\base.inc"



////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.TurnTo(this);
  actor.Talk("Es una estreves.");
  actor.Talk("Suele usarse para poner cosas calientes encima.");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.TurnTo(this);
  actor.Talk("Está bien ahí.");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("No me da la gana.");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
////////////////////////////////////////////////////////////////////////////////
on "albal"
{
  actor.TurnTo(this);
  Game.DropItem("albal");
  albalvacio.Active = true;
}

Item albal:
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.Talk("Papel albal. Del coco.");
}

////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  Game.SelectedItem = "albal";
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("paso.");
}

albalvacio de la scene:
Code: [Select]
#include "scripts\base.inc"


this.Active = false;
////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.TurnTo(this);
  actor.Talk("El trozo de papel albal está colocado encima de la estreves.");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
actor.GoToObject(this);
  actor.PlayAnim("actors\molly\ur\take1.sprite");
  Game.TakeItem("albal");
  this.Active = false;
  actor.PlayAnim("actors\molly\ur\take2.sprite");
  actor.Talk("pa la saca.");
}

////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("No.");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
Lo peor del asunto es que seguro que es una tontada donde está el fallo... ::slug
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 27, 2011, 10:12:41 AM
Si el albalvacio está definido en la scene como una entity (que no sea free) debes usar Scene.GetNode("albalvacio"), con lo que el código de estreves quedaría similar a este:

Code: [Select]
#include "scripts\base.inc"



////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.TurnTo(this);
  actor.Talk("Es una estreves.");
  actor.Talk("Suele usarse para poner cosas calientes encima.");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.TurnTo(this);
  actor.Talk("Está bien ahí.");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("No me da la gana.");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
////////////////////////////////////////////////////////////////////////////////
on "albal"
{
  var albalEntity = Scene.GetNode("albalvacio");
  actor.TurnTo(this);
  Game.DropItem("albal");
  albalEntity.Active = true;
}

No lo he probado pero creo que así debería de funcionarte. Por cierto, si tuvieses definido albalvacio como una free entity entonces tendrías que usar Scene.GetFreeNode("albalvacio")

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 27, 2011, 06:29:06 PM
ok, eso solucionado. Y ahora, me surge otro problema:
Para que no aparezca el albal sobre la estreves, en el script albalvacio tengo puesto al principio "this.Active = false;" y luego, desde la estreves, lo activo y sale. Hasta aquí bien. Pero el problema viene al salir de la scene y volver a entrar. Supongo que vuelve a cargar el script de albalvacio y, por consiguiente, vuelve a ponerse en "this.Active = false;" con lo que desaparece.

La próxima vez simplemente lo haré cambiando el sprite de la estreves por otro sprite que salga la estreves con el albal, y así será mas sencillo y dará menos problemas.

Pero ya puestos en faena, me gustaría que me dieseis alguna idea de cómo conseguir que el albal no desaparezca por este método, para aprender un poco más, vaya. Por si hiciese falta en otro momento.

Que guai! ya localizo los problemas, veo algunas soluciones (solo algunas), voy entendiendo el lenguaje... poco a poco, pero avanzando. ::rock
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 28, 2011, 09:14:21 AM
Si albalvacio lo tienes definido como una entity de la scene quita la línea this.Active = false del script. Para que al principio no aparezca el albal simplemente márcalo como no activo en tiempo de diseño (quita el check del cuadradito blanco que sale a la izquierda del nombre de la entity en el árbol de nodos). De esta forma será el motor de WME el encargado de recordar el estado de cada nodo cuando salgas de la escena de modo que si saliste con él activo, volverá a estar activo cuando regreses mientras que si saliste con él inactivo así estará a tu vuelta.

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: novato on January 28, 2011, 06:06:23 PM
ola a todo, me acabode descargar el programa, ero ya ñllevo intentando haceralgo 3horas y no lo consigo, nosenada de estos temas pero me gustaria saber, me podrias poner una guia? hos estaria agradecido
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 28, 2011, 07:15:57 PM
Te aconsejo que empieces por leerte el tutorial que viene con la ayuda del programa...
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 28, 2011, 07:57:58 PM
Vale, conseguido. ::rock otro problemilla:
Una vez apagado el fuego (sprite fuegooff) quiero, con unas tenazas, sacar ascuas y ponerlas en el albal. pero claro, solo quiero que las ponga cuando el albal esté visible, y que diga que no puede cuando no esté aún puesto el albal en su sitio. Y aquí es donde me surge el problema. Si fuera un sprite de "no albal", otro sprite de "albal" y otro de "albalascuas" podría hacerlo al igual que con la basura, la chimenea o la fuente. Pero claro, el albal está o no está dependiendo de si está visible la Entity albal, y no sé jugar con esa variable. He probado de varias formas, pero no encuentro el "método", "llamada" o "orden" que lo defina para que, en función de que esté o no activo el albal sobre la estrevez, haga unas cosas un otras.
Aquí os dejo el código. Se que, al menos, la linea 89 está mal, ya que no es un sprite el albal entity... en fin, a ver si sois capaces de aclararme un poco este aspecto de la programación.
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
 Game.Msg(this.GetSprite());  //Nos muestra en la parte superior izquierda del juego el nombre del sprite asignado a esta entidad
 Game.Interactive = false;
 
  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
  actor.TurnTo(this);
   actor.Talk("El fuego ese está muy fuerte.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
  actor.TurnTo(this);
actor.Talk("Solo han quedado algunas ascuas en el fondo.");
break;
   
default:   //Si el sprite asignado no es ni fuegoon ni fuegooff
   actor.Talk("Parece que el sprite asignado no es ninguno de los anteriores.");
   }
   Game.Interactive = true;
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.TurnTo(this);
  actor.Talk("Si, claro que si. ahora mismo lo cojo.");
  actor.Talk("¿Con la mano o con la boca, Torrente?");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.TurnTo(this);
  actor.Talk("Fueguecito fueguecito, mira que estás calentito.");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
on "jarrolleno"
{
 Game.Interactive = false;
 actor.GoToObject(this);

  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.Talk("Ahí va.");
actor.PlayAnim("actors\molly\ur\take1.sprite");
    this.SetSprite("scenes\new_scene\fuegooff.sprite");    // Asignarle otro "sprite".
Game.DropItem("jarrolleno");
Game.TakeItem("jarro");
actor.PlayAnim("actors\molly\ur\take2.sprite");
actor.Talk("Ala, el fuego apagado.");
break;    // ¡Línea importante! Nunca la olvides.

  case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
    actor.Talk("Ya está suficientemente bien apagado.");
break;
  }
   Game.Interactive = true;
}

on "jarro"
{
actor.Talk("El jarro está vacío. No serviría de mucho.");
}
////////////////////////////////////////////////////////////////////////////////
on "tenazas"
{
 var albalEntity = Scene.GetNode("albalvacio");
 Game.Interactive = false;
 
  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
  actor.TurnTo(this);
   actor.Talk("El fuego está muy fuerte. No puedo usar las tenazas ahí.");
break;    // ¡Línea importante! Nunca la olvides.

case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
   switch(albalEntity.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
  case "scenes\new_scene\albalvacio.sprite":    // Si la fuente ya tiene su otro "sprite".
  actor.GoToObject(this);
actor.Talk("Voy a sacar unas ascuas en el papel albal.");
actor.Talk("Y espero que el papel albal esté en su sitio.");
break;
   
   default:    // Si la fuente tiene su "sprite" por defecto.
  actor.TurnTo(this);
   actor.Talk("No tengo dónde colocar las ascuas una vez cogidas.");
break;    // ¡Línea importante! Nunca la olvides.
   }
   }
   Game.Interactive = true;
}
Un abrazo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: novato on January 28, 2011, 10:13:37 PM
gracias por contestar jose, ya lo leí, pero yo me referia haber si teniais un ejemplo de juego en el qe me va esplicando paso a paso como crearlo , teneis? os lo agradeceria  :)
un abrazo
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 29, 2011, 09:12:47 AM
Me temo que de eso no hay nada más que lo que viene en el tutorial de la ayuda. En este link http://res.dead-code.org/doku.php/wmebook:start (http://res.dead-code.org/doku.php/wmebook:start) tienes otro tutorial tal vez algo más detallado pero no está completo, mira a ver si te sirve de algo.

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: Jose on January 29, 2011, 09:27:02 AM
Si preguntas por el sprite asignado a la entity albalvacio siempre te va a dar lo mismo puesto que, por lo que he visto, no cambias dicho sprite en ningún momento. Lo que debes hacer es preguntar si la entity está visible (Active==true) o no (Active==false). El código del método tenazas quedaría algo así (no lo he probado pero creo que debería servirte para lo que quieres):

Code: [Select]
////////////////////////////////////////////////////////////////////////////////
on "tenazas"
{
 var albalEntity = Scene.GetNode("albalvacio");
 Game.Interactive = false;
 
  switch(this.GetSprite())    //  Establecemos el "sprite" de la fuente como variable a comparar.
  {
   case "scenes\new_scene\fuegoon.sprite":    // Si la fuente tiene su "sprite" por defecto.
    actor.TurnTo(this);
    actor.Talk("El fuego está muy fuerte. No puedo usar las tenazas ahí.");
    break;    // ¡Línea importante! Nunca la olvides.

   case "scenes\new_scene\fuegooff.sprite":    // Si la fuente ya tiene su otro "sprite".
    if(albalEntity.Active==true)   
    {
      actor.GoToObject(this);
      actor.Talk("Voy a sacar unas ascuas en el papel albal.");
      actor.Talk("Y espero que el papel albal esté en su sitio.");
    }
    else
    {
      actor.TurnTo(this);
      actor.Talk("No tengo dónde colocar las ascuas una vez cogidas.");
    } 
  }

 Game.Interactive = true;
}

Un saludo.
Title: Re: Interacciones, cambios de sprite, objetos e inventario.
Post by: bamyito on January 29, 2011, 06:11:58 PM
Tio, te quiero. ;D
Sigo investigando estas cosas. Aunque ahora es el tema de los diálogos el que me da problemas.  ::slug
Pero weno, cada tema en su post.

 ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock ::rock

Amigo novato, sé lo frustrante que es iniciarse aquí (yo aún estoy en ello). Aquí te dejo el link donde puedes bajar traducciones del programa, de las ayudas y demás (por si, al igual que yo, el inglés te abruma), donde te explica cómo crear una escena paso a paso.
Hasta que no me leí esto un par de veces, no fui capaz de avanzar nada, asi que te recomiendo que hagas eso mismo y, una vez hecho algo de prueba con la guia del tutorial hagas preguntas mas concretas y te puedan (y si yo puedo tambien) ayudar.
Aunque sea feo el escenario y los objetos no importa para empezar. Es mas, te lo recomiendo para ahorrarte tiempo, y que utilices el actor predefinido por ahora. Ya tendrás tiempo de crear obras maestras cuando domines el programa.

http://wme.adventureboxstudios.com/descargas/

Mucha suerte y ánimo.