Ref erence
Ref erence

Reputation: 1

How to rotate my character while jumping (Gamemaker Studio 2)

I would like to make a simple animation of the character rotating itself when it jumps. I'm making an indie platformer so this should be simple to do, I think, but I'm too newbie for this. Here's the movement code.

//------------------------- MOVEMENT INPUT

xMove = kRight - kLeft;

xSpd = xMove * mSpd;
ySpd += 0.65;

//------------------------- JUMP

onGround = place_meeting(x,y+1,oSolid);

if(onGround) airJump = 1;
if(kJump){
    if(onGround or airJump > 0){
        ySpd = -12; 
        airJump = 0;
    }
}

//------------------------- FINAL MOVEMENT

if(place_meeting(x + xSpd, y, oSolid)){
    while(!place_meeting(x + sign(xSpd), y, oSolid)) x += sign(xSpd);
    xSpd = 0;
}

if(place_meeting(x + xSpd, y + ySpd, oSolid)){
    while(!place_meeting(x + xSpd, y + sign(ySpd), oSolid)) y += sign(ySpd);
    ySpd = 0;
}

x += xSpd;
y += ySpd;

if xSpd < 0 dir = -1;
if xSpd > 0 dir = 1;

The player is a simple square, so I would like to make it rotate 360 degrees while on the air.

Upvotes: 0

Views: 785

Answers (2)

KurtBlissZ
KurtBlissZ

Reputation: 36

For player movement collision handling you want to avoid using image_angle variable by using your own variable for the image rotation with the draw_sprite_ext function. Also by change you end up wanting to use the image angle for anything its good to wrap it mostly later if your trying to use fov and what not.

For example

function Scr_Player_Create(){
    image_offset = 0;
}

function Scr_Player_Step(){
    image_offset += (keyboard_check(vk_right) - keyboard_check(vk_left)) * 10;
    image_offset = wrap(image_offset, 0, 359);
}

function Scr_Player_Draw(){
    draw_sprite_ext( sprite_index, image_index, x, y, image_xscale, image_yscale, 
        image_angle + image_offset, image_blend, image_alpha );
        
    draw_text(10, 10, image_offset);
}

function wrap(wrap_value, wrap_minimum, wrap_maximum){
    // Credit: Juju from GMLscripts forums!
    var _mod = ( wrap_value - wrap_minimum ) mod ( wrap_maximum - wrap_minimum );
    if ( _mod < 0 ) return _mod + wrap_maximum else return _mod + wrap_minimum;
}

Another approach you could do to avoid image_angle effecting your collision is this

var _angle = image_angle;
image_angle += image_offset;
draw_self();
image_angle = _angle;

Upvotes: 1

Steven
Steven

Reputation: 2122

You should be able to use image_angle for this, changing the value will change the angle of the sprite, and continiously increasing/decreasing that value will simulate a rotation.

However, keep in mind that if you rotate the sprite, the hitbox of the sprite will rotate as well. You can probably set the hitbox apart from the sprite so it won't interrupt with each other.

Example: https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Asset_Management/Sprites/Sprite_Instance_Variables/image_angle.htm

Upvotes: 1

Related Questions