1. Hey! Guest! The 35th GMC Jam will take place between November 28th, 12:00 UTC - December 2nd, 12:00 UTC. Why not join in! Click here to find out more!
    Dismiss Notice
  2. Hello Guest! It's with a heavy heart that we must announce the removal of the Legacy GMC Archive. If you wish to save anything from it, now's the time! Please see this topic for more information.
    Dismiss Notice

GMS 2 Rotating dice in 2D

Discussion in 'Programming' started by Ragis, Sep 19, 2018.

  1. Ragis

    Ragis Member

    Feb 21, 2018
    So imagine a square moving on a grid, one tile at once, up, down, left or right. Easy enough.

    Except it's not a square, but a cube - or rather a die - each of its sides is different.
    When the die moves, it doesn't slide, but simply rolls to another of its sides.

    It sounds easy, but the die rotates in three axes, and I cannot figure out how to code that.
    For now, I just need it working for 6 side sprites, I'll take care of animations later.
    If someone could point me in the right direction I would be grateful
    Last edited: Sep 23, 2018
  2. ShubhamBansod

    ShubhamBansod Member

    Jun 20, 2016
    Assuming you are using GMS 1.4

    (1: Make a 3d model of dice with the texture of a dice on it!
    (2: Rotate the model using d3d functions,
    (3: Boom It looks real but you have to make some calculations to get the data which face is on top, by checking the values of the dices default angle angle angle after which stop!

    3d works on the 2d game look 2d,
    I have done that before for one of my clients I know that works :)
  3. TheouAegis

    TheouAegis Member

    Jul 3, 2016
    32 04 01 08

    Convert a d6 such that each face corresponds to a single bit as seen above. This conveniently means that for each face, the product of its value and that of its complement will equal 32: 1*32 = 32, 2*16 = 32, 4*8 = 32. So we should store these values in a global array for quick reference.

    ///Game Start Event
    for (var i=0; i<6; i++) {
    global.bits[ i ] = 1 << i;
    global.complement[ i ] = 32 >> i;

    When we roll the die, we need to pick a number to start on. It doesn't matter what it is, so we'll just pick a random value from 0 to 5. This will also be used to tell us what value the die will actually be when it stops rolling. We need to decide how long the die will roll, so we can pick a random range for that. We also need a measurement of how long it takes to roll from one side to the next. We also need to know if the die is on its edge or on a face.

    ///Die Create Event
    face = irandom(5);
    value = global.bits[face];
    rolls = irandom_range(4,16);
    spin = 4;
    alarm[0] = spin;
    edge = 0;

    ///Die Alarm 0 Event
    if !edge {
    edge = pow(2,irandom(5));
    while edge == global.complement[value] edge=pow(2,irandom(5));
    value |= global.bits[edge];
    else {
    value ^= global.bits[face];
    face = log2(value);
    spin += 16 - rolls;
    edge = 0;
    image_angle = irandom(7) * 45;
    alarm[0] = spin;
    image_index = value-1;

    You draw the sprite based on value-1. So if the value is 1, face 1 is shown. If the value is 2, face 2 is shown. If the value is 4, face 4 is shown. BUUUUUTTTT if the value is 3, then the edge between 1 and 2 would be shown. The image_angle is to make it look like it's bouncing.

    Edit: If you want more frames of animation, image_index would be (value-1) multiplied by the number of filler frames. If youbdid that, yhen the "spin" variable I used here would need to be a constant multiple of how many filler frames there are.
    Last edited: Sep 20, 2018
    dannyjenn likes this.
  4. Fabseven

    Fabseven Member

    Oct 7, 2016
    If you want a 2D DICE - not rotating its easier.
    Did it many times, you have to build a state machine ( states could be _start , _rolling , _wait , _end )
    In step event when stat = _start you will initialize values ( set if the dice is a 6 faces dices or more for examples, set the sprites, set the end timer and step_timer ) and set stat to _rolling , set alarm[0] = end_timer
    In step event when stat = _rolling you will change the value and so the sprite of your object each step_timer ( if( step_timer mod end_time == 0 ) then ....<use irandom_range to change dice value and sprite> ))
    In step event when stat = _rolling and alarm[0] <= 0 then chance set stat to _wait , set alarm[0] with the value you want
    In step event when stat = _wait and alarm[0] <= 0 then set stat to _end
    Same stat machine in draw or draw gui
  5. NeZvers

    NeZvers Member

    Mar 24, 2018
    If I'm understanding question right, you can simulate rotation with draw_sprite_pos()
    And simplest way that I could think at the moment is to have some kind ds or variables that store for information for each side's surrounding numbers, so in case of 1 you know that going up will give you 2. Or something like that.
  6. Ragis

    Ragis Member

    Feb 21, 2018
    Thanks for all the feedback guys, but I need something a bit different. I don't need the die to randomly rotate and generate random numbers. I need a die (or simply a cube) that moves like this (just in top-down view): https://cdn.dribbble.com/users/612275/screenshots/2997676/cube-rolling.gif
    The problem is that when you rotate a die like this, the sides rotate, so I cannot simply use a switch or an if statement that says "when it shows '1' and you go up, change to '3', and when you go down, change to '4'" cause if the cube is rotated 90 degrees, then when you go up from '1' it will be '5' and down will be '2' for example. So I need to take the die rotation (in all 3 axes) into account somehow.
  7. Death

    Death Member

    Aug 8, 2018
    Nah, just keep it simple. A die has six sides, BUT all opposite sides ALWAYS add up to seven. So you know when a 3 is showing (up) a four is on the bottom. A 2, a five, etc etc. The rest is is just deciding which face you want to make your "top" face, the one on the front, or the real top. Now all you have to consider are the 3 other face possibilities you need to show, a simple switch case thingy.
  8. GMWolf

    GMWolf aka fel666

    Jun 21, 2016
    just keep it simple:

    Keep a rotation matrix of the dice. Then you can use the left, right or up vector to determine what faces are facing in what direction.
    To rotate your dice, you just have to apply a rotation matrix to your current dice matrix. The math takes care of itself!
    If you are not familiar with transform matrices, go learn them now! They will make your game dev career sooo much easier!
    Ragis likes this.

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