Please login or register.

Login with username, password and session length
Advanced search  

News:

For WME related articles and tutorials visit WME Resource Center.

Pages: 1 2 [3] 4

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

0 Members and 1 Guest are viewing this topic.

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 #30 on: December 24, 2010, 04:45:31 PM »

Bueno, te conmtesto muy rápido y solo a lo del dialogo, porque dado el dia que es no me puedo liar y pro otra parte supongo que hoy a estas horas no estarás liado.

Te paso un script de un dialogo, con posibles preguntas y respuestas a esas preguntas, para que lo vayas estudiando, a ver si el domingo mas tranquilo te contesto a otras cosas.

Unas cosas:

- Esto es un dialogo sacado de nuestro juego, por lo que veras cosas que no sabras ni que son, entre ellas, las siguientes.
- El WinNarrator.DisplayText, lo usamos en vez del actor.Talk
- El ExpandString, coge los textos de un fichero en funcion del idioma del juego.
- El Bill_flores, Bill_dani, Bill_curro, etc son variables para cambiar las preguntas en funcion de si se han hecho o no.
- Fijate solamente en AddREesponse, GetResponse, etc que son las funciones para montar los dialohgos.

Y si te lias, no pasa nada, el domingo te pongo un código limpio, que en este no hay quien entienda nada ya que ni siquiera hay frases.

Feliz Navidad
Code: [Select]
function BillDialogue()
{
  var Responses;
  var Selected;

  var Loop = true;

  while(Loop)
  {
    // prepare the sentences
if (!Bill_flores)
Responses[0] = Game.ExpandString("/WOF0001038/");
else
Responses[0] = Game.ExpandString("/WOF0001039/");

if (!Bill_curro)
Responses[1] = Game.ExpandString("/WOF0001040/");
else
Responses[1] = Game.ExpandString("/WOF0001041/");

if (!Bill_dani)
Responses[2] = Game.ExpandString("/WOF0001042/");
else
Responses[2] = Game.ExpandString("/WOF0001043/");

Responses[3] = Game.ExpandString("/WOF0001044/");

    // fill the response box
    Game.AddResponse(0, Responses[0]);
    Game.AddResponse(1, Responses[1]);
    Game.AddResponse(2, Responses[2]);
    Game.AddResponse(3, Responses[3]);

    // let the player choose one
    Selected = Game.GetResponse();

    // let the actor say the selected sentence
    // (that's why I use the array for storing the sentences)
actor.PlayAnimAsync("Hablar");
    WinNarrator.DisplayText(Responses[Selected], "Jhonny", -1); //Dejamos que la máquina calcule el tiempo que se muestra la frase.
actor.PlayAnimAsync("IdleHablar");

    // now let Bill reply depending on the selected sentence
    if(Selected==0)
    {
if (!Bill_flores)
{
this.PlayAnimAsync("Hablando");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001045/"),"Bill",-1);
this.PlayAnimAsync("Idle");
actor.PlayAnimAsync("Hablar");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001046/"),"Jhonny",-1);
actor.PlayAnimAsync("IdleHablar");
this.PlayAnimAsync("Hablando");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001047/"),"Bill",-1);
this.PlayAnimAsync("Idle");
actor.PlayAnimAsync("Hablar");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001048/"),"Jhonny",-1);
actor.PlayAnimAsync("IdleHablar");
this.PlayAnimAsync("Hablando");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001049/"),"Bill",-1);
this.PlayAnimAsync("Idle");
actor.PlayAnimAsync("Hablar");
WinNarrator.DisplayText(Game.ExpandString("/WOF0001050/"),"Jhonny",-1);
actor.PlayAnimAsync("IdleHablar");
Bill_flores=true;
}
else
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001051/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001052/"),"Jhonny",-1);
}
}
else
{
if(Selected==1)
{
if (!Bill_curro)
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001053/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001054/"),"Jhonny",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001055/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001056/"),"Jhonny",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001057/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001058/"),"Jhonny",-1);
Bill_curro=true;
}
else
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001059/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001060/"),"Jhonny",-1);
}
}
else
{
if(Selected==2)
{
if (!Bill_dani)
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001061/"),"Bill",-1);
BillDialogue2();
Bill_dani=true;
}
else
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001062/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001063/"),"Jhonny",-1);
}
}
else
{
if(Selected==3)
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001064/"),"Bill",-1);
Loop = false; // we want to end the dialogue
}
}
}
}
}
// Comprobamos si Bill le ha contado todo y en caso afirmativo
// se puede ya cerrar el cementerio
 
