GMS 2 How can I orbit an object around another?

Discussion in 'Programming' started by Sultown, Jan 10, 2020.

  1. Sultown

    Sultown Member

    Joined:
    Jan 10, 2020
    Posts:
    1
    I'm trying to make a game similar to One More Line but I cannot think of a solution to making it so when I click a button, it latches on to the stationary object and revolves around it with a fixed radius.

    I believe watching gameplay of or playing One More Line would help to understand my question. I'm doing this as programming practice by mimicking these styles of games.

    Thanks :)
     
  2. Sabnock

    Sabnock Member

    Joined:
    Jul 21, 2016
    Posts:
    344
    i would do it using cos() && sin()

    x = o_orbited_obj.x + radius * cos(angle);
    y = o_orbited_obj.y + radius * sin(angle);

    but there are other ways of doing it
     
    Cupid Stunt likes this.
  3. NightFrost

    NightFrost Member

    Joined:
    Jun 24, 2016
    Posts:
    2,049
    You could also use lengthdir_x and lengthdir_y but those are basically just wrappers for the above trigonometry math for those who haven't wrapped (ha ha) their heads around this use of trig yet.
     
    Sabnock likes this.
  4. Sabnock

    Sabnock Member

    Joined:
    Jul 21, 2016
    Posts:
    344
    sorry, i should have mentioned that the "angle" is in radians but you can use dcos() and dsin() if you want to work with degrees

    you might need to invert the sin() to get the desired result i.e -dsin(angle);
     
    Cupid Stunt likes this.
  5. Joe Ellis

    Joe Ellis Member

    Joined:
    Aug 30, 2016
    Posts:
    1,036
    I prefer using lengthdir_x & y, just cus I forget which axis cos and sin is for, but I also found that lengthdir is slightly faster than multiplying radius * cos\sin(angle), so that was a deal maker for me. It's the same with point_distance, and dot_product, they're about 3 times faster than doing them manually
     
  6. Sabnock

    Sabnock Member

    Joined:
    Jul 21, 2016
    Posts:
    344
    cos() deals with the x axis and sin() the y axis.

    Lengthdir_x & y are perfectly legitimate ways of doing as well. not measured the speed of operation though. Are you able to put some figures to that?
     
    Last edited: Jan 12, 2020 at 9:42 AM
    Cupid Stunt likes this.
  7. Joe Ellis

    Joe Ellis Member

    Joined:
    Aug 30, 2016
    Posts:
    1,036
    I just ran 3 different tests: but the results are actually quite different for each one so I can't be sure. Although 2/3 tests showed that the radius * dcos(angle) is slightly faster. Test 1 is the test I normally use, and that's the one where lengthdir is faster, but I think the other 2 tests are more accuate\reliable ways of testing, as they're not hindered by the script_execute

    Code:
    var start_time = get_timer(), reps = 0;
    
    while get_timer() - start_time < 15000
    {
    script_execute(script, random(500), random(360))
    ++reps
    }
    
    if script = scr_lengthdir
    {
    total_reps_lengthdir = reps
    average_reps_lengthdir = reps / ++num_steps_lengthdir
    script = scr_dcos
    }
    else
    {
    script = scr_lengthdir
    total_reps_dcos = reps
    average_reps_dcos = reps / ++num_steps_dcos
    }
    Here the average amount of reps each can do per step was roughly:

    lengthdir: 19200
    dcos: 18700

    Lengthdir can do around 500 more reps step than radius * dcos(angle) or dsin(angle).

    Code:
    var start_time = get_timer(), reps = 0, val;
    
    if script = "lengthdir"
    {
    while get_timer() - start_time < 15000
    {
    val = lengthdir_x(random(500), random(360))
    ++reps
    }
    total_reps_lengthdir += reps
    average_reps_lengthdir = total_reps_lengthdir / ++num_steps_lengthdir
    script = "dcos"
    }
    else
    {
    while get_timer() - start_time < 15000
    {
    val = random(500) * dcos(random(360))
    ++reps
    }
    total_reps_dcos += reps
    average_reps_dcos = total_reps_dcos / ++num_steps_dcos
    script = "lengthdir"
    }
    Here the dcos method could do around 200 more reps per step on average

    Code:
    var start_time = get_timer(), reps = 0, val;
    
    while get_timer() - start_time < 15000
    {
    val = lengthdir_x(random(500), random(360))
    //val = random(500) * dcos(random(360))
    ++reps
    }
    total_reps += reps
    average_reps = total_reps / ++num_steps
    Here I switched between the two commenting and uncommenting each one, and here the dcos method could do around 150 more reps per step average.
     
  8. Sabnock

    Sabnock Member

    Joined:
    Jul 21, 2016
    Posts:
    344
    very nice.

    What about just using sin() and cos() as dcos() and dsin() will have to convert degrees back to radians and back again to degrees at a guess?
     
  9. Sabnock

    Sabnock Member

    Joined:
    Jul 21, 2016
    Posts:
    344
    did you write this code yourself?
     
  10. Joe Ellis

    Joe Ellis Member

    Joined:
    Aug 30, 2016
    Posts:
    1,036
    Yeah, I've been using this way of speed testing for a few years now, I used to use: repeat(n) {script_execute(script)} and measure the average fps_real, then I thought of seeing how many times each operation could be run per step before lag occurs as I thought it would be more accurate, so I increased repeat "n" until the fps_real drops below 60, then I realized you can do this with the get_timer() function.

    I just tested cos vs dcos, and lengthdir: (using test3 and left each one running for 1 minute)

    reps in 1 minute:
    cos: 99749843
    dcos: 96483938
    lengthdir_x: 96502303

    average reps per second:
    cos: 1662497
    dcos: 1608065
    lengthdir_x: 1608371

    average reps per step:
    cos: 27708
    dcos: 26801
    lengthdir_x: 26806

    So there seems to be virtually no difference between lengthdir and dcos, but 900 extra reps per step with cos,
    so I guess if you use the same angle over and over with dcos or lengthdir, pre calculating the radians for it could be alot quicker.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice