GMS 2 changing room does not happen until after event?

Discussion in 'Programming' started by Shadowblitz16, May 26, 2017.

  1. Shadowblitz16

    Shadowblitz16 Member

    Joined:
    Jun 23, 2016
    Posts:
    601
    does anybody know how to get around my object being deleted after I change rooms?

    Code:
    //Goto Room
    room = rm_menu;
    
    //Toolbar
    tools_menu = new_item(0, 2,  0, Item_Toolbar_Menu,  new_exit(6,6,5,1));
    
    //Menus
    menu_tiles = new_item(0, 16, 6, Item_Option_Tileset, new_exit(0,0,6,6));
    
    Code:
    /// @description new_item()
    /// @param x
    /// @param y
    /// @param index
    /// @param object
    /// @param item_exit
    
    var xx        = argument[0];
    var yy        = argument[1];
    var index     = argument[2];
    var object    = argument[3];
    var item_exit = argument[4];
    
    var inst = instance_create_depth(x+xx, y+yy, -1, object);
        inst.index     = index;
        inst.item_exit = item_exit;
        inst.parent    = id;
       
       
    return inst;
    
    Code:
    /// @description new_exit()
    /// @param up
    /// @param down
    /// @param left
    /// @param right
    
    var up = argument[0];
    var down = argument[1];
    var left = argument[2];
    var right = argument[3];
    
    var data;
        data[0] = up;
        data[1] = down;
        data[2] = left;
        data[3] = right;
       
    return data;
    
    when I call the editor_goto_menu it doesn't set the room until after the script is finished instead of changing the room and then creating the objects.

    I'm not sure if this gamemaker was programmed to do this intentionally but it should not work this way.
     
  2. rIKmAN

    rIKmAN Member

    Joined:
    Sep 6, 2016
    Posts:
    4,885
    Try using room_instance_add to add the items to the other room before you change to it.
     
  3. Shadowblitz16

    Shadowblitz16 Member

    Joined:
    Jun 23, 2016
    Posts:
    601
    I did but then I can't set set variables with the instance id it returns, since the instance's don't exist in the room currently running.
     
  4. rIKmAN

    rIKmAN Member

    Joined:
    Sep 6, 2016
    Posts:
    4,885
    Store them in a list and create them from the list once the room has been changed using instance_add().
     
  5. Shadowblitz16

    Shadowblitz16 Member

    Joined:
    Jun 23, 2016
    Posts:
    601
    can you give me an example of whats wrong with my code? I'm trying to do this in one controller object

    basicly I want to make a event driven editor that uses keyboard and joypads for input
    I want to handle the editor init and update in scripts based on cur_menu and cur_item

    however I am very bad at menus because of the complexity of the structuring

    Code:
    /// @description Editor Create
    // You can write your code in this editor
    #macro CURRENT -42
    
    cur_menu    = 0;
    cur_item    = 0;
    
    old_menu    = cur_menu;
    old_item    = cur_item;
    
    menu_changed   = false;
    item_changed   = false;
    
    rooms = ds_list_create();
    rooms[| 0] = rm_menu;
    rooms[| 1] = rm_tiles;
    
    Code:
    /// @description Editor Step
    // You can write your code in this editor
    
    menu_changed   = false;
    item_changed   = false;
    
    if (cur_menu   != old_menu)   menu_changed   = true;
    if (cur_item   != old_item)   item_changed   = true;
    
    old_menu   = cur_menu
    old_item   = cur_item
    
    switch(cur_menu)
    {
        case 0: editor_step_menu();     break;
        case 1: editor_step_tiles();    break;
    }
    
    if (menu_changed) room_goto(rooms[| cur_menu]);
    
    Code:
    /// @description Editor Room Changed
    // You can write your code in this editor
    
    
    switch(cur_menu)
    {
        case 0: editor_init_menu();     break;
        case 1: editor_init_tiles();    break;
    }
    
    Code:
    /// @description Item Create
    // You can write your code in this editor
    
    text_changed        = false;
    timer_changed       = false;
    index_changed       = false;
    state_changed       = false;
    image_start_changed = false;
    image_end_changed   = false;
    
    cur_text        = "";
    cur_timer       = -1;
    cur_index       = 0;
    cur_state       = false;
    cur_image_start = 0;
    cur_image_end   = 0;
    
    old_text        = cur_text;
    old_timer       = cur_timer;
    old_index       = cur_index
    old_state       = cur_state;
    old_image_start = cur_image_start;
    old_image_end   = cur_image_end;
    
    index     = 0;
    parent    = noone;
    item_exit = new_exit(0,0,0,0,0);
    
    Code:
    /// @description Item Step
    // You can write your code in this editor
    
    var input_a = keyboard_check_pressed(vk_enter);
    var input_up = keyboard_check_pressed(vk_up);
    var input_down = keyboard_check_pressed(vk_down);
    var input_left = keyboard_check_pressed(vk_left);
    var input_right = keyboard_check_pressed(vk_right);
     
    var item_up    = item_exit[0];
    var item_down  = item_exit[1];
    var item_left  = item_exit[2];
    var item_right = item_exit[3];
    
    
    //Update changed status
    text_changed        = false;
    timer_changed       = false;
    index_changed       = false;
    state_changed       = false;
    image_start_changed = false;
    image_end_changed   = false;
    
    if (cur_text        != old_text)         text_changed        = true;
    if (cur_timer       != old_timer)        timer_changed       = true;
    if (cur_index       != old_index)        index_changed       = true;
    if (cur_state       != old_state)        state_changed       = true;
    if (cur_image_start != old_image_start)  image_start_changed = true;
    if (cur_image_end   != old_image_end)    image_end_changed   = true;
    
    old_text        = cur_text
    old_timer       = cur_timer
    old_index       = cur_index
    old_state       = cur_state
    old_image_start = cur_image_start
    old_image_end   = cur_image_end
    
    if (cur_timer >= 0) cur_timer --;
    if (image_index >= cur_image_end || image_index < cur_image_start) image_index = cur_image_start;
    
    if (parent.cur_item == cur_index && parent.cur_item == parent.old_item)
    {
       
        // Set timer when pressed
        if (input_a) cur_timer = 4;
       
        //Update pressed variable
        if (cur_state == true) cur_state = false;
        if (cur_timer == 0)    cur_state = true;
    
       
    
        //Handle index
        if (input_up)    parent.cur_item = item_up;
        if (input_down)  parent.cur_item = item_down;
        if (input_left)  parent.cur_item = item_left;
        if (input_right) parent.cur_item = item_right;
    }
    
    
     
  6. Shadowblitz16

    Shadowblitz16 Member

    Joined:
    Jun 23, 2016
    Posts:
    601
    ok so I think I got it
    however I was wondering if there is a way to changed a variables when another variable updates?

    so instead of having to do this..
    Code:
    /// @desc editor_step_menu()
    
    //Menus
    if (tools_menu.cur_state == 1) { cur_menu = 0; menu_changed = true; }
    
    
    //Options
    if (menu_tiles.cur_state == 1) { cur_menu = 1; menu_changed = true; }
    
    I can just do this
    Code:
    /// @desc editor_step_menu()
    
    //Menus
    if (tools_menu.cur_state == 1) { cur_menu = 0; }
    
    
    //Options
    if (menu_tiles.cur_state == 1) { cur_menu = 1;  }
    
    and update the menu_changed variables in the editor.step event.

    Code:
    if (cur_menu   != old_menu)   menu_changed   = true;
    if (cur_item   != old_item)   item_changed   = true;
    
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice