Исправил все ошибки предыдущей версии программы, но добавилась другая
. Полностью переделал расчет столкновений и привел его к той идее, что идет проверка на пересечение траектории полета шарика с границей блока в момент их столкновения. В принципе, уже можно играться, но когда шарик попадает между блоков (т.е. задевает сразу 2), то он не верно меняет вектор полета. В этом можно убедиться, поиграв хоть полминуты.
Если у кого-либо есть желание, просьба подсказать что в этом условии не так? (vector - угол полета шарика в градусах)
Код:
if Sprite is TBallSprite then // шарик 10х10, блок 60х18
if collisionline(x1+5,x2+5,x,x+60,y1,y2,y+18,y+18) then //x1,y1 - положение спрайта шарика до столкновения
vector:=360-vector else //x2,y2 - положение спрайта шарика после столкновения
if collisionline(x1+5,x2+5,x,x+60,y1+10,y2+10,y,y) then
begin
if vector<=180 then
vector:=180-vector else
vector:=360-vector;
end else
begin
if vector<=180 then
vector:=180-vector else
vector:=540-vector;
end;
dead;
end;
Функция проверки пересечения линий:
Код:
function CollisionLine(x1,x2,x3,x4,y1,y2,y3,y4:extended):boolean;
var v1,v2,v3,v4:double;
begin
v1:=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
v2:=(x4-x3)*(y2-y3)-(y4-y3)*(x2-x3);
v3:=(x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
v4:=(x2-x1)*(y4-y1)-(y2-y1)*(x4-x1);
CollisionLine:=(v1*v2<0) and (v3*v4<0);
end;