Let's see.
You are updating you bullets x position using "hsp". However, you are only calculating "hsp" in the bullets Create Event.
The bullets Create Event runs the very moment you create it.
Then, you are updating the bullets "dir" variable, but as you are moving the bullet via "hsp" this will do nothing, because hsp remains as it was set in the Create Event.
Therefore, all your bullets are moving according to "hsp", which is always going to be dir * velocity as per your Create Event, your "dir" == 0.
So all bullets are going to be [shooting to the right.] EDIT: Cancel that - they won't be moving at all.
It should be more like this:
Bullet Create Event
Code:
dir = 0
velocity = 20
hsp = 0
...rest of code
Enemy Step Event (where you create the bullet)
Code:
var _inst = instance_create_depth((x + sign(hsp)*20), y-7, 1, objectBulletEnemy);
_inst.direction = dir;
_inst.speed = _inst.velocity;
Then you can delete the bullets Step Event and let Game Maker handle the movement of the bullet, because you have set the built-in variables "speed" and "direction", which Game Maker will use to move the bullet automatically.
If you must use hsp, then you will want to do this:
Enemy Step Event
Code:
var _inst = instance_create_depth((x + sign(hsp)*20), y-7, 1, objectBulletEnemy);
_inst.hsp = dir * inst.velocity;
...and leave the Enemy Bullet as "x += hsp"