• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GML SOLVED Problem with enemy tile collision

TOMXT

Member
Hi, noob here again.

I have with enemy tile collision. They get stuck in walls everytime when they chase player, and often in idle state. Player collision works on the same code and it works perfect.
Game project is totally top-down shooter.
Heres code

EnemyTileCollision script
GML:
function EnemyTileCollision(){
var _collision = false;

//horizontal
if(tilemap_get_at_pixel(collisionMap,x+hsp,y))
{
    x -= x mod TILE_SIZE;
    if(sign(hsp) == 1) x += TILE_SIZE - 1;
    hsp = 0;
    _collision = true;
}
//horizontal move commit
x += hsp;


//vertical

if(tilemap_get_at_pixel(collisionMap,x,y+vsp))
{
    y -= y mod TILE_SIZE;
    if(sign(vsp) == 1) y += TILE_SIZE - 1;
    vsp = 0;
    _collision = true;
}
//vertical move commit
y += vsp;




return _collision;
}
enemy step event code
GML:
EnemyTileCollision();
image_angle = direction;
attackcol++;
#region enemy state
if(enstate == enemystate.idle)
{
    image_angle = direction;
    //zachowanie
    counter += 1;
    //zmiana state
    if(counter >= room_speed * 3)
    {
        var change = choose(0,1);
        switch(change)
        {
            case 0: enstate = enemystate.patrol;
            case 1: counter = 0; break;
        }
    }
    if(collision_circle(x,y, 128, o_Player, false, false))
    {
        enstate = enemystate.chase;   
    }
}else if(enstate == enemystate.patrol)
{
    //zachowanie
    
    counter +=1;
    x+= hsp;
    y += vsp;
    //zmiana state
    if(counter >= room_speed * 3)
    {
        var change = choose(0,1);
        switch(change)
        {
            case 0: enstate = enemystate.idle;
            case 1:
                direction = irandom_range(0,359);
                hsp = lengthdir_x(walksp, direction);
                vsp = lengthdir_y(walksp, direction);
                image_angle = direction;
                counter = 0;
        }
    }
    if(collision_circle(x,y,120 , o_Player, false, false))
    {
        enstate = enemystate.chase;   
    }
}else if( enstate == enemystate.chase)
{
    
    //zachowanie
    x+= hsp;
    y += vsp;
    image_angle = direction;
    direction = point_direction(x,y,o_Player.x, o_Player.y)
    hsp = lengthdir_x(chasespeed, direction);
    vsp = lengthdir_y(chasespeed, direction);
    image_angle = direction;
    
    
    //zmiana stanu
    if(!collision_circle(x,y, 128, o_Player, false, false))
    {
        enstate = enemystate.idle;   
    }
    if(collision_circle(x,y, sprite_w_half, o_Player, false, false))
    {
        enstate = enemystate.attack;   
    }
}else if(enstate == enemystate.attack)
{
    
    image_angle = direction;
    direction = point_direction(x,y,o_Player.x, o_Player.y)
    hsp = 0;
    vsp = 0;
    x+= hsp;
    y += vsp;
    if(!collision_circle(x,y,sprite_w_half, o_Player, false, false))
    {
        enstate = enemystate.chase;   
    
    }
    if(!collision_circle(x,y, 128, o_Player, false, false))
    {
        enstate = enemystate.idle;   
    
    }
}
#endregion
Do you have any idea how to solve that problem?
 
Top