if(Bill_flores && Bill_curro && Bill_dani)
  EstadoJuego.CementerioCerrado = true;
else
  EstadoJuego.CementerioCerrado = false;
}




////////////////////////////////////////////////////////////////////////////////
function BillDialogue2()
{
  var Responses;
  var Selected;
  var Loop = true;

  while(Loop)
  {
    // prepare the sentences
    Responses[0] = Game.ExpandString("/WOF0001065/");
    Responses[1] = Game.ExpandString("/WOF0001066/");
    Responses[2] = Game.ExpandString("/WOF0001067/");

    // fill the response box
    Game.AddResponse(0, Responses[0]);
    Game.AddResponse(1, Responses[1]);
    Game.AddResponse(2, Responses[2]);

    // let the player choose one
    Selected = Game.GetResponse();

    // let the actor say the selected sentence
    // (that's why I use the array for storing the sentences)
    WinNarrator.DisplayText(Responses[Selected], "Jhonny", -1);

    // now let the Old Guy reply depending on the selected sentence
    if(Selected==0)
    {
WinNarrator.DisplayText(Game.ExpandString("/WOF0001068/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001069/"),"Jhonny",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001070/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001071/"),"Jhonny",-1);
    }
else
{
if(Selected==1)
{
WinNarrator.DisplayText(Game.ExpandString("/WOF0001072/"),"Bill",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001073/"),"Jhonny",-1);
WinNarrator.DisplayText(Game.ExpandString("/WOF0001074/"),"Bill",-1);
}
else
{
if(Selected==2) Loop = false;
}
}
  }
}
« Last Edit: December 24, 2010, 04:58:45 PM by HelLRaiseR »
Logged
Regards,

    Fernando

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #31 on: December 26, 2010, 07:38:12 PM »

Lo siento, pero aparte de no entender nada de todo eso, el programa de da un error en la primera linea. Es exactamente igual que en el tutorial. Tu "function BillDialogue()" falla lo mismo que el "function MyTestDialogue()" del tutorial. :'(

Seguiré investigando. :)
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 #32 on: December 27, 2010, 01:23:11 AM »

Hoy no he podido, a ver si manana saco un rato y te explico
Logged
Regards,

    Fernando

Juan Bonair

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

¡Ah, hombre, por supuesto que DeleteItem("caja") detiene el código!
Menos mal que posteaste el código, realmente no tenía ningún sentido.
Lo que pasa es que eliminás el ítem caja desde el script del ítem caja.
Con DeleteItem("caja") la caja —como objeto del inventario— se elimina a sí misma y, por estar eliminada, no puede seguir ejecutando su propio script. Es como escribir "suicidarme" en mi lista de cosas para hacer mañana: no tiene sentido a menos que lo ponga a lo último.
Como la caja de la escena y la del inventario son dos objetos completamente diferentes, eliminar el ítem caja desde el script de la caja de la escena no genera problema alguno. Por eso podés eliminar el ítem desde la escena.

La solución para esto tiene que ser agregar
Code: [Select]
this.Active = false;en el código de la caja —ese que ni te planteás resumirlo— después de agarrar el ítem, y de ahí en más usar DropItem(). Como invisibilizaste la caja, no hay posibilidad de que DropItem() la devuelva a su sitio.
Logged

bamyito

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

No me sale. Me explico:

He puesto el  this.Active = false; en todos sitios, y no veo cambio alguno. Tu dices que ha de ir en el script de la caja cuando está puesto en la scene. Voy a explicar el efecto que crea este script, por si no me he explicado bien: Cuando uso MARTILLO sobre CAJA sin haber añadido CAJA al inventario (o sea, sin cogerlo y usando martillo en el objeto CAJA que está en la scene) las situaciones se producen si error: habla, los objetos desaparecen (CAJA de la scene y MARTILLO de mi inventario), aparece un nuevo objeto en mi inventario (JARRO), y habla de nuevo. y la Caja no vuelve a aparecer en el escenario. Por eso no entiendo que tenga que poner el  this.Active = false; (que por cierto, no sé para que es exactamente) en este script, ya que funciona bien. Además, he probado a ponerlo en todos los lugares que me han parecido lógicos, y no produce cambios.

-->Script de la CAJA del inventario. Aunque no sea ahí donde me dijiste que debía ponerlo, he probado sin obtener resultados (o sea, la caja se elimina al final, colocandose antes de tiempo en su sitio de la scene):
Code: [Select]
on "martillo"
{
actor.Talk("DESTROY!!");
Game.DropItem("caja");
Game.DropItem("martillo");
this.Active = false;
Game.TakeItem("jarro");
actor.Talk("¡Bien! ahora tengo un jarrico.");
Game.DropItem("caja");
}

-->Script de la CAJA en la scene. He probado colocando el this.Active = false; en todos los sitios, cambiando el delete por el drop, pero el efecto cuando cojo la caja en el inventario y uso el martillo sobre ella en el inventario sigue siendo el mismo (la CAJA aparece en la scene, y luego desaparece). Y la verdad, no entiendo cómo cambiando este script voy a solucionarlo. Según mi lógica (que ya hemos comprobado que es errónea), este problema debería solucionarse en el otro script, no?

En fin, a ver si encontramos entre todos lo que falla... ::slug
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #35 on: December 29, 2010, 10:49:23 PM »

Está bien, está bien, que me olvidé de aclarar qué cazzo significa this.Active = false.

Todos los objetos de escena en WME tienen la propiedad Active, que determina si el objeto se vé o no.
Como estamos en el script de tu caja —la de la escena—, this.Active es la propiedad Active de tu caja.
Al volverla false (this.Active = false) tu caja se vuelve invisible.

Vos seguramente le asignaste el ítem caja a tu caja de la escena en SceneEdit > Entity properties > Item (sin código, sólo escribiendo "caja" en el espacio en blanco).
Lo único que pasa al hacer esto es que TakeItem("caja") automáticamente cambia la propiedad Active de tu caja a false, y que DropItem("caja") automáticamente cambia la propiedad Active de tu caja a true. Es decir, la caja de la escena se vuelve invisible cuando agarrás el ítem y visible de nuevo cuando lo soltás.

La solución que yo te ofrezco es hacerlo todo a través del código, y es mucho más fácil de lo que suena.
Claro que para hacerlo con el código, primero tenés que no hacerlo de la manera automática. Es decir, para que esto funcione tenés que borrar "caja" de SceneEdit > Entity properties > Item.

En el script de la caja escénica —la voy a llamar así para ahorrarme palabras, por oposición al ítem caja de tu inventario—, agregá this.Active = false; en la parte en que el actor agarra la caja. Esto ya lo hacía WME automáticamente tras Game.TakeItem("caja"), pero ahora lo estamos haciendo manualmente, porque vos borraste "caja" de SceneEdit > Entity properties > Item.

Y no sólo en "Take", también deberías agregar la misma línea de código en "martillo", porque también ahí querés que la caja desaparezca de escena.

Luego, como el ítem caja y la caja escénica no están automáticamente ligados, en el script del ítem caja podés usar Game.DropItem("caja") tranquilamente —o bien Game.DropItem(this), que para el caso vendría a ser lo mismo—, sin que WME ponga automáticamente la caja escénica de nuevo en su lugar original.

Acordate de que todo esto no va a servir de nada a menos que borres "caja" de SceneEdit > Entity properties > Item, que esa es la parte importante.

Otra manera de explicarlo, por si todavía queda dudoso:
Al ponerlo de la manera automática, WME automáticamente invisibiliza y visibiliza tu caja escénica. Vos querés que la invisibilice pero que no la visibilice luego. La manera automática hace las dos, no podés pedirle que haga una y no la otra. Entonces eliminamos la manera automática, y manualmente invisibilizamos la caja escénica cuando corresponde, sin visibilizarla luego.

Espero que esté claro, si no seguí preguntando y haré lo que pueda.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #36 on: January 05, 2011, 07:52:22 PM »

 ;D Yeah!! ¡¡Problema de la caja solucionado!! ::rock
Soy tan paquete en esto de programar que el fallo lo he cometido al olvidar el punto y coma";" despues del (this.Active = false). Cuando he dicho: ¿llevará esto una coma aquí, como todo lo demás? y lo he probado, ha sido como... WTF? :-\
En fin, un error que no volveré a cometer. :P

Ahora mismo estoy intentando aplicar este método a la basura, para que no desaparezca y tal, pero está visto que no lo estoy haciendo bien, ya que sigue desapareciendo cuando salgo de la scene. ::slug

Y bueno... aparte del problema del bicho no-dialogante no tengo mas inquietudes por ahora. Solventemos esto y ya iré inventando mas cosas. ::)

