How to create a toggling on/off kind of thing?

P

Pitu

Guest
Hey I'm having alot of problems with my code, so heres the scenario:
i have 2 sprites dedicated for 1 object and a player object.

Sprites:
1. spr_bed (image of empty bed)
2. spr_bed_used (image of bed with player's head to indicate he's sleeping in it)

Objects:
1. obj_player (player object)
2. obj_bed (object that uses spr_bed_used by default, and this object is plopped in the room from the start)

What I want to do:
I want it so that when I press E, the player should get out of bed and when he is out of bed and I press on it again, he should go back to bed.

How I'm trying to do it:
I'm basically creating and destroying the instances depending on which sprite_index it is currently on, here is the code to basically clear everything up. Help please it's not working! When I run the spr_bed_used appears but when i press E nothing happens!

obj_bed:

STEP EVENT:
Code:
key_bed = keyboard_check_pressed(ord("E"));

if(sprite_index = spr_bed_used){
    in_bed = true;
} else if(sprite_index = spr_bed){
    in_bed = false;
}

//If in bed is true, destroy the player
if(in_bed = true){
    with(obj_player){
        instance_destroy();
    }
}

//If in bed is false, create the player
if(in_bed = false){
    instance_create(x, y-10, obj_player);
}

//If in bed is true, and you press E, in bed is false.
if(in_bed = true && key_bed){
    in_bed = false;
}

//If in bed is false, and you press E, in bed is true.
if(in_bed = false && key_bed){
    in_bed = true;
}
 
L

lovareth

Guest
in_bed may will always pass true in your step event, maybe you can try to change the code:



Code:
if (key_bed){
     if (in_bed)
          in_bed = false;
     else
          in_bed = true;
}
delete the code below:
Code:
//If in bed is true, and you press E, in bed is false.
if(in_bed = true && key_bed){
    in_bed = false;
}

//If in bed is false, and you press E, in bed is true.
if(in_bed = false && key_bed){
    in_bed = true;
}
 
Last edited by a moderator:
C

Ctl-F

Guest
your problem is that you are using the sprite as the way to determine if the player is in the bed or not, but you never change the sprite. you change in_bed instead.
instead of:
//If in bed is true, and you press E, in bed is false.
if(in_bed = true && key_bed){
in_bed = false;
}

//If in bed is false, and you press E, in bed is true.
if(in_bed = false && key_bed){
in_bed = true;
}
try:

//If in bed is true, and you press E, in bed is false.
if(in_bed = true && key_bed){
sprite_index = spr_bed;
}

//If in bed is false, and you press E, in bed is true.
if(in_bed = false && key_bed){
sprite_index = spr_bed_used;
}
 

NazGhuL

NazTaiL
I like to build those kind of object using States. (Door, chest, etc)
ie:
obj_bed create event
Code:
state = 'empty';
activate = false;
step event:
Code:
if(activate == true)
{
     if(state == 'empty')
     {
     sprite_index = spr_bed_occupied;
     state = 'occupied';
     scr_bed_in();
     }
     else if(state == 'occupied')
     {
     sprite_index = spr_bed_empty;
     state = 'empty';
     scr_bed_out();
     }

activate = false;
}
 
Is there any specific reason for destroying the player object? Otherwise, with minimal changes, I think you can do something like this:

Code:
obj_bed CREATE EVENT:
in_bed = false;

obj_bed STEP EVENT:
key_bed = keyboard_check_pressed(ord("E"));
if (key_bed) { //This is a shortcut. The code checks if what's in the parentheses == 1, i.e. "true"
  in_bed = !in_bed; //Changes true to false and vice versa
}

if (in_bed) {
  sprite_index = spr_bed_used;
} else {
  sprite_index = spr_bed;
}
I don't know why you're doing any button checks outside of the player object, but that should work. You should have a "can_move" variable for the player, though. "can_move == false" will disable any input. You can also make the bed change the player's "visible" to 0.
 
P

Pitu

Guest
Hey guys I don't understand :(, sorry
Let me explain my situation a bit better:
So like I want my player disappeared when he is out of bed so that the spr_bed_used sprite can show that he is in bed, thats why im destroying the instance
but to get out of bed i also want to press E again ,so like by pressing E it would switch to in bed and out of bed. I mean can someone just explain for the start, im a beginner, so how would I get it to function, do I even place the bed in the room or create the bed instance through code? because it starts as spr_bed_used, so the player has to get out of bed in the beginning anyway

ps@nacho_chicken
i loved simov, huge fan
 
L

lovareth

Guest
//create event
Code:
key_bed = 0; //create key_bed variable
in_bed = true; //create in_bed and set to true (player in bed and not exists)
//step event
Code:
key_bed = keyboard_check_pressed(ord("E")); //key button

if (key_bed){
     if (in_bed == true){
          in_bed = false;
          sprite_index = spr_bed;
          instance_create(x, y-10, obj_player);
     }else{
          in_bed = true;
          sprite_index = spr_bed_used;
          with(obj_player){
               instance_destroy();
          }
     }
}
a simpler code. you can try this maybe easy for you to understand
 
P

Pitu

Guest
Hey thanks for that, it kinda works I think I got it all down except how do i tell it to stop creating more player objects once one is created? it keeps creating instances becasue I think it's in the step event right?
upload_2016-7-2_0-42-23.png
 
C

Ctl-F

Guest
just add an extra check

Code:
if (key_bed){
     if (in_bed){
          in_bed = false;
          sprite_index = spr_bed;
//=========================================
          if(instance_number(obj_player) < 1){
                      instance_create(x, y-10, obj_player);
          }
//=========================================
     }else{
          in_bed = true;
          sprite_index = spr_bed_used;
          with(obj_player){
               instance_destroy();
          }
     }
}
 
L

lovareth

Guest
and.. you also have to avoid this kind of code next time:

let say in_bed = true

Code:
//If in bed is true, and you press E, in bed is false.
if(in_bed = true && key_bed){         // in_bed = true
    in_bed = false;                   // in_bed = false
}

//If in bed is false, and you press E, in bed is true.
if(in_bed = false && key_bed){          // in_bed = false
    in_bed = true;                      // in_bed = true
}
so in_bed will always return true in that case

correct me if im wrong
 
Top