Помощь - Поиск - Пользователи - Календарь
Полная версия: ефект 'колобка'
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
mamont001
кто нибудь скажите как сделать качение по поверхности+падение если земли нет.есть коефицент трения.если можно,то с кодом на tp7
Bokul
mamont001, можешь как-то внятней описать проблему? Как это "качения по поверхности если земли нет"? И про знаки пунктуации, пожалуйста, тоже не забывай.
mamont001
есть некоторый обект (пиксель) ,который после толчка катится по поверхности.Поверхность не является прямой линией,поетому пиксель падает вниз икатится дальше
Archon
Как задана поверхность?

Лично я бы задал функцией y=f(x). Тогда f'(x) = tg(alpha) - тангенс угла наклона касательной в данной точке поверхности. C его помощью находим направленную вдоль этой касательной составляющую силы тяжести. Отсюда ускорение.

Теперь практика:
1. Вместо силы тяжести сразу берём ускорение свободного падения. Не в м/с, а в пикселах в секунду, сколько понравится.

2. alpha=arctg(f'(x))
a=sin(alpha)*g
a_x=cos(alpha)*a
a_y=sin(alpha)*a
Где a - ускорение, направленное по касательной к поверхности;
a_x, a_y - горизонтальная и вертикальная составляющие ускорения

3. a_y считать не надо, т. к. y мы уже знаем (y = f(x)).

4. Для ускорения вычислений можно в двух массивах хранить заранее расчитанные для каждого x значения f(x) и a_x(x).
Bokul
Если я правильно понял задачу, то вот имитация для поверхности в виде прямой горки или для земли, при l=0, или же для падения, при l=90.

uses crt, graph;
{ $define text}// убери пробел перед "$" для текстового вывода
{ $define graph}// убери пробел перед "$" для графической имитации
const
v0=100; //начальная скорость
g=10; // сила тяжести
k=0.2; //коэффициент трения
l=40; //угол подъёма горки
radius=8; //радиус шарика
xb=0; //начальное положения шарика
yb=0;
shag=0.05; //квант времени, за объяснениям - http://forum.pascal.net.ru/index.php?showtopic=12821
var
r,x,y,v,a:double;

function rad(q:real):real;
begin
rad:=q/360*2*pi;
end;

procedure calculation(t:real);
begin
if v>0 then
a:=g*(-cos(rad(l))*k-sin(rad(l)))
else
a:=g*(cos(rad(l))*k-sin(rad(l)));

v:=v+a*shag;
r:=r+v*shag;
x:=xb+cos(rad(l))*r;
y:=yb+sin(rad(l))*r;
end;

procedure show;
begin
setcolor(red);
circle(trunc(x),trunc(480-y),radius);
end;

procedure hide;
begin
setcolor(black);
circle(trunc(x),trunc(480-y),radius);
end;

var t:real;
grDriver : Integer;
grMode : Integer;
Begin
{$ifdef graph}
grDriver:=Detect;
InitGraph(grDriver, grMode, '');
{$endif}
t:=0;
v:=v0;
r:=0;
while not keypressed do
begin
t:=t+shag;
calculation(t);
{$ifdef graph}
show;
delay(1);
hide;
{$else}
writeln('x = ',x+xb:0:2);
writeln('y = ',y+yb:0:2);
writeln('a = ',a:0:2);
writeln('v = ',v:0:2);
writeln('t = ',t:0:2);
delay(50);
clrscr;
{$endif}

end;
end.


mamont001
Конечно не совсем то что я хотел,но принцип понял
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.