PD: Expongo aquí los 2 problemas que aún tengo, a ver qué podemos hacer.
 ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug ::slug
Bicho amarillo no-dialogante

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.

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
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. >:(


¡¡Feliz año nuevo y gracias por todo!! O0
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #37 on: January 06, 2011, 01:04:21 AM »

Sobre el bicho amarillo, ya me fijaré cómo se puede explicar más o menos bien la construcción de árboles de diálogo.
Para lo de mirar hacia el bicho sin caminar hacia él, tengo dos soluciones posibles. Una es difícil y no sé si funciona a la perfección, y la otra es fácil y no sé si funciona a la perfección.

La manera difícil la conozco del demo del juego Fred —creo que nunca se terminó—, cuyo código estaba a libre disposición de cualquiera pero no logro encontrar la descarga por ninguna parte, de modo que sólo tengo el que descargué yo mismo. El script de una caja en la escena dice así:
Code: [Select]
#include "scripts\base.inc"

//este script está asociado a la caja de madera de debajo de la estantería


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
  TurnToObject();
  ego.Talk("/HABFRED012/Pone frágil.");
  ego.Talk("/HABFRED013/Esa caja ya estaba ahí cuando me instale hace 10 años.");     
  ego.Talk("/HABFRED014/Nunca ha sido abierta, la de misterios que debe esconder.");
}


