Null-Z
Member
Well, I'm finally attempting to convert my jumbled player code into a state machine. but, as to be expected, problems ensue.
a REAL mess I know, and probably making things more complicated than need be. but I'm still very unsure how to do this for a player controlled object. all help is appreciated.
Code:
scr_PlayerStats();
enum Player_state
{
Idle,
Shoot,
Move,
MoveShoot,
Jump,
JumpShoot,
death,
}
state = Player_state.Idle;
Code:
scr_GetInputs();
switch (state)
{
case Player_state.Idle: {scr_Idle();}; break;
case Player_state.Shoot: {scr_shoot();}; break;
case Player_state.Move: {scr_Movement();}; break;
case Player_state.MoveShoot: {scr_MoveShoot();}; break;
case Player_state.Jump: {scr_Jump();}; break;
case Player_state.JumpShoot: {scr_JumpShoot();}; break;
case Player_state.death: {scr_Dieing();}; break;
}
Code:
///Initialize Variables
grav = 0.5;
hsp = 0;
hsp_carry = 0;
vsp = 0;
vsp_carry = 0;
movespeed = 2.5;
jumpspeed_normal = 8.5;
jumpspeed_powerup = 20;
jumpspeed = jumpspeed_normal;
key_down = 0;
if (global.checkpointR == room)
{
x = global.checkpointx;
y = global.checkpointy;
}
Code:
//Get the player's input
key_right = keyboard_check(vk_right);
key_left = -keyboard_check(vk_left);
key_jump = keyboard_check_pressed(vk_space);
key_down = keyboard_check(vk_down);
key_s = keyboard_check_pressed(ord("s"))
Code:
var hsp_final = hsp + hsp_carry;
hsp_carry = 0;
var vsp_final = vsp + vsp_carry;
vsp_carry = 0;
//Horizontal Collision
if (place_meeting(x+hsp_final,y,BCH_G))
{
while(!place_meeting(x+sign(hsp_final),y,BCH_G))
{
x+= sign(hsp_final);
}
hsp_final = 0;
hsp = 0;
}
x += hsp_final;
//Verticle Collision
if (vsp < 20) vsp += grav;
if (place_meeting(x,y+vsp_final,BCH_G))
{
while(!place_meeting(x,y+sign(vsp_final),BCH_G))
{
y += sign(vsp_final);
}
vsp_final = 0;
vsp = 0;
}
y += vsp_final;
Code:
move = key_left + key_right;
hsp = move * movespeed;
if (vsp < 20) vsp += grav;
if (place_meeting(x,y+5,BCH_G))
{
if (key_jump) vsp = -jumpspeed
}
var hsp_final = hsp + hsp_carry;
hsp_carry = 0;
var vsp_final = vsp + vsp_carry;
vsp_carry = 0;
image_xscale = move;
if (place_meeting(x,y+1,BCH_G))
{
if (move!=0) sprite_index = spr_AGRun
}
///State Transitions.
if (!move)
{
state = Player_state.Idle;
}
if (key_jump)
{
state = Player_state.Jump
}
if (key_s)
{
state = Player_state.MoveShoot;
}
if (key_jump && key_s)
{
state = Player_state.JumpShoot;
}
scr_collision();
Code:
sprite_index = spr_AGSht;
if instance_number(OBJ_Bullet) < 3
bullet = instance_create(x+(12*image_xscale),y,OBJ_Bullet);
bullet.hspeed = 7*image_xscale;
///State Transition
if (!key_s)
{
state = Player_state.Idle;
}
if (key_jump)
{
state = Player_state.Jump;
}
if (key_left || key_right)
{
state = Player_state.Move;
}
scr_collision();
Code:
if key_right
{
Player_state = Move;
}
if key_left
{
Player_state = Move;
}
if key_s
{
Player_state = Shoot;
}
if key_Jump
{
Player_state = Jump;
}
if (!place_meeting(x,y+14,BCH_G))
{
state = Player_state.Jump;
}
scr_collision();
Code:
sprite_index = spr_AGJump;
///State Transitions.
if (vsp = 0)
{state = Player_state.Idle;}
if (key_s)
{
state = Player_state.JumpShoot;
}
scr_collision()
Code:
///haven't started working on this one yet.
sprite_index = spr_AGD
audio_stop_all();
audio_play_sound(snd_PlayerDeath,5,false);
Code:
sprite_index = spr_AGRunSht
if instance_number(OBJ_Bullet) < 3
{
bullet = instance_create(x+(12*image_xscale),y,OBJ_Bullet);
bullet.hspeed = 7*image_xscale;
}
///State Transitions
if (!key_s)
{
state = Player_state.Move;
}
if (!key_s && !key_left + !key_right)
{
state = Player_state.Idle;
}
if (key_jump && key_s)
{
state = Player_state.JumpShoot;
}
if (key_jump)
{
state = Player_state.Jump;
}
scr_collision();
Code:
sprite_index = spr_AGjumpSht
if instance_number(OBJ_Bullet) < 3
{
bullet = instance_create(x+(12*image_xscale),y,OBJ_Bullet);
bullet.hspeed = 7*image_xscale;
}
a REAL mess I know, and probably making things more complicated than need be. but I'm still very unsure how to do this for a player controlled object. all help is appreciated.
Last edited: