Показать сообщение отдельно
  #15  
Старый 13.09.2012, 14:21
Shpingalet Shpingalet вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 13
Репутация: 10
По умолчанию

Исправил все ошибки предыдущей версии программы, но добавилась другая . Полностью переделал расчет столкновений и привел его к той идее, что идет проверка на пересечение траектории полета шарика с границей блока в момент их столкновения. В принципе, уже можно играться, но когда шарик попадает между блоков (т.е. задевает сразу 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;
Вложения
Тип файла: rar arcanoid.rar (226.5 Кбайт, 37 просмотров)
Ответить с цитированием