////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  GoToObject();
  Game.Interactive = false;
  ego.Talk("/HABFRED015/¡NO! Yo no seré quien profane..."); 
  ego.TurnTo(DI_DOWN);
  ego.Talk("/HABFRED016/...LA CAJA...", "scenes\HabitFred\chan.ogg"); 
  ego.Talk("/HABFRED017/Además, conlleva ejercicio físico.");
  Game.Interactive = true;
 
}

////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  GoToObject();
}


////////////////////////////////////////////////////////////////////////////////
function GoToObject()
{
  ego.GoTo(385, 420);
  ego.TurnTo(DI_UP);
}

///////////////////////////////////////////////////////////////////////////////
function TurnToObject()
{
  var ActX = ego.X;
  var ActY = ego.Y;
  var Entity = Scene.GetNode(self.Name);
  var EntityX = Entity.X;
  var EntityY = Entity.Y;

  if(ActY > EntityY + 20)
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_UPLEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_UPRIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      ego.TurnTo(DI_UP);
      return;
    }
    else if(ActX <= EntityX)
    {
      ego.TurnTo(DI_UP);
      return;
    }
  }
  else if(ActY < EntityY - 20)
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_DOWNLEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_DOWNRIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      ego.TurnTo(DI_DOWN);
      return;
    }
    else if(ActX <= EntityX)
    {
      ego.TurnTo(DI_DOWN);
      return;
    }
  }
  else
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_LEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_RIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      GoToObject();
      return;
    }
    else if(ActX <= EntityX)
    {
      GoToObject();
      return;
    }
  }
}
En el evento "LookAt" hay una llamada al método TurnToObject() (línea 9), que no es de WME, sino que es creado por el programador en el mismo script (a partir de la línea 37). Cualquier manera posible de explicarlo se me hace igual de complicada que el mismo código, y no creo que pertenezca al nivel básico de programación que estamos barajando aquí.

La manera fácil se me acaba de ocurrir y es así:
Code: [Select]
on "LookAt"    // Al mirar al bicho
{
    actor.GoToObjectAsync(this);    // comenzar a caminar hacia él,
    Sleep(100);    // esperar una décima de segundo
    actor.Reset();    // y dejar de caminar.
    actor.Talk("Si tenemos suerte, estoy mirando hacia el bicho en cuestión.");
}
Los métodos GoToAsync() y GoToObjectAsync() hacen lo mismo que GoTo() y GoToObject() respectivamente, sólo que en vez de esperar a que el actor llegue a destino, continúan ejecutando el código. Es como darle el puntapié inicial para que comience a caminar. Lo que hacemos es meter un Sleep() de 100 milisegundos para que el actor camine un poquitín hacia el bicho y luego lo detenemos en seco con un Reset(), que lo que hace es resetear cualquier acción que esté ejecutando —como hablar o caminar o reproducir un sonido—. No estoy completamente seguro, pero se supone que si el actor comienza a caminar hacia el bicho debería estar apuntando hacia él cuando lo frenás, consiguiendo lo que querías.


