Wintermute Engine Forum
Wintermute Engine => Technical forum => Topic started by: Eyes_Only on June 26, 2009, 02:28:23 PM
-
Hello everybody,
I have two rooms. When I want to walk from room1 to room2 I have to open the door from room1 and when I click, I can change scene. Now I am in room2. But when I go back from room2 to room1 and the scene is loaded, the room1 door is closed.
I tried to change the starting order so that I start with room2 and then go to room1 and there it's the same, when returnig a second time to the room the room1 door is set back to closed, while room2 door stays open.
How can this be? Has anyone an idea?
Thank you...
-
II think that the better way is store a value to save the door status, for example in the var StateScene that is created when WME create the scene from template.
If you has a entity in the screen, you can put a sprite with the door open or close depending of the value.
For example:
////////////////////////////////////////////////////////////////////////////////
// scene state
global StateRoom1;
var doorEntity;
// default values
if(StateRoom1==null)
{
StateRoom1.Visited = false;
// add scene states here
StateRoom1.DoorOpened = false; // Initial value for the door. This is closed.
}
////////////////////////////////////////////////////////////////////////////////
// setup scene according to state variables
doorEntity = GetNode("door_entity"); // This is a entity in the scene tahat contain the sprite of the door open or closed
if(StateRoom1.DoorOpened) // If the door is opened
doorEntity.SetSprite("door_open.png");
else // If the door is closed
doorEntity.SetSprite("door_close.png");
////////////////////////////////////////////////////////////////////////////////
if(!StateRoom1.Visited)
{
StateRoom1.Visited = true;
// this is our first visit in this scene...
}
And in the script of the door (script assigned to the entity), for example in event "use/take":
global StateRoom1;
////////////////////////////////////////////////////////////////////////////////
on "Take"
{
if (!StateRoom1.DoorOpened) //if the door is closed, then open.
{
actor.GoToObject(this);
actor.PlayAnim("open_the_door");
this.SetSprite("door_open.png");
StateRoom1.DoorOpened = true; //stores in the scene state var the status of the door. When you return to the scene, the script used this value for draw the door open.
}
else // else, close the door
{
actor.GoToObject(this);
actor.PlayAnim("close_the_door");
this.SetSprite("door_close.png");
StateRoom1.DoorOpened = false; //stores in the scene state var the status of the door. When you return to the scene, the script used this value for draw the door close.
}
}
-
Thanks for your reply, but it doesn't work. I also tried another method. In room2 after opening the door, there is a corridor entity which I can click on, to change to room1 so in the corridor script I wrote:
#include "scripts\base.inc"
var room1_door = Scene.GetNode ("scenes\room1\room1.scene\room1_door_closed");
on "LeftClick"
{
actor.GoToObject(this);
room1_door.Active = false;
Game.ChangeScene ("scenes\room1\room1.scene");
}
But the crazy thing is, that when I enter room1, the door ist still there... How can this be???
Thanks...
-
Well, It's logical. When you return to room1, the scene load again. You don't has modifing the entity of the scene becouse the scene isn't still created. You has modifing a copy of the entity.
In the example the order is:
- Declare and create a instance of the entity (This entity there isn't in any scene).
- Whe you make Left click:
- actor goes to object
- Hide the instance of the entity that you are create before (remember that this entity isn't in the scene, the scene hasn't been still loaded)
- Change the scene (then, the scene is reloaded and the entities of the scene has the default status).
Due to this, I say you in my other message that you can store the status, and when you open the scene, in the scene_init script, you can prepare the status of the door depending on value stored.
-
Imho, this shouldn't be a problem. You have scene remember node states set in properties right for the door?
Do you have an opened and closed door for the sprites? Or is it just a door that either lets you through (is active) or blocks you (is not active)--same graphic sprite or region entity for both?
You can set globals so that if you go back to that scene the global is set in such a way that the door has to be open.
-
for the door I have a closed (door_closed) and an open (door_open) sprite and when opening (door_opening) or closing (door_closing) there is for each playing an animation containig 10 sprites. so for the closed door I have for example:
#include "scripts\base.inc"
var dooropen = Scene.GetNode ("fiona_door_open");
var doorclosed = Scene.GetNode ("fiona_door_closed");
var dooropenblocked = Scene.GetNode ("blocked_door_open");
var dooropening = Scene.GetNode ("fiona_door_opening");
var flur = Scene.GetNode ("fiona_flur");
on "LeftClick"
{
actor.GoToObject (this);
Game.Interactive = false;
actor.Talk ("Ich öffne sie mal.");
doorclosed.Active = false;
dooropening.Active = true;
var sprite = dooropening.GetSpriteObject();
while (!sprite.Finished) Sleep(1);
sprite.Reset ();
dooropening.Active =false;
dooropen.Active = true;
dooropenblocked.Active = true;
flur.Active = true;
Game.Interactive = true;
}
And the same for the open door. But the strange thing is, that wme reminds the status of the second room. That is, when I enter the second room again, the door is still open.
I tried what HelLRaiseR posted first, but while having 4 different entities for the door, the whole thing was (for me) to difficult to code. Has perhaps anyone an example how I can do this with globals?
Thanks a lot...
-
I solved it - :D :D :D - Jippiiiiiiiii
in my scene_init script I wrote:
#include "scripts\base.inc"
// here comes the stuff which initializes the scene
actor.SkipTo(461, 566);
actor.Direction = DI_DOWNRIGHT;
actor.Active = true;
////////////////////////////////////////////////////////////////////////////////
// scene state
global StateFionas_Zimmer;
// default values
if(StateFionas_Zimmer==null)
{
StateFionas_Zimmer.Visited = false;
// add scene states here
StateFionas_Zimmer.dooropen = false;
}
////////////////////////////////////////////////////////////////////////////////
// setup scene according to state variables
if(StateFionas_Zimmer.dooropen) // If the door is opened
{
var doorclosed = Scene.GetNode ("fiona_door_closed");
var dooropen = Scene.GetNode ("fiona_door_open");
var flur = Scene.GetNode ("fiona_flur");
doorclosed.Active = false;
dooropen.Active = true;
flur.Active = true;
}
else // If the door is closed
{
doorclosed.Active = true;
dooropen.Active = false;
flur.Active = false;
}
////////////////////////////////////////////////////////////////////////////////
if(!StateFionas_Zimmer.Visited)
{
StateFionas_Zimmer.Visited = true;
// this is our first visit in this scene...
}
And then when opening or closing the door, I changed the StateFionas_Zimmer value to true or false and now it works.
It's a bit different from what HelLRaiseR posted, but the idea is the same, thanks alot...