Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ ефект 'колобка'

Автор: mamont001 5.11.2006 3:07

кто нибудь скажите как сделать качение по поверхности+падение если земли нет.есть коефицент трения.если можно,то с кодом на tp7

Автор: Bokul 5.11.2006 3:15

mamont001, можешь как-то внятней описать проблему? Как это "качения по поверхности если земли нет"? И про знаки пунктуации, пожалуйста, тоже не забывай.

Автор: mamont001 5.11.2006 3:28

есть некоторый обект (пиксель) ,который после толчка катится по поверхности.Поверхность не является прямой линией,поетому пиксель падает вниз икатится дальше

Автор: Archon 5.11.2006 4:55

Как задана поверхность?

Лично я бы задал функцией 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 5.11.2006 7:35

Если я правильно понял задачу, то вот имитация для поверхности в виде прямой горки или для земли, при 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 5.11.2006 16:40

Конечно не совсем то что я хотел,но принцип понял