|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.05.2017, 01:06 | #1 |
Новичок
Джуниор
Регистрация: 16.05.2017
Сообщений: 1
|
Отталкивание шариков
Делаю хранитель экрана, где шарики (Shape) отталкиваются от стен и друг от друга. С отталкивание от стен проблем нет, но вот отталкивание друг от друга выглядит неестественно. Шарики отталкиваются от воздуха, иногда телепортируются и могут начать хаотично летать по всей форме. (http://i.imgur.com/0UsvWbs.gifv)
Код HTML:
for i := 0 to 7 do begin masPosX[i] := Random(500); masPosY[i] := Random(500); masVelX[i] := 2; masVelY[i] := 2; end; Код HTML:
procedure TForm1.shar;
var
i, h0, h1, k, count, fl, j: Cardinal;
a, b: extended;
p1, p2, p3, d1, d2, dist, bet, x1, x2, y1, y2: extended;
g, h, kk: integer;
begin
for i := 0 to 7 do
begin
masPosX[i] := masPosX[i] + masVelX[i];
masPosY[i] := masPosY[i] + masVelY[i];
if masPosX[i] > ClientWidth - Shp1.Width then
begin
masPosX[i] := ClientWidth - Shp1.Width;
masVelX[i] := -masVelX[i];
end
else if masPosX[i] < 0 then
begin
masPosX[i] := 0;
masVelX[i] := -masVelX[i];
end;
if masPosY[i] > ClientHeight - Shp1.Width then
begin
masPosY[i] := ClientHeight - Shp1.Width;
masVelY[i] := -masVelY[i];
end
else if masPosY[i] < 0 then
begin
masPosY[i] := 0;
masVelY[i] := -masVelY[i];
end;
end;
Shp1.Left := Round(masPosX[0]);
Shp1.Top := Round(masPosY[0]);
Shp2.Left := Round(masPosX[1]);
Shp2.Top := Round(masPosY[1]);
Shp3.Left := Round(masPosX[2]);
Shp3.Top := Round(masPosY[2]);
Shp4.Left := Round(masPosX[3]);
Shp4.Top := Round(masPosY[3]);
Shp5.Left := Round(masPosX[4]);
Shp5.Top := Round(masPosY[4]);
Shp6.Left := Round(masPosX[5]);
Shp6.Top := Round(masPosY[5]);
Shp7.Left := Round(masPosX[6]);
Shp7.Top := Round(masPosY[6]);
Shp8.Left := Round(masPosX[7]);
Shp8.Top := Round(masPosY[7]);
Код HTML:
for i := 0 to 7 do for j := 0 to 7 do if i <> j then begin a := MasPosX[i] - MasPosX[j]; b := MasPosY[i] - MasPosY[j]; dist := sqrt(sqr(a) + sqr(b)); if dist <= 65 then begin bet := arctan2(MasPosY[j] - MasPosY[i], MasPosX[j] - MasPosX[i]); x1 := masvelx[i] * cos(-bet) - MasVelY[i] * sin(-bet); y1 := MasVelX[i] * sin(-bet) + MasVelY[i] * cos(-bet); x2 := MasVelX[j] * cos(-bet) - MasVelY[j] * sin(-bet); y2 := MasVelX[j] * sin(-bet) + MasVelY[j] * cos(-bet); MasVelX[i] := x2 * cos(bet) - y1 * sin(bet); MasVelY[i] := x2 * sin(bet) + y1 * cos(bet); masVelX[j] := x1 * cos(bet) - y2 * sin(bet); MasVelY[j] := x1 * sin(bet) + y2 * cos(bet); kk := 1; while (dist <= 65) and (kk < 100) do begin inc(kk); a := MasPosX[i] - MasPosX[j]; b := MasPosY[i] - MasPosY[j]; dist := sqrt(sqr(a) + sqr(b)); MasPosX[i] := MasPosX[i] + MasVelX[i] * 0.1; MasPosY[i] := MasPosY[i] + MasVelY[i] * 0.1; MasPosX[j] := MasPosX[j] + MasVelY[j] * 0.1; MasPosY[j] := MasPosY[j] + MasVelY[j] * 0.1; end; end; end; |
16.05.2017, 01:17 | #2 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,648
|
Лучше рисовать шарики на битмапе и его выводить на форму. А причину надо в формулах искать, перепроверьте еще раз. Делал такую программу, только на C++ Builder, все отлично работало.
E-Mail: arigato.freelance@gmail.com
|
16.05.2017, 09:27 | #3 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
не учитываются РАЗМЕРЫ шариков.
столкновение это НИКОГДА не сближение их "верхних левых точек" (точнее верхней левой точки описанного квадрата) на заданную величину Цитата:
Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 16.05.2017 в 09:31. |
||
04.06.2017, 13:05 | #4 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Лучше регионами столкновение проверять так легче, для каждого шарика регион создавать вот к примеру эта тема
http://www.programmersforum.ru/showthread.php?t=280064 |
08.10.2017, 12:47 | #5 |
Форумчанин
Регистрация: 02.03.2013
Сообщений: 109
|
Автор, поищите уроки от Мерлина за 2006 год по флешу, там был пример физического взаимодействия шариков.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отталкивание кнопок в лазарусе(Pascal) | Firefox25 | Помощь студентам | 11 | 21.01.2016 13:19 |
Зарисовка шариков | HeLLiSH | Общие вопросы Delphi | 6 | 22.06.2012 10:10 |
массивы шариков | nexzis | Помощь студентам | 4 | 02.11.2010 17:34 |
Столкновение шариков в delphi | vladlen1993 | Помощь студентам | 4 | 08.10.2010 15:11 |
Расчет столкновения шариков. | belomorinka | Общие вопросы Delphi | 3 | 02.06.2009 18:54 |