Lo de la basura me tiene perdido. No debería desaparecer. Por supuesto que podrías solucionarlo con
Code: [Select]
var Basura = Scene.GetNode("basura");
Basura.Active = true;
en el scene_init de tu escena, pero sería mejor averiguar por qué cazzo desaparece en primer lugar. No veo nada fuera de lo común en el script que mostraste, fijate que todos los sprites estén bien escritos, porque puede ser que le asignaras un sprite inexistente y que por lo tanto se borrara. Si algo está mal, tiene que ser en alguno de los scripts en que cambiás la escena.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #38 on: January 06, 2011, 03:28:27 AM »

YEAH!! ::rock
he probado tu método (el sencillo) y funciona exactamente como me has explicado. Eso si, como emplea un tiempo en girarse el personaje, el 100 que le habias asignado inicialmente lo he cambiado por un 250 despues de probar varias opciones, por el sencillo hecho de que si estaba de espaldas, al actor no le daba tiempo a girarse completamente y miraba donde no debía. Eso si, si inicialmente el actor está mirando hacia el objeto, pues el actor da un pasito y se detiene. Que vale, lo ideal sería que solo girase, pero vamos, por ahora voy que me mato. ¡¡gracias!!

Tambien he probado el método complicado con otro objeto cualquiera, y me da este error:
Compiling script 'scenes\Room\scr\Chabolaca.script'...
3:09:58:    Error@line 42: Variable 'ego' is referenced but not defined
3:09:58:  Compiling script 'scenes\Room\scr\Chabolaca.script'...
3:09:58:    Error@line 43: Variable 'ego' is referenced but not defined


No sé si el problema radica en que "ego" se refiere al actor, y al buscarlo, no lo encuentra. Según este razonamiento, cambiando todos los "ego" por "actor" debería funcionar. ¿o no? ??? Te dejo tambien el código, por si te ayuda a ver el error:
Code: [Select]
#include "scripts\base.inc"


////////////////////////////////////////////////////////////////////////////////
on "LookAt"
{
TurnToObject();
  actor.Talk("Una chabola muy muy fea.");
}


////////////////////////////////////////////////////////////////////////////////
on "Take"
{
  actor.Direction = DI_DOWN;
  actor.Talk("¿Y despues me la guardo en el bolsillo?");
}


////////////////////////////////////////////////////////////////////////////////
on "Talk"
{
  actor.GoToObject(this);
  actor.Talk("Hola, Chozaca fea y espantosa.");
}


////////////////////////////////////////////////////////////////////////////////
on "LeftClick"
{
  actor.GoToObject(this);
}

function GoToObject()
{
  ego.GoTo(385, 420);
  ego.TurnTo(DI_UP);
}

function TurnToObject()
{
  var ActX = ego.X;
  var ActY = ego.Y;
  var Entity = Scene.GetNode(self.Name);
  var EntityX = Entity.X;
  var EntityY = Entity.Y;

  if(ActY > EntityY + 20)
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_UPLEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_UPRIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      ego.TurnTo(DI_UP);
      return;
    }
    else if(ActX <= EntityX)
    {
      ego.TurnTo(DI_UP);
      return;
    }
  }
  else if(ActY < EntityY - 20)
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_DOWNLEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_DOWNRIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      ego.TurnTo(DI_DOWN);
      return;
    }
    else if(ActX <= EntityX)
    {
      ego.TurnTo(DI_DOWN);
      return;
    }
  }
  else
  {
    if(ActX > EntityX + 30)
    {
      ego.TurnTo(DI_LEFT);
      return;
    }
    else if(ActX < EntityX - 30)
    {
      ego.TurnTo(DI_RIGHT);
      return;
    }
    else if(ActX >= EntityX)
    {
      GoToObject();
      return;
    }
    else if(ActX <= EntityX)
    {
      GoToObject();
      return;
    }
  }
}

Bueno, y ya que estamos, si me pudieras dar unas direcciones de juegos descargables que tengan el código manipulable te lo agradecería muchisimo. he probado con The white chamber, pero en lugar del código este que usamos nosotros salen unos recuadritos de 3 letras muy extraños, que puede que sean el código, pero yo de ahí no puedo copiar las lineas que me interesan ni borrar otras para probar los efectos... no sé si me explico :-\

¿y qué es un cazzo? Me lo has nombrado dos veces, pero ni idea de lo que es.

