Please login or register.

Login with username, password and session length
Advanced search  

News:

This forum provides RSS feed. To query recent posts use this url. More...


Pages: 1 [2] 3 4

Author Topic: Empezando y con problemas.  (Read 34486 times)

0 Members and 1 Guest are viewing this topic.

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #15 on: December 15, 2010, 06:25:53 PM »

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


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.GoToObject(this);
  actor.Talk("Es una fuente apagada. Tiene un botón.");
}


////////////////////////////////////////////////////////////////////////////////
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(scenes\BUS\fuente.sprite))    //  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("Voy a cambiar el ''sprite'' de esta fuente");
    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".
    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 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.GoToObject(this);
  actor.Talk("Fuentecita fuentecita, ¿quien es de todas la mas fresquita?");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.Talk("¡¡Ya voy!!");
  actor.GoToObject(this);
}

Así ha quedado el script de mi fuente. Pues bien, ya no puedo ni observarla, ni ir a ella, ni hablar con ella, ni por supuesto usarla.
Ojalá supiera lo que hago cuando meto código, porque luego pasan estas cosas y me quedo sin ideas... :-\

El error que me da: compiling script "scenes\BUS\scr\fuente.script"...
Error@line 18: Invalid character
compiling script "scenes\BUS\scr\fuente.script"...
Error@line 18: syntax error
 :'(
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #16 on: December 16, 2010, 03:22:36 AM »

Y sí, molesta bastante no entender tu propio código, y peor si no se entiende mucho inglés, pero con el tiempo se le va agarrando la mano.
Por eso trato de comentártelo lo más que puedo.

Igual si te fijás en el reporte del compilador, te dice que la línea 18 del código tiene un caracter inválido, y eso pasa porque te olvidaste de poner scenes\BUS\fuente.sprite entre comillas.
Que es un error fácil de cometer, pero crucial a la hora de ejecutar el código.
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #17 on: December 16, 2010, 04:05:07 AM »

¡Momento! Qué boludo que soy, recién me doy cuenta que no sólo dice caracter inválido sino también error de sintaxis. Te explico un poco:

El método GetSprite() funciona para preguntarle a WME qué sprite tiene actualmente el objeto en cuestión (en este caso la fuente). Al ponerlo en el comando switch() le decimos a WME que haga diferentes cosas dependiendo de qué sprite tiene tu fuente. Es mi manera (una de muchas posibles) de saber si la fuente está andando o está parada.

Es decir, si tiene el sprite fuente.sprite, sé que está parada y le digo a WME que mi actor vaya y la prenda. Si tiene el sprite fuenteon.sprite, sé que está prendida y le hago hacer todo lo que haya que hacer si está prendida.

Como al momento de llamar al comando switch() no sabemos cuál de las dos va a pasar (o más bien, queremos que funcione para los dos casos), le preguntamos a WME si this.GetSprite("scenes\BUS\fuente.sprite") o bien this.GetSprite("scenes\BUS\fuenteon.sprite"), que es lo mismo que decir que si tiene el sprite original o el de estar funcionando.

Como estamos preguntando qué valor tiene su parámetro (qué sprite tiene GetSprite() entre sus paréntesis) no podemos asignarle uno. Puedo expandir más la explicación pero, haciéndola corta, la línea debería decir
Code: [Select]
switch(this.GetSprite()) dejando el parámetro de GetSprite() en blanco, es decir no escribiendo nada entre sus paréntesis.
Así, case "scenes\BUS\fuenteon.sprite": significa lo mismo que if(this.GetSprite("scenes\BUS\fuenteon.sprite")), es decir, ejecutar el siguiente código si el valor de this.GetSprite() equivale a "scenes\BUS\fuenteon.sprite".

Así es el comando switch(). Se pone una variable sin asignarle un valor y después se especifica qué debe pasar si tiene el valor tal o el valor cual.

Espero no marearte mucho. Sé que el comando switch() cuesta un poco más de entender que un simple if(), pero creeme que switch() se lee mucho mejor y esto mejora el código un montonazo. No hace mucha diferencia para el programa, pero es clave para el proceso humano de desarrollar un juego.

Y vamos, que sería lindo ver de una vez por todas un programador que no maneja mucho el inglés. Que no se vé todos los días.

[EDIT]Distinción del código, que es la parte importante del mensaje.[/EDIT]
« Last Edit: December 17, 2010, 03:13:17 PM by Juan Bonair »
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #18 on: December 19, 2010, 04:45:39 AM »

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


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.GoToObject(this);
  actor.Talk("Es una fuente apagada. Tiene un botón.");
}


////////////////////////////////////////////////////////////////////////////////
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("Voy a cambiar el ''sprite'' de esta fuente");
    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".
    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 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.GoToObject(this);
  actor.Talk("Fuentecita fuentecita, ¿quien es de todas la mas fresquita?");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.Talk("¡¡Ya voy!!");
  actor.GoToObject(this);
}

Muchas gracias por tu explicación. Creo que he entendido aproximadamente cómo funciona, pero ahora la consola me da un error tal que así:

Compiling script "scenes\BUS\scr\fuente.cript"...
Error@line 37: syntax error

Lo que supongo que quiere decir (si no he contado mal) que da un error el la linea que pone "on talk", la llamada para que el actor hable.
Y no solo eso. En la consola salen todos los scripts que tengo (en la parte superior izquierda), y el de la fuente no está. Por mas que lo he vuelto a cambiar y a sustituirlo, no aparece. ¿qué ocurre?


Y otra preguntilla rápida: ¿existe algún metodo para salir de la escena mas rápidamente, haciendo doble click en la salida? No para que el personaje corra, sino para que se salte la transición y aparezca directamente en la otra escena.
« Last Edit: December 19, 2010, 04:47:23 AM by bamyito »
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #19 on: December 19, 2010, 05:02:20 AM »

Lo de la salida rápida es fácil, al script de tu salida deberías agregarle, sin borrar nada que ya tenga,
Code: [Select]
on "LeftDoubleClick"    // Al darle doble clic izquierdo...
{
 Game.ChangeScene("scenes\otraescena.scene");    // ...cambiar la escena.
}
que, como verás, es remitirnos a la acción "LeftDoubleClick" (doble clic izquierdo) en vez del común "LeftClick" y poner exactamente el mismo código pero sin el actor.GoToObject(this). O sea, decirle a WME que al hacer doble clic cambie de escena y nada más.

Y ya voy preparando la respuesta más elaborada a tus otros problemas.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #20 on: December 19, 2010, 05:45:57 AM »

Doble click funcionando a las mil maravillas, incluso con las entradas múltiples. han surgido problemas que he sabido solventar (añadir la "global entrada" de su camino correspondiente ;D).
Animado y dispuesto para más. ::rock
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #21 on: December 19, 2010, 07:14:29 AM »

No es necesario andar contando las líneas, que el mismo editor de código te muestra en una barra inferior en qué línea está posicionado tu cursor.

Ah, y el error de la línea 37 pasa porque recién al llegar a la línea on "Talk" WME descubre que te olvidaste de poner la llave de cierre de on "Take".

