Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 11:04   #31
belomorinka
Пользователь
 
Регистрация: 11.05.2009
Сообщений: 15
По умолчанию

Вот расчет моего столкновения. Иногда шары слипаются. Не понимаю, в чем дело.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i,j: integer;
  tmp1: single;
  tmp2: single;
begin
for i:=1 to MaxBalls do
begin
  ball := balls[i];
  ball.lx:=ball.x;
  ball.ly:=ball.y; //предыдущие координаты (для отката, чтобы не сцепились)


    if ((ball.x<=ball.size) or (ball.x >= (PaintBox1.Width-ball.size))) then
    begin
      ball.nx := -ball.nx;
      if(ball.x<=ball.size) then
        ball.x := ball.x +5 else
        ball.x := ball.x -5;
      end;

    if ((ball.y<=ball.size) or (ball.y >= (PaintBox1.Height-ball.size))) then
    begin
      ball.ny := -ball.ny;
      if(ball.y<=ball.size) then
        ball.y := ball.y +5 else
        ball.y := ball.y -5;
      end;


  //столкновение шаров
    try begin
    for j:=1 to Maxballs do begin
    if i=j then continue;
    if (abs(balls[j].x-ball.x)<abs(balls[j].size+ball.size))and
            (abs(balls[j].y-ball.y)<abs(balls[j].size+ball.size))
    then
    begin
    ball.x:=ball.lx; //откат шара на шаг назад
    ball.y:=ball.ly;
    begin
         tmp1 := balls[j].size*balls[j].nx/ball.size;
         tmp2 := ball.size*ball.nx/balls[j].size;
         ball.nx := tmp1;
         balls[j].nx := tmp2;

         tmp1 := balls[j].size*balls[j].ny/ball.size;
         tmp2 := ball.size*ball.ny/balls[j].size;
         ball.ny := tmp1;
         balls[j].ny := tmp2;


       ball.x := ball.x + ball.nx;
       ball.y := ball.y + ball.ny;
       balls[j].x := balls[j].x + balls[j].nx;
       balls[j].y := balls[j].y + balls[j].ny;
    end;
    end;
    end;
   ball.x := ball.x + ball.nx;
   ball.y := ball.y + ball.ny;
   ball.ny := ball.ny + ball.ay;
   ball.nx := ball.nx + ball.ax;
   balls[i]:=ball;
end;
except
on EZeroDivide do ;
on EInvalidOp do end;
DrawBalls;
end;
end;
belomorinka вне форума Ответить с цитированием
Старый 07.03.2010, 22:30   #32
b0s1kb0s1k
Новичок
Джуниор
 
Регистрация: 07.03.2010
Сообщений: 1
По умолчанию

...........

Последний раз редактировалось b0s1kb0s1k; 08.03.2010 в 15:21.
b0s1kb0s1k вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арканоид Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 03.04.2021 21:50
Помогите с задачей на Делфи! f1n!Sh Помощь студентам 8 02.05.2008 18:28