Hola gente como andan? Me presento, Mi nombre es Emiliano y tengo la siguiente duda....
Resulta que quiero lograr este efecto que veran en la imagen, perdon que se vea chica (pueden mirar un video de ammo roar o super big gun adventure para entender mejor) , pero el concepto es este, quiero lograr que el personaje al disparar, salga con impulso a la direccion contraria a la que esta disparando, se entiende? ya logre hacer que el personaje dispare y que la pistola mire para donde apunta el mouse, pero no se como hacer para que cada vez que dispare (efecto ametralladora) salga con impulso a la direccion contraria a la que esta disparando, tengo hecho el siguiente codigo en los objetos
(GAME MAKER STUDIO 1.4)

evento step del jugador

/// Controlar velocidad de movimiento
vv = 0;
vh = 0;
v = 30;
if (keyboard_check(ord('W'))) vv = -v; image_index=sprite2
if (keyboard_check(ord('S'))) vv = v; image_index=spr_jugador1
if (keyboard_check(ord('A'))) vh = -v;image_index=sprite2
if (keyboard_check(ord('D'))) vh = v;image_index=spr_jugador1

if (keyboard_check(vk_up)) vv = -1000;
if (keyboard_check(vk_down)) vv = 1000;
if (keyboard_check(vk_left)) vh = -1000;
if (keyboard_check(vk_right)) vh = 1000;

//cambio de sprite del personaje

if x < mouse_x
sprite_index = spr_jugador1

else

sprite_index = sprite2



/// Procesar movimiento
pm = place_meeting(x+vh,y+vv,obj_pared);
cl = collision_line(x,y,x+vh,y+vv,obj_pared,false,false);

if (pm or cl) {
    // Comprobando colisión horizontal
    for(var i=0;i<abs(vh);i++){
        if (place_meeting(x+sign(vh),y,obj_pared)) then break;
        x += sign(vh);
    }
    // Comprobando colisión vertical
    for(var i=0;i<abs(vv);i++){
        if (place_meeting(x,y+sign(vv),obj_pared)) then break;
        y += sign(vv);
    }
    vh = 0;
    vv = 0;
}

hspeed = vh;
vspeed = vv;




Objeto Arma


Evento Step

dir = point_direction(obj_jugador.x, obj_jugador.y, mouse_x, mouse_y);
image_angle= dir

if obj_jugador.x < mouse_x {
image_yscale=+1
x=obj_jugador.x +15
y=obj_jugador.y +15
}

else{
image_yscale= -1
x=obj_jugador.x -15
y=obj_jugador.y +15
}



Evento Glob left button

var xp, yp;
xp=x+10*cos(degtorad(image_angle))
yp=y-10*sin(degtorad(image_angle))

bob = instance_create(xp,yp,obj_bala2)
bob .speed=15
bob .direction=image_angle
bob .image_angle=image_angle



Espero puedan ayudarme, gracias y un abrazo a todos!!


Si bien solo le he dado una mirada muy rápida a tu código. Entiendo que quieres que al disparar el personaje retroceda.
Para ello yo te diría que uses una variable un alarma.Ejemplo:

if click derecho
{Empuje = true
if mouse_X > personaje
{desplazar 3 pixeles a la izquierda}
if mouse_X < personaje
{desplazar 3 pixeles a la derecha}}
else
{Empuje = false}

if Empuje = false
{f (keyboard_check(ord('A'))) vh = -v;
if (keyboard_check(ord('D'))) vh = v;}

if Empujar = true
{alarm[0] = 3}

//En la alarma
Empujar = false



Con esto tendrías que poder notarse el efecto de empujar al jugador cuando dispara sin problemas.
Pero OJO este sistema inpide que mientras aprietes el boton de disparar el jugador se pueda mover a voluntad.