Y mañana continúo contestando, que seguro que allá todavía estará radiante el sol pero acá en Buenos Aires estoy madrugando.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #22 on: December 19, 2010, 08:08:57 AM »

 :-[ No te voy a decir la hora que es aquí porque me da verguenza :-[, pero que muchisimas gracias!!!! ::thumbup

He conseguido que la fuente se encienda, que diga distintas cosas dependiendo de si está encendida o apagada (al observar), e incluso el sonido va bien, como yo quería (se enciende y se apaga adecuadamente).
Tambien he comprobado que si salgo de la escena y vuelvo, la fuente sigue como yo la dejé (lo cual mola mucho), pero el sonido al volver no se reproduce, a menos que la apagues y la vuelvas a encender. ¿eso tiene solución?

Y tranquilo si no tienes tiempo para responder rapidamente. No me corre prisa. Mientras me contestes (aunque sea una semana después) te lo seguiré agradeciendo igual. Es mas que comprensible que tengamos que prestarle atención a nuestras vidas. ;)

de verdad, muchisimas gracias por todo. No te puedes hacer una idea de la ilusión que me hacen los grandes avances que realizo gracias a ti.
Te debo unas cervezas y un jamón, por lo menos. ::beer ;D
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #23 on: December 19, 2010, 09:18:38 PM »

¡Gracias! No soy de tomar alcohol pero el jamón sí me gusta.

Si WME te recuerda la animación de la fuente andando debe ser porque tenés marcadas las opciones Remember nodes states (recordar los estados de los objetos) e Including sprites (inclusive sus sprites) en SceneEdit —en la pestaña Properties, que está justo debajo de la lista de objetos de tu escena—. Estas opciones hacen lo que dicen que hacen, y en este caso está bien que las tengas marcadas, pero recordá desmarcarlas en escenas donde no necesites recordar nada.

Para el sonido deberías agregar a tu scene_init.scipt algo así como
Code: [Select]
var Fuente = Scene.GetNode("fuente");    // Crear una variable Fuente que sea tu objeto "fuente", si es que se llama así.

switch(Fuente.GetSprite())    // ¿Qué sprite tiene tu fuente?
{
case "scenes\escena\fuenteon.sprite":    // Si tiene la animación "fuenteon.sprite"...
Fuente.PlaySound("sonidoareproducir.ogg",true);    // ...que reproduzca su sonido.
}
Es decir, al comenzar tu escena le preguntás a WME qué sprite tiene tu fuente, y si es "fuenteon" que reproduzca el sonido correspondiente. Le puse saltos de línea para los comentarios, pero también debería funcionar algo así como
Code: [Select]
var Fuente = Scene.GetNode("fuente");
switch(Fuente.GetSprite()) {case "scenes\escena\fuenteon.sprite":Fuente.PlaySound("sonidoareproducir.ogg",true);}

Te explico un poco lo de la variable Fuente, por las dudas:
1) Para referirnos a tu objeto fuente, hasta ahora lo habíamos llamado this, porque siempre lo hacíamos desde su propio script. Como ahora estamos en el script de tu escena, this ahora se referirá a tu escena, y por eso tenemos que buscar otra manera de referirnos a tu fuente.
2) En principio es sencillo, porque tenemos el método GetNode() ("obtener objeto"). Así, podemos referirnos a tu fuente como Scene.GetNode("fuente") (siendo "fuente" el nombre que tenga el objeto en tu escena).
3) El problema viene cuando queremos que tu fuente haga algo (en este caso, reproducir un sonido). Se supone que deberíamos escribir Scene.GetNode("fuente").PlaySound("sonido.ogg"). Pero esto —que Scene ejecute el método GetNode() y que el resultado de ese método (tu fuente) a su vez ejecute PlaySound()— es un fenómeno llamado anidamiento o bien nesting y WME todavía no lo incorporó (aunque se supone que WME2, que saldrá dentro de mucho mucho muchísimo tiempo, sí permitirá anidamientos).
4) De modo que lo que hacemos (como está en el script de acá arriba) es crear una variable Fuente que equivalga a Scene.GetNode("fuente") y luego hacer que esta variable reproduzca el sonido: Fuente.PlaySound("sonido.ogg").
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #24 on: December 20, 2010, 12:53:47 AM »

 ::thumbup Estupendo. Fuente funcionando a las mil maravillas, con su sonido y todo al salir y al entrar. ::thumbup
Pasemos a otra cosa:

He conseguido usando un script muy parecido al de la fuente (mediante swith y sprites), rebuscar entre la basura con el actor y recoger 2 objetos de allí y cambiar el sprite de la basura por otro de la basura abierta. incluso dice cosas diferentes dependiendo del estado del sprite (basura abierta o cerrada). El problema me surje al salir de la scene y luego al volver. Directamente, la basura desaparece. Aunque no la hubiera usado antes, con lo cual pierdo los objetos en el espacio-tiempo  :o. La consola tampoco da errores. No sé si el problema estará en el scene.init y debo cambiar allí algo (con la fuente no hizo falta, excepto por el sonido), pero por allí no he tocado nada. Aquí tienes 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);
}
¿Dónde está mi problema?
Sigo dándole vueltas a lo de combinar objetos del inventario, pero bueno. Poco a poco. ^^

Gracias de nuevo! :D
Logged

HelLRaiseR

  • I don't want to make a Monkey Island clone :(
  • Moderator
  • Frequent poster
  • *****
  • Karma: 4
  • Offline Offline
  • Posts: 270
    • View Profile
    • Adventure Box Studios
Re: Empezando y con problemas.
« Reply #25 on: December 20, 2010, 12:37:49 PM »

Hola bamyito,

Te explico brevemente el tema de combinar objetos.

Imagina que tienes dos objetos, una rama y una goma y que combinandolos puedes hacer un tirachinas, mas o menos, lo que hay que hacer es lo siguiente.

1. Definir tres objetos, la rama, la goma y el tirachinas montado.

2. Coger el objeto rama y añadirlo al inventario.

Esto se hace con una llamada a la función Game.TakeItem("rama"); esto hará que la rama nos aparezca en el inventario. Esta llamada debe ir en el evento on "Take" del objeto a coger.

3. Coger el objeto goma y añadirlo al inventario.

Igual que con la rama pero para el objeto goma.

4. Combinarlos. O lo que es lo mismo, que desaparezca la rama y la goma y aparezca el tirachinas. Cuando en el inventario coges un objeto A y lo combinas con otro B, en el objeto B se produce un evento con el nombre del objeto A, te lo explico con un ejemplo

Supongamos, como hemos dicho que tenemos un objeto "rama" y otro "goma" y el jugador coge el objeto "goma" y lo suelta sobre el objeto "rama" con el objetivo de crear un nuevo objeto "tirachinas"

El código, que estaría en el script del objeto rama, sería mas o menos este:

Code: [Select]
on "goma"
{
actor.Talk("Pongamos la goma en la rama.");
Game.DropItem("goma");
Game.DropItem("rama");
Game.TakeItem("tirachinas");
}

Como vez cuando se suelta el objeto "goma" sobre el objeto "rama" se ejecuta este código que hace desaparecer los objetos "rama" y "goma" del inventareio y añade el objeto "tirachinas", a partir de aqui usaremos el tirachinas de la forma que consideremos necesario.

Logged
Regards,

    Fernando

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #26 on: December 20, 2010, 01:41:06 PM »

Vale, probado y entendido. Casi todo. Me han surgido unos problemillas (pa no perder la costumbre).
Los objetos a combinar son martillo y caja, y el nuevo objeto es jarra.

Si lo hago tal como me lo dices, la cosa funciona perfectamente, EXCEPTO porque si los combino estando en la habitación en la que he encontrado la caja, ésta vuelve a aparecer de donde mismo la he recogido.
Si los combino en otra room, no hay problema. Los objetos desaparecen y aparece el nuevo objeto en el inventario.

He intentado solucionarlo utilizando el comando (o la llamada o como se llamen estas cosas) Game.DeleteItem(""), y funciona bien única y exclusivamente cuando lo coloco en ultimo lugar de las acciones a realizar. Me explico: Si coloco este comando (Game.DeleteItem("")) antes del comando de hablar, o de eliminar objeto, o de añadir objeto al inventario, no realiza estas últimas acciones. Y claro, lo ideal sería que desapareciera del inventario justo antes de que aparezca el nuevo objeto y antes de que dijese la frase.
Os dejo el código de la caja:

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


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.Talk("Una caja azul MUY bien cerrada.");
}

////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  Game.SelectedItem = "caja";
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("¿Hay alguien dentro?");
}
on "martillo"
{
actor.Talk("DESTROY!!");
Game.DropItem("martillo");
Game.TakeItem("jarro");
actor.Talk("¡Bien! ahora tengo un jarrico.");
Game.DeleteItem("caja");
}

¿qué ocurre? ¿cómo consigo que desaparezcan en el orden correcto?
Muchas gracias. ::rock
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #27 on: December 20, 2010, 02:00:52 PM »

SIM EMBARGO, acabo de darme cuenta que puedo hacer la misma operación (combinar los 2 objetos y que me dé un tercero) sin coger la caja en el inventario, y combinandolas desde su lugar de la scene. Refiriendome al script de la scene de la caja (en lugar de el que tengo en el inventario) y utilizando Game.DeleteItem(this); se eliminan ambos y me dan el tercero sin problemas.
Code: [Select]
on "martillo"
{
actor.GoToObject(this);
actor.Talk("DESTROY!!");
Game.DropItem("martillo");
Game.DeleteItem(this);
Game.TakeItem("jarro");
actor.Talk("¡Bien! ahora tengo un jarrico.");
}
Este avance me mola. XD

Pero aún no consigo combinarlo adecuadamente cuando ya lo tengo en el inventario (que se elimine en el orden que yo quiera). He probado la misma fórmula (copy&paste) en el script del inventario, pero si allí me refiero a la caja como this, me da error y no se elimina.
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #28 on: December 23, 2010, 02:22:03 AM »

Veo que estás con el asunto de los ítems, así que dejemos por un momento el misterioso caso del tacho de basura fantasma.

¿Probaste alternar Game.TakeItem() y actor.TakeItem() para ver qué resultados te da cada uno? No entiendo mucho del asunto, pero puede que esas dos maneras de implementarlo se comporten diferente. De todos modos no creo que modifique mucho, a menos que tu juego tenga más de un inventario.

La idea general es que, si le asignaste tu ítem a un objeto de la escena en SceneEdit, uses DropItem() para que el objeto vuelva a aparecer en la escena y DeleteItem() para eliminar tanto el ítem como el objeto correspondiente. (Justamente drop item significa soltar ítem y delete item significa eliminar ítem.) Claro que de pronto te surge esta cosa rara de que DeleteItem() no funciona apropiadamente —por lo que igual te sugiero que transcribas acá tu código, a ver si no será todo culpa de algún error corregible—, y hay que buscar alguna solución alternativa.

Se me ocurrió que hicieras toda la cosa manualmente, a través del cógido.
Si no te interesa en lo más mínimo que el personaje pueda soltar un ítem para que regrese a donde estaba antes de ser agarrado, directamente podrías hacerlo así en el script de la caja, por ejemplo:
Code: [Select]
on "Take"    // Al agarrar la caja.
{
    actor.TakeItem("caja");    // Sumar el ítem "caja" al inventario...
    this.Active = false;    // ...y volver la caja invisible.
}
Haciendo esto tendrías el mismo resultado, y DropItem() no devolvería la caja a su sitio.

Y está muy bien eso de que puedas combinar ítems directamente con la caja en la escena. Pero tendrías que repetir mucho código, creo que podría funcionar de la siguiente manera (en el script de la caja de tu escena):
Code: [Select]
on "martillo"    // Al usar el martillo en la caja...
{
    actor.Talk("Primero voy a agarrarla.");
    this.ApplyEvent("Take");    // ...agarrar la caja...
    actor.Talk("Ahora sí los combino...");
    var CajaDelInventario = Game.GetItem("caja");
    CajaDelInventario.ApplyEvent("martillo");    // ...y usar el martillo con el ítem "caja".
}
Al usar el método ApplyEvent() podés hacer que la caja sea agarrada sin que el jugador lo haga intencionalmente y podés combinar el martillo con la caja de la misma manera. Lo que hacés es forzar el evento "Take" en la caja en vez de hacerlo por acción del jugador. Sé que de momento no te ahorra tanto código, pero te lo comento porque quizá en el futuro agarrar un objeto desate muchas acciones (variables cambiando, mucho diálogo que va y viene) y de esta forma te asegurás que pase todo tal y como si lo hubieras agarrado antes de combinarlos.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #29 on: December 24, 2010, 02:07:46 AM »

