¿Algún experto de Game Maker en la sala? Tampoco creo que sea necesario, mi problema es una tonteria minúscula pero que me trae de cabeza precisamente por eso, porque salvo que sea un bug de Game Maker deberían ser increiblemente facil de solucionar.
Os pongo en situación, estaba haciendo un ejemplo muy, muy simple de plataformas en Game Maker para mi hermano y quería evitar usar la variable gravity que ya viene por defecto en el programa, así como objetos solid, place_free y todo ese rollo. Todo funciona de puta madre, salvo un pequeño detalle: al chocar contra una pared, si es por la parte derecha va perfecto, pero desde la izquierda se come un pixel que parece no detectar la colisión. Un gif vale más que mil palabras:
Evento Create de oHero:
spoilermyGravity= 1;
mySpeed= 4;
speedJump= 12;
speedH = 0;
speedV= 0;
Evento Step de oHero (FÍSICAS):
spoilerKEY_LEFT = keyboard_check(vk_left) or keyboard_check(ord('A'));
KEY_RIGHT = keyboard_check(vk_right) or keyboard_check(ord('D'));
KEY_DOWN = keyboard_check(vk_down) or keyboard_check(ord('S'));
KEY_JUMP = keyboard_check(vk_up) or keyboard_check(ord('W'));
if (place_meeting(x, y + 1, oWall))
{
speedV = 0;
if (KEY_JUMP) speedV = -speedJump;
}
else
{
if (speedV < 10) speedV += myGravity;
}
if (KEY_RIGHT) speedH = mySpeed;
if (KEY_LEFT) speedH = -mySpeed;
if ((!KEY_LEFT and !KEY_RIGHT) or (KEY_LEFT and KEY_RIGHT)) speedH = 0;
// HORIZONTAL
if (place_meeting(x + speedH , y, oWall))
{
while(!place_meeting(x + sign(speedH), y, oWall))
{
x += sign(speedH);
}
speedH = 0;
}
x += speedH;
// VERTICAL
if (place_meeting(x, y + speedV, oWall))
{
while(!place_meeting(x, y + sign(speedV), oWall))
{
y += sign(speedV);
}
speedV = 0;
}
y += speedV;
Evento Step de oHero (SPRITES):
spoilerif (yprevious != y)
{
sprite_index = sHeroJumping;
mask_index = sHeroJumpingMask;
image_speed = 0;
image_index = (y > yprevious);
}
else
{
if (xprevious != x)
{
sprite_index = sHeroWalking;
mask_index = sHeroWalkingMask;
image_speed = 0.3;
}
else
{
if (KEY_DOWN)
{
sprite_index = sHeroDown;
mask_index = sHeroDownMask;
}
else
{
sprite_index = sHeroIdle;
mask_index = sHeroIdleMask;
}
}
}
if (speedH != 0) image_xscale = sign(speedH);
Como veis, el código no podría ser más simple. Uso Game Maker Studio (v1.4).
Estoy casi seguro de que tiene que ver con la linea de image_xscale = -1, principalmente porque si no volteo el sprite todo va bien. Pero las mascaras están centradas y tienen la misma anchura todas. ¿Acaso image_xscale modifica la máscara de colisión de alguna manera no esperable? Y si fuera asi, ¿hay alguna manera simple y efectiva de solucionarlo?