K
Karrlem
Guest
Hello all, so I'm working on a game and I would like to know how to use two keys(A+D, Left + Right arrow) as controls to orbit an object.
Ok so how would I go about doing this? what do I set xx/yy as and what variable to put instead of 45 degrees?Lets say you have a point, x,y.
You want to find another point a distance of 100 pixels away at exactly 45 degrees...
xx=x+lengthdir_x(100,45);
yy=y+lengthdir_y(100,45);
So if instead of 45 you used a variable, you could increase or decrease it therefore changing the value off xx,yy around the point.
yeah I just don't know what values to put.You need an item to orbit clockwise when a button is pressed, and counterclockwise when another button is pressed? you can read keyboard with keyboard_check.
# create event:
/// define variables
// gravity
g = 1;
g_angle = 270; // gravity direction (down)
// acceleration
a = 1;
a_angle = 180; // acceleration direction (normal to grav)
// flags
dir = 0;
hv = 0;
vv = 0;
# step event
// get inputs
key_left =-keyboard_check( ord("A") );
key_right = keyboard_check( ord("D") );
// calculate the direction the for player inputs
dir = key_left + key_right;
g_angle = point_direction(mouse_x,mouse_y,x,y)-180; // fall towards mouse
a_angle = g_angle + 90;
image_angle = a_angle;
// move left/right
if ( dir == 0 )
{
if ( hv != 0 )
{
// slow down
var pre_hv = hv;
hv -= a * sign(hv);
if ( sign(pre_hv) != sign(hv) ) hv = 0;
}
}
else
hv += a * dir;
// gravity
if ( vv < 20 )
vv += g;
// change depending on angle
var ha, va; // horiz acc angle, and verti acc angle
ha = dcos( 360 - a_angle) * hv + dcos( 360 - g_angle) * vv;
va = dsin( 360 - a_angle) * hv + dsin( 360 - g_angle) * vv;
x += ha;
y += va;
Ok cool, now i'm just trying to figure out how to get it to move using lengthdir_x/yJust create a global var like player_angle since you will be referencing it a lot. You probably will want some wrap-around checks...
if player_angle > 360 then player_angle -= 360;
if player_angle < 0 then player_angle += 360;
Thank you! I will definitely use this on one of my future projects!I'll just dump this code here since it's obsolete to me, maybe you can find use of it.
here it is in use
Code:# create event: /// define variables // gravity g = 1; g_angle = 270; // gravity direction (down) // acceleration a = 1; a_angle = 180; // acceleration direction (normal to grav) // flags dir = 0; hv = 0; vv = 0;
Code:# step event // get inputs key_left =-keyboard_check( ord("A") ); key_right = keyboard_check( ord("D") ); // calculate the direction the for player inputs dir = key_left + key_right; g_angle = point_direction(mouse_x,mouse_y,x,y)-180; // fall towards mouse a_angle = g_angle + 90; image_angle = a_angle; // move left/right if ( dir == 0 ) { if ( hv != 0 ) { // slow down var pre_hv = hv; hv -= a * sign(hv); if ( sign(pre_hv) != sign(hv) ) hv = 0; } } else hv += a * dir; // gravity if ( vv < 20 ) vv += g; // change depending on angle var ha, va; // horiz acc angle, and verti acc angle ha = dcos( 360 - a_angle) * hv + dcos( 360 - g_angle) * vv; va = dsin( 360 - a_angle) * hv + dsin( 360 - g_angle) * vv; x += ha; y += va;
var angle = point_direction(player.x,player.y,mouse_x,mouse_y);
var radius = 10; // change this to the distance you want the object to orbit
var xx = dcos(angle) * radius;
var yy = dsin(angle) * radius;
gun.x = player.x+xx; // change gun.[] and player.[] to any variable you want to store the "orbiting"
gun.y = player.y+yy;
Awesome! it'll be cool to see what you come up with. ;o;Thank you! I will definitely use this on one of my future projects!
CREATE:
Orbit = 200; // Orbit distance
Angle = 0; // Current orbital angle
Speed = 1; // Orbital speed
Center_X = room_width / 2; // x of orbital center
Center_Y = room_height / 2; // y of orbital center
STEP:
// Orbital motion
if(keyboard_check(vk_left)){
Angle += Speed; // Orbit counterclockwise on left arrow
if(Angle >= 360) Angle -= 360; // Keep angle below 360
}
else if(keyboard_check(vk_right)){
Angle -= Speed; // Orbit clockwise on right arrow
if(Angle < 0) Angle += 360; // Keep angle at 0 or above
}
// Update position
x = lengthdir_x(Orbit, Angle) + Center_X;
y = lengthdir_y(Orbit, Angle) + Center_Y;
You got it!!! thanks, I'll mess around with it little and let you know if I run into anything else, Thank you soo much!!Well I answered a question about orbital movement in this thread, but to adapt the code to keyboard controls:
Code:CREATE: Orbit = 200; // Orbit distance Angle = 0; // Current orbital angle Speed = 1; // Orbital speed Center_X = room_width / 2; // x of orbital center Center_Y = room_height / 2; // y of orbital center STEP: // Orbital motion if(keyboard_check(vk_left)){ Angle += Speed; // Orbit counterclockwise on left arrow if(Angle >= 360) Angle -= 360; // Keep angle below 360 } else if(keyboard_check(vk_right)){ Angle -= Speed; // Orbit clockwise on right arrow if(Angle < 0) Angle += 360; // Keep angle at 0 or above } // Update position x = lengthdir_x(Orbit, Angle) + Center_X; y = lengthdir_y(Orbit, Angle) + Center_Y;