Translations of this page:

Entradas y salidas múltiples a y desde tus zonas

Resumen

Las escenas por defecto que crea WME tienen una posición de inicio del actor cuando la escena carga. Para muchos casos esto es suficiente, pero si tenemos una localización que tiene varias entradas, necesitaremos que el actor aparezca en diferente sitio dependiendo de por donde haya entrado.

El primer ejemplo de esto es si tienes una gran escena principal, con cierto número de salidas que dan a distintas locaclizaciones. Si entras en esa escena desde una de las salidas/entradas, querrás que el actor aparezca junto a la puerta por la que ha entrado y no siempre en la misma posición

Aquí tenemos un ejemplo del script de inicio de la escena que crea WME por defecto (scene_init.script).

#include "scripts\base.inc" 
 
// Se inicializa la escena, se pone al actor en la posición 400,400 y mirando hacia abajo (adelante) y por último se le activa para que el jugador interactue con él 
 
actor.SkipTo(400, 400); 
actor.Direction = DI_DOWN; 
actor.Active = true; 
 
 
//////////////////////////////////////////////////////////////////////////////// 
// 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... 
}

La parte que nos interesa en este script es esta

actor.SkipTo(400, 400); 
actor.Direction = DI_DOWN;

Como ya hemos comentado en el código, se pone al actor (SkipTo)en la posición 400,400 y mirando hacia abajo (actor.Direction=DI_DOWN). Simplemente cambiando estos valores, cambias la posición y la orientación del actor cuando la escena se inicia.

OK... Ahora un ejemplo

Este va a ser nuestro mapa para seguir el ejemplo

Tenemos un gran recibidor (hallway) con una habitación a cada extremo. Si el actor va a la cocina (kitchen), cuando vuelva al recibidor queremos que aparezca al lado de la puerta de la cocina, y lo mismo para la otra habitación, la sala de baile (ballroom), así que dependiendo de que habitación salga, colocaremos al actor en una posición diferente en el recibidor.

Bien, para un fácil entendimiento , vamos a usar el código "initial scene transition" que viene en los tutoriales, este ejmplo hace que el actor vaya hacia un objeto cuando picas en el con el ratón

Entonces, las entidades de las puerta de la cocina y la sala de baile tendrían el siguiente código para entrar en la habitación. En el ejemplo la sala de baile:

on "LeftClick" 
{ 
  actor.GoToObject(this); 
  Game.ChangeScene("scenes\ballroom\ballroom.scene"); 
}

Bueno, esto está claro, va hacia el objeto, normalmente una entidad que coincide con la puerta y cuando llega, cambia de escena y aparece en la nueva.

(seguiré traduciendo :D)

Passing a global variable between scenes

So lest do this…. The way it will work is that we will define a variable, witch is passed from one scene to the other. witch can then be tested in the hallway scene, thus enabling the hallway to identify witch scene the variable came from. And this is how you do it.

1) Change the transition code in the kitchen entity script from the default (written above) to this new code.

on "LeftClick" 
{ 
  global ExitSceneGV = "kitchen2hallway"; 
  actor.GoToObject(this); 
  Game.ChangeScene("scenes\ballroom\ballroom.scene"); 
}
Pause and understand what has happened

All we have done is added a single line of code "global ExitSceneGV = "kitchen2hallway";" to the transition script. All it is doing is defining a global Variable for our project called ExitSceneGV (Exit Scene Global Variable). A Global variable is a variable that is not bound to any location it can be accessed from anywhere. As in acessed in one scene, and then another scene.

You can use this same Global variable for your entire project for your simple scene transition needs, so name it easy to spell and unique.

Ok.. so we have our global variable "ExitSceneGV " and it contains the information "kitchen2hallway". So lets see how to use it!

1) Load up your ballroom scene's scene_int.script. It will look like the code at the top of this tutorial.

2) Find and delete these lines

actor.SkipTo(400, 400); 
actor.Direction = DI_DOWN;


3) Replace them with these lines.

global ExitSceneGV ; 
//Enter from Kitchen 
if(Game.PrevScene=="kitchen") 
{ 
  if(ExitSceneGV == "kitchen2hallway") 
  { 
        actor.SkipTo(400, 400); 
        actor.Direction = DI_DOWN; 
  } 
}
Pause and understand what has happened

The scene initialisation script is loading the scene as it dose so it loads the global variable, it then uses a TEST, with the IF loop. It breaks down like this.

1) First it dose a test to see if the previous scene was the kitchen scene
2) It then dose a test to see if the global variable it has loaded is the correct one. (the variable was set as you left the kitchen zone)
3) If those tests are true.. then it will execute the actor placement code. Witch is

actor.SkipTo(400, 400); 
        actor.Direction = DI_DOWN;


That is it you have tested the variable and done what is needed… the next step is to do the same things for the ballroom…. the code looks like this

Ballroom exit scene script

on "LeftClick" 
{ 
  global ExitSceneGV = "ballroom2hallway"; 
  actor.GoToObject(this); 
  Game.ChangeScene("scenes\ballroom\ballroom.scene"); 
}


And the scene_init.script for the hallway is now

global ExitSceneGV ; 
//Enter from Kitchen 
if(Game.PrevScene=="kitchen") 
{ 
  if(ExitSceneGV == "kitchen2hallway") 
  { 
        actor.SkipTo(400, 400); 
        actor.Direction = DI_DOWN; 
  } 
} 
//Enter from Hallway 
if(Game.PrevScene=="ballroom") 
{ 
  if(ExitSceneGV == "ballroom2hallway") 
  { 
        actor.SkipTo(400, 400); 
        actor.Direction = DI_DOWN; 
  } 
}

That is it your done!!! Simple make sure the SkipTo is set to diffrent values and the actor will apear on diffrent sides of the room!!!!!!

More than one entrance point to a single room

If you have a U shaped hall witch exits into a single room but on different sides you need to slightly modify this code.

So in this one you have 2 exits from another hallway room that have different actor positions in the ballroom. Do all the transitions things the same as before.. so just trigger your scene change and at the same time and define the global variable. (remember use the same variable for your entire project)

Here is the new code.. you basically need two tests instead of one… so unlike the scene_init.script code above.. here is your new one.

global ExitSceneGV; 
//Right Stairs 
if(Game.PrevScene=="hallway") 
{ 
  if(ExitSceneGV == "hallway_exit01") 
  { 
    // we went the way we came 
	actor.SkipTo(856, 227); 
	actor.TurnTo(DI_DOWNLEFT); 
  } 
  else if(ExitSceneGV == "hallway_exit02") 
  { 
    // we went around to other side 
	actor.SkipTo(147, 231); 
	actor.TurnTo(DI_DOWNRIGHT); 
  }   
}


There you go that is it…. same as before but this time you are doing more tests on the variable … you can add as many else (rooms entrances) as you want with this method.

Goodbye

Hope that help!!! Remember i am a beginner as well.. as I learn something that confused the hell out of me i will post a tut on how to get past it…

Be excellent to each other and Party on Dudes
–Jyujinkai

 
es/kbase/meaecode.txt · Last modified: 2009/02/23 17:15 by Arkwright
Recent changes RSS feed Creative Commons License Driven by DokuWiki