Gracias de nuevo :D
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #39 on: January 07, 2011, 11:59:31 PM »

 ::rock Y EFECTIVAMENTE!!
En el codigo complicado, cambiando los ego por actor, funciona a las mil maravillas. Se gira hacia el objeto, y luego cumple el resto de órdenes. ;D

Voy a seguir con la basura, a ver qué descubro. Lo empezaré desde el principio, a ver si así encuentro el error. Mientras, esperaré ansioso alguna explicación más. ;)
« Last Edit: January 08, 2011, 01:06:56 AM by bamyito »
Logged

Jose

  • Regular poster
  • ***
  • Karma: 2
  • Offline Offline
  • Posts: 134
    • View Profile
Re: Empezando y con problemas.
« Reply #40 on: January 08, 2011, 11:42:24 AM »

Buenas bamyito,

el mes pasado a mí me sucedió algo parecido a lo que comentas de la basura. Tenía en mi escena inicial una serie de sprites que cargaba en función de la acción que realizase sobre determinadas regions, y resulta que mientras permanecía en la escena todo funcionaba correctamente pero en cuanto iba a otra escena y volvía a la inicial, era como si todo se hubiese "reinicializado". Al principio pensé que era problema de que la escena no estaba guardando el estado pero después de darle muchas pero que muchas vueltas, descubrí que el error era algo de lo más tonto ya que en el cambio de escena para volver a la inicial tenía puesto lo siguiente:

Code: [Select]
   Game.ChangeScene("\scenes\lobby\lobby.scene");
 

La primera "\" sobra y estaba haciendo que por alguna razón WME volviese a cargar la escena correcta pero sin respetar el estado de sus elementos. Solamente tuve que quitarle la famosa "\" y empezó a funcionar correctamente. Al final la instrucción correcta quedó así:

Code: [Select]
   Game.ChangeScene("scenes\lobby\lobby.scene");

Naturalmente en tu caso tendrías que cambiar "lobby" y "lobby.scene" por el nombre de la carpeta y el archivo .scene que apliquen en tu caso.

A ver si hay suerte y esto te ayuda porque la verdad es que a mí me volvió loco una buena temporada.

Un saludo.

P.D. Respecto a lo que preguntas del significado de la palabra cazzo te diré que es italiano y que siendo "muy fino" podrías traducirla por pene.  ;D
« Last Edit: January 08, 2011, 11:50:15 AM by Jose »
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #41 on: January 09, 2011, 12:40:55 AM »

creo que no es el mismo problema, ya que, segun tu, tus sprites se reinician y se ponen como al principio. Lo que le ocurre al mio es que, sencillamente, desaparece. Interactue o no interactue con el antes de salir de la scene, al volver, desaparecen ambos (basura abierta y cerrada). Además, no hago referencia a la basura en el scene.init, y creo que no hace falta. tampoco sé si es ahí donde te refieres que tendría que corregir la refencia. En cualquier caso, he comprobado las referencias de los sprites, y están bien escritos, asi que el error debe estar en otro lugar.

Y lo del cazzo... XD
Seguro que esa es la traducción... pero no sé si es a eso a lo que se refería Juan bonair. Supongo que si. XD

En cualquier caso, muchas gracias por tu interés.
Un abrazo.
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #42 on: January 12, 2011, 02:34:05 AM »

¡Genial que hayas logrado sortear los pequeños problemas!
Es cierto, me había olvidado que el código del juego usa ego en vez de actor.
Y cazzo, sí, es italiano. Supongo que lo uso en reemplazo de carajo, aunque nunca supe exactamente qué significaba (su empleo en mi bocabulario es de herencia familiar).

Voy preparando una explicación más detallada del código...
Logged

Juan Bonair

  • Lurker
  • *
  • Karma: 0
  • Offline Offline
  • Gender: Male
  • Posts: 33
    • View Profile
Re: Empezando y con problemas.
« Reply #43 on: January 12, 2011, 06:12:30 AM »

Bien, lo del evento "Take" no es ningún misterio: simplemente hace que se ejecute la función TurnToObject() y que el personaje diga algo. Ahora bien, ¿cómo funciona el método TurnToObject()?
Pues a seguir te pongo el cógido bastante comentado:
Code: [Select]
function TurnToObject() // Acá declara la función —o método— y la llama "TurnToObject" (voltear hacia el objeto).
{ // Todo lo que sigue hasta que se cierre esta primera llave es la función TurnToObject().

/*

A continuación declara algunas variables que se van a usar en la función. En este caso las variables no son
necesarias. Es decir, podríamos sacar la línea "var ActX = actor.X;" siempre y cuando reemplacemos luego todos los
"ActX" por "actor.X". Al progamador simplemente le pareció que, ya que lo iba a tipear muy seguido, convenía algo
corto como "ActX" y no "actor.X", que tiene más letras y encima requiere el meñique de la mano derecha, que debe de
ser el dedo que menos se usa al teclear.

*/

var ActX = actor.X; /* La variable ActX será la posición X del actor. O sea, su posición horizontal. O sea, el
largo —medido en pixeles— de la recta más corta entre los pies del actor y el borde izquierdo del juego. */

var ActY = actor.Y; // Lo mismo, pero con la posición vertical. Del borde superior hasta sus pies.

var Entity = Scene.GetNode(self.Name); /* Entity será nuestro objeto hacia el que hay que mirar.
Supongo que también valdría "var Entity = self;". */

var EntityX = Entity.X; // Aquí tenemos cómo nos referiremos a la posición X del objeto (equivale a "self.X").

var EntityY = Entity.Y; // Y aquí su posición Y.

/*

Muy bien, a continuación empieza el código en serio.

*/

// Acá empieza la PRIMERA PARTE (hay tres), se ejecuta si el actor está más de 20 pixeles por debajo del objeto.
if(ActY > EntityY + 20)
{
if(ActX > EntityX + 30) // Si el actor está más de 30 pixeles a la derecha del objeto...
{
actor.TurnTo(DI_UPLEFT); // ...que mire arriba a la izquierda.
return;
}
else if(ActX < EntityX - 30) // Si está más de 30 pixeles a su izquierda...
{
actor.TurnTo(DI_UPRIGHT); // ...que mire arriba a la derecha.
return;
}// Y si no está tan a su izquierda ni tan a su derecha...
else if(ActX >= EntityX)
{
actor.TurnTo(DI_UP); // ...que mire directamente hacia arriba.
return;
}
else if(ActX <= EntityX) // Y aquí repite un poco. Pone una nueva condición que de todos modos hace mirar
{ // al actor hacia arriba. No sé por qué lo hace, pero lo hace.
actor.TurnTo(DI_UP);
return;
}
}

// Acá empieza la SEGUNDA PARTE, se ejecuta si el actor está más de 20 pixeles por encima del objeto.
else if(ActY < EntityY - 20)
{
if(ActX > EntityX + 30) // Si el actor está más de 30 pixeles a la derecha del objeto...
{
actor.TurnTo(DI_DOWNLEFT); // ...que mire abajo a la izquierda.
return;
}
else if(ActX < EntityX - 30) // Si está más de 30 pixeles a la izquierda...
{
actor.TurnTo(DI_DOWNRIGHT); // ...que mire abajo a la derecha.
return;
} // Si nada de lo anterior...
else if(ActX >= EntityX)
{
actor.TurnTo(DI_DOWN); // ...que mire directo hacia abajo.
return;
}
else if(ActX <= EntityX)
{
actor.TurnTo(DI_DOWN);
return;
}
}

// Acá empieza la TERCERA PARTE, se ejecuta si el actor está a 20 pixeles o menos de la altura del objeto.
else
{
if(ActX > EntityX + 30) // Si el actor está más de 30 pixeles a la derecha del objeto...
{
actor.TurnTo(DI_LEFT); // ...que mire a la izquierda.
return;
}
else if(ActX < EntityX - 30) // Si está más de 30 pixeles a la izquierda...
{
actor.TurnTo(DI_RIGHT); // ...que mire a la derecha.
return;
} // Y si no está tan a la derecha ni a la izquierda, teniendo en cuenta que tampoco está tan arriba ni abajo...
else if(ActX >= EntityX)
{
GoToObject(); // ...que directamente vaya hacia el objeto.
return;
}
else if(ActX <= EntityX)
{
GoToObject();
return;
}
}
}
No sé si es de lo mejor, porque digamos que corta la pantalla en cuadrícula para fijarse cuál es la posición del actor con respecto a la del objeto, cuando en realidad daría un efecto más realista cortarla en ocho partes, como de pizza. Pero bueno, me dejo de metáforas y explico un poco.

