Здравствуйте! Делаю игру, где персонаж следует за мышью. Нужно, чтобы при горизонтальном столкновении со стеной x не менялся в сторону стены, а y мог-бы спокойно меняться, чтобы объект не застрявал, что и происходит. То-же самое и при вертикальном столкновении, только x и y меняются местами. Надеюсь, вы поймете проблему увеличь популярность своего проекта/канала YouTube/странички вк: FREE Social Promotion
Шаг навстречу точки со скольжением вдоль указанного типа объектов. Скользит лишь "прямо" по осям так как скольжение и так реализуется проблематично.
/// step_towards_gliding(x, y, speed, object) vartx, ty, ms, oi; tx = argument0; // target X ty = argument1; // target Y ms = argument2; // movement speed (pixels) oi = argument3; // object to avoid // write down the original coordinates and difference: vardx, dy, ox, oy; ox = x; oy = y; dx = tx - ox; dy = ty - oy; // if the distance is above the movement speed, // normalize the "difference" variables: vardd; dd = dx * dx + dy * dy; if (dd > ms * ms) { dd = ms / sqrt(dd); dx *= dd; dy *= dd; } // find the new coordinates: varnx, ny; nx = ox + dx; ny = oy + dy; // an easy case?: if (!place_meeting(nx, ny, oi)) { x = nx; y = ny; returntrue; } // okay, let's try stepping towards it: varax, ay, sx, sy; ax = abs(dx); sx = sign(dx); ay = abs(dy); sy = sign(dy); vari; nx = round(ox); ny = round(oy); if (ax > ay) { while (ax || ay) { if (ax && !place_meeting(nx + sx, ny, oi)) nx += sx; ax -= 1; if (ay && !place_meeting(nx, ny + sy, oi)) ny += sy; ay -= 1; } } else { while (ax || ay) { if (ay && !place_meeting(nx, ny + sy, oi)) ny += sy; ay -= 1; if (ax && !place_meeting(nx + sx, ny, oi)) nx += sx; ax -= 1; } } x = nx; y = ny; returntrue;
В зависимости от ситуации, может быть проще извратиться с box2d.