M
MyDude
Guest
the problem I've been having is that the AI won't move at all after it has collided with the wall (the AI isn't stuck in the wall)
What I've Noticed
The problem only happens when I try to get the AI to move away from the player and here is the code for that
the vspd is affecting the hspd for some reason
eR is shorthand for Enemy Ranged
it's pretty simple but the way I'm making him run away from the player is by changing how vspd and hspd are being added, so instead of it being += I changed it -=. Problem is it breaks the collision detection and he can't move at all once he's collided on the y axis.
Here is the rest of the code that has to do with collisions
Ranged enemy's run away state
Ranged Enemy's Create Event
Step is just a Script Execute
And I added this to fix a problem I had when flipping the xscale so the AI wouldn't get stuck in the wall
In the Ranged Enemy theres is a collision event with Obj_Solid with this code:
This may be irrelevant but it might help to post the code that does work for me in terms of collisions(the one my players using)
Player's Working Collision (it seems that way at least)
If I confused you(I have a weird way of explaining things sorry) or you need more information to help me please let me know so I can add it.
Any help would be appreciated and if it isn't much to ask an explanation on how the solution would work/ why I'm gettting the bug I'm currently getting.
What I've Noticed
The problem only happens when I try to get the AI to move away from the player and here is the code for that
the vspd is affecting the hspd for some reason
eR is shorthand for Enemy Ranged
Code:
///eR_collide
//makes him run away
//Horizontal collision
if (place_meeting(x + hspd, y, obj_solid)) {
while (!place_meeting(x + sign(hspd), y, obj_solid)) {
x+=sign(hspd);
}
hspd = 0; //works fine for me
}
x -= hspd;
//Vertical collisions
if (place_meeting(x, y + vspd, obj_solid)) {
while (!place_meeting(x, y + sign(vspd), obj_solid)) {
y += sign(vspd);
}
vspd = 0; //when this code gets ran it sets my hspd = 0
}
y -= vspd;
it's pretty simple but the way I'm making him run away from the player is by changing how vspd and hspd are being added, so instead of it being += I changed it -=. Problem is it breaks the collision detection and he can't move at all once he's collided on the y axis.
Here is the rest of the code that has to do with collisions
Ranged enemy's run away state
Code:
///scr_eR_run_away()
var dis = point_distance( x, y, obj_player.x, obj_player.y);
dir = point_direction(x, y, obj_player.x, obj_player.y);
hspd = lengthdir_x( spd, dir);
vspd = lengthdir_y( spd, dir);
if (hspd != 0) {
image_xscale = sign(hspd);
}
eR_collide(); //the script that's handling collisions and moving the enemy
if (round(dis) > 400) {
//make him stop moving
spd = 0
} else if (round(dis) < 400) {
spd = 2;
}
Ranged Enemy's Create Event
Code:
///variables
spd = 2;
state = scr_eR_run_away;
Step is just a Script Execute
And I added this to fix a problem I had when flipping the xscale so the AI wouldn't get stuck in the wall
In the Ranged Enemy theres is a collision event with Obj_Solid with this code:
Code:
check = collision_rectangle(other.bbox_left + 10, other.bbox_top + 10, other.bbox_right - 10, other.bbox_bottom - 10, obj_caster, false, false);
if (check == noone) {
}
if (check != noone) {
if (image_xscale == 1) {
if (x > other.bbox_left) {
x += 18;
}
if (x < other.bbox_right) {
x -= 18;
}
}
if (image_xscale == -1) {
if (x > other.bbox_left) {
x += 18;
}
if (x < other.bbox_right) {
x -= 18;
}
}
}
This may be irrelevant but it might help to post the code that does work for me in terms of collisions(the one my players using)
Player's Working Collision (it seems that way at least)
Code:
///collide()
//Horizontal collision
if (place_meeting(x + hspd, y, obj_solid)) {
while (!place_meeting(x + sign(hspd), y, obj_solid)) {
x+=sign(hspd);
}
hspd = 0;
}
x += hspd;
//Vertical collisions
if (place_meeting(x, y + vspd, obj_solid)) {
while (!place_meeting(x, y + sign(vspd), obj_solid)) {
y += sign(vspd);
}
vspd = 0;
}
y += vspd;
//checks to see if the player is stuck and if he is move him 10 pixels so he isn't stuck anymore
if (place_meeting(x, y, obj_solid)) {
if (image_xscale == 1) {
show_debug_message("stuck")
x += 10;
}
if (image_xscale == -1) {
show_debug_message("not stuck")
x -= 10; //prevent();
}
}
Any help would be appreciated and if it isn't much to ask an explanation on how the solution would work/ why I'm gettting the bug I'm currently getting.