El código de la función cuenta con tres partes. Primero chequea si el actor está más de 20 pixeles por debajo del objeto, luego si está más de 20 por encima, y luego si ninguna de las dos anteriores. O sea, técnicamente, divide la pantalla en 3 franjas horizontales y se fija en cuál está el actor: si en la del medio, de 40 pixeles de alto (con centro en el objeto); en la de arriba (todo lo que está arriba de la del medio); o en la de abajo.

Cada una de esas tres partes del código está a su vez dividida en tres partes. Cuando ya identificó si está por encima, por debajo o ninguna, chequea si está más de 30 pixeles a la derecha del objeto, luego si está otro tanto pero a la izquierda, y luego si está más en el medio. Divide la pantalla (técnicamente) en tres columnas: una central (con centro en el objeto) de 60 pixeles de ancho, una a la izquierda y otra a la derecha. Y se fija en cuál está el actor.

Dividiendo la pantalla así en 9 partes, con centro en un rectángulo de 60 por 40 centrado al objeto, se fija qué hacer: si está en la parte que corresponde a la esquina superior izquierda, pues mirará abajo a la derecha, si está en la parte que está justo encima del objeto, pues mirará hacia abajo. Y si se encuentra en la parte central, está tan cerca del objeto que lo mismo vale un GoToObject() y listo.

Es decir, así es como yo lo veo. Lo que no entiendo es por qué en vez de subdividir las tres partes en otras tantas, las divide en cuatro. Si te fijás, cada una de las tres partes tiene en realidad cuatro bloques if(), y no entiendo por qué, ya que los últimos dos siempre dan el mismo resultado, lo mismo valdría que fueran uno solo.
Pero bueno, no sirve de nada intentar de descifrar las cosas raras que salen de las cabezas retorcidas de los programadores.

Como ya dije, cualquier explicación que invente se me hace igual de difícil que el código mismo, así que no te avergüences de no haberme entendido ni jota.
Logged

bamyito

  • Occasional poster
  • **
  • Karma: 0
  • Offline Offline
  • Posts: 53
  • Aprendoaprendoaprendo...
    • View Profile
Re: Empezando y con problemas.
« Reply #44 on: January 12, 2011, 02:19:38 PM »

Vale, la explicación la he entendido (casi todo), y ya creo que voy entendiendo cómo he de pensar. Lógica e imaginación mezclados... mola. Cortarlo en modo de pizza 8 en lugar de 9 cuadrados... tomando como centro, el pixel del objeto,... ¿eso no tendría mucho mas código, al tener que dividir la pantalla de manera diagonal? Investigaré el asunto.

Y como ya te dije, conseguí que el código funcionase, tanto este como el otro que se te ocurrió. lo curioso es que me da la impresión de que el otro método que se te ocurrió a ti, queda como mas natural al avanzar un poco. Con este método, rota sobre sí mismo con sus posiciones de "parado" (parado mirando abajo, parado mirando en diagonal abajo-derecha, parado mirando a la derecha, parando mirando a derecha- arriba, parado mirando arriba) hasta que se qeuda mirando al objeto en cuestión.
Mi pregunta es: ¿podrían hacerse animaciones para que, al girarse a un lado o a otro, quedara mas natural? o sea, una animación intermedia para cuando gire de posición.

otra pregunta: Supongo que todo este código he de repetirlo en todos los objetos si quiero que haga esa función (girarse al objeto), ¿cierto? La pregunta es: ¿no podría activar un script para todas estas situaciones aparte, y enlazarlo desde los objetos para, así, tener menos código? creo que me estoy complicando demasiado por ahora...

y otra pregunta: Si quisiera que el actor tuviese alguna animación especial (Como por ejemplo dar un puñetazo), ¿cómo haría eso? Supongo que si el actor da el puñetazo al usar determinado objeto con otro personaje u objeto, (por ejemplo, martillo y bicho amarillo), en el bicho pondría el código "on martillo, go to object, actor talk o lo que sea" la pregunta es: el codigo para activar otra animación en el prota (y ya que estamos, en el otro personaje), ¿cómo se haría? creo que con el otro personaje quizá lo consiguiese, pero con el actor no estoy seguro.

Y nada, esperando un pequeño resumen sobre cómo tratar con el texto y los diálogos. No estoy repitiendome por impaciente, sino como recordatorio. Sin prisas ni agobios, ok?

Gracias de nuevo ;D
« Last Edit: January 12, 2011, 02:28:00 PM by bamyito »
Logged
Pages: 1 2 [3] 4
 

Page created in 0.151 seconds with 24 queries.