Vale, mis preguntas van a ir divididas en 3 apartados esta vez: Caja que no se borra, bicho amarillo no-dialogante y basura que desaparece.
Caja que no se borra
::rock
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.GoToObject(this);
  actor.Talk("Anda! una cajita azul!");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.GoToObject(this);
  actor.Talk("pa la saca.");
  Game.TakeItem("caja");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.GoToObject(this);
  actor.Talk("Cajita cajita, vaya que eres feita.");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}
////////////////////////////////////////////////////////////////////////////////
on "martillo"
{
actor.GoToObject(this);
actor.Talk("DESTROY!!");
Game.DropItem("martillo");
Game.DeleteItem(this);
Game.TakeItem("jarro");
actor.Talk("¡Bien! ahora tengo un jarrico.");
}

Este es el código que utilizo en la caja como objeto de la scene, y me funciona estupendamente por ahora, asi que ni me planteo resumirlo.
Si utilizo el martillo sobre la caja estando ésta sobre la mesa, las acciones se realizan sin ningún problema (habla, desaparece martillo, desaparece caja, obtengo jarro y habla de nuevo).
 ::slug
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.Talk("Una caja azul MUY bien cerrada.");
}

////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  Game.SelectedItem = "caja";
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.Talk("¿Hay alguien dentro?");
}
on "martillo"
{
actor.Talk("DESTROY!!");
Game.DropItem("martillo");
Game.TakeItem("jarro");
actor.Talk("¡Bien! ahora tengo un jarrico.");
Game.DeleteItem("caja");
}

Este es el código que tiene la caja como objeto del inventario (ya lo puse anteriormente). Como ves, la linea [Game.DeleteItem("caja");] está la última de toda la línea, ya que si no, esa es la última acción que realiza. Si, por ejemplo, la colocase antes de [Game.TakeItem("jarro");], lo cual sería ideal, las 2 lineas que quedan ([take jarro] y [actor talk]) no se realizarían ???. Lo cual, no tiene mucho sentido para mi.


Bicho amarillo no-dialogante
::slug
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  actor.Talk("¿un bicharraco amarillo flotando?");
    this.Talk("El coco.");
  actor.Talk("Qué sitio mas raro.");
}
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.Talk("No llego.");
}
////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
actor.Talk("Hola coco.");
this.Talk("Hola Tarzana, ¿cómo estás?");

Game.AddResponse(0, "Tururú");
Game.AddResponse(1, "Flufluturutú");
Game.AddResponse(2, "Debería irme");

var Res = Game.GetResponse();

actor.Talk("bueno chico, aquí te quedas.");
this.Talk("Venga Tarzana, feliz navidad.");
}
////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}

Este código pertenece a un bicho flotante amarillo. Pues bien, hay dos cosas que me gustaría solucionar en su código.

1º- Que, cuando le dé (por ejemplo) a observar bicho, el personaje se vuelva hacia el bicho  ::)(que lo mire), pero que no avance hasta él (esto ya sé hacerlo sin problemas).

2º- Con este código en el comando hablar, consigo que el personaje y el actor hablen al principio (cada uno diga una frase) y al final de la conversación. Sin embargo, no sé qué codigo poner para que puedan mantener una conversación (que el bicho conteste a mis preguntas, se habran nuevas ramas de diálogo dependiendo de la opción que yo haya escogido, etc). He intentado usar el codigo que viene en el tutorial, pero nada. No funciona ni lo mas mínimo. :'(


Basura que desaparece
::slug
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. >:(



Espero no agobiar demasiado, ni ser demasiado exigente con ustedes. Hace poco pensaba que jamás coseguiría mezclar objetos del inventario, ni encender la fuente ni poder llenar una jarra de agua con la fuente encendida. Y ahora puedo hacerlo. Asi que cualquier solución que podais encontrar a cualquiera de estos problemas es bien recibida.
Muchas gracias por vuestra paciencia.
¡Feliz navidad! ;D
« Last Edit: December 24, 2010, 02:14:43 AM by bamyito »
Logged
Pages: 1 [2] 3 4
 

Page created in 0.105 seconds with 25 queries.