Я не эксперт в базовых коллизиях, но могу предложить варианты через код.
Суть в том, что у тебя он сталкивается и застревает в доске, постоянно обрабатывая коллизию. Возможно, есть более традиционные методы, но я бы предложил
либо делать некий таймер коллизии:
при столкновении, кроме изменения направления:
if !col_timer {
direction = point_direction(other.x,other.y,x,y);
col_timer = 2;
}
, в шаге
if col_timer col_timer--
Т.е. столкновение будет срабатывать раз в несколько шагов, что чревато при очень быстрой скорости и близких отскоках, может не успеть обнулиться. Двух шагов по идее достаточно, чтобы отскочить, но и не слишком много, но всё равно вариант имхо не лучший.
Либо, что надёжнее и правильнее, проверять столкновение ещё до самого столкновения, заранее отпихивая шарик от доски:
//board - объект доски
if collision_line( x, y, x + lengthdir_x( speed, direction ), y + lengthdir_y( speed, direction ), board, 0, 0 )
dir = point_direction( board.x, board.y, x, y );
x += lengthdir_x( speed, direction );
y += lengthdir_y( speed, direction );
Если нужна проверка только верхней грани, почитай про переменную
bbox_top, она отвечает за верхнюю грань столкновения. Либо, если опять же делать кодом, математически - можно упороться в уравнения прямых, находя через координаты (нынешние мяча, новые мяча (со смещением на скорость и направление), левый верхний и правый верхний края доски или стены) точку столкновения с поверхностью и рассчитывая зеркально отражённые координаты с сохранением импульса.
Да, я знаю, я упоролся.
Добавлено: Май 10, 2022, 10:35:43 При первом варианте не забудь заранее объявить col_timer
А при втором используй свою переменную скорости, а не встроенную, т.к. встроенная вроде как сама смещает шарик на speed, и будет двойное смещение.