Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.05.25;
Скачать: CL | DM;

Вниз

Ускорение свободного падения   Найти похожие ветки 

 
Света   (2013-08-05 17:50) [0]

полный код модуля

unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, mmsystem;

type
 TMainForm = class(TForm)
   Shape: TShape;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   MMTimer: Integer;
   INTERVAL_MS: Integer;
   H: Double;
   SH,GSH: Double;
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure MyTimerCallBackProg(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
 MainForm.GSH := MainForm.GSH + MainForm.SH;
 MainForm.Shape.Top := MainForm.Shape.Top + Trunc(MainForm.GSH);

 if(MainForm.Shape.Top+MainForm.Shape.Height+100 > MainForm.ClientHeight) then
 MainForm.GSH := -MainForm.GSH;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 DoubleBuffered := True;
 INTERVAL_MS := 100;
 //INTERVAL_MS := 50;
 //INTERVAL_MS := 10;
 H := 9.8;
 GSH := 0;
 SH := H/(1000/INTERVAL_MS); {пикселей в м/cек}
 MMTimer := timeSetEvent(INTERVAL_MS,1,@MyTimerCallBackProg,100,1);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 timeKillEvent(MMTimer);
end;

end.


Вопрос: почему при разных INTERVAL_MS разная скорость, если SH := H/(1000/INTERVAL_MS); должна уравнивать ее.

при разных INTERVAL_MS должна меняться только частота перерисовки.


 
sniknik ©   (2013-08-05 18:17) [1]

что, не помог "точный таймер"?

может к советам из прошлой ветки прислушаешься все таки?


 
Света   (2013-08-05 18:21) [2]

Помог,
>>может к советам из прошлой ветки прислушаешься все таки?

Вопрос совершенно другой.


 
Сергей М. ©   (2013-08-05 21:22) [3]


> Света   (05.08.13 18:21) [2]


Обращения из дополнительных потоков к визуальным VCL-контролам, в частности и в первую очередь безоконным, не допустимы.


 
[ВладОшин] ©   (2013-08-06 00:01) [4]


> Вопрос: почему при разных INTERVAL_MS разная скорость



> SH := H/(1000/INTERVAL_MS); {


> MainForm.GSH := MainForm.GSH + MainForm.SH;
>  MainForm.Shape.Top := MainForm.Shape.Top + Trunc(MainForm.
> GSH);


 
[ВладОшин] ©   (2013-08-06 00:14) [5]

с увеличением времени увеличивается скорость
с увеличением скорости увеличивается пройденный путь за единицу времени

как-то так
var
 Form1: TForm1;
 dV: Double = 0;
 G: Double = 9.8;
 L: Double = 0;
 T: Double = 0;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 dV := dV + G*Timer1.Interval/1000;
 L := L + dV*Timer1.Interval/1000;
 Shape1.Top := Shape1.Top + Round(L);
end;


 
[ВладОшин] ©   (2013-08-06 00:37) [6]

обшибся :)

var
 Form1: TForm1;
 dV: Double = 0;
 G: Double = 9.8;
 L: Double = 0;
 T: Double = 0;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
 M: TLabel;
begin
 Timer1.Enabled := False;
 T := T + Timer1.Interval/1000;
 dV := dV + G*Timer1.Interval/1000;
 L :=  dV*T;
 Shape1.Top := Shape1.Top + Round(L);
 M := TLabel.Create(Self);
 M.Top := Shape1.Top;
 M.Caption := Format("%f sec - %f meter",[T, L]);
 InsertControl(M);
 Application.ProcessMessages;
 Sleep(100);
 RemoveControl(M);
 FreeAndNil(M);
 Timer1.Enabled := True;
end;


 
Sha ©   (2013-08-06 12:11) [7]


unit gt22Form;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, AppEvnts, ExtCtrls;

type
 TForm1 = class(TForm)
   Shape1: TShape;
   ApplicationEvents1: TApplicationEvents;
   CheckBox1: TCheckBox;
   procedure FormCreate(Sender: TObject);
   procedure CheckBox1Click(Sender: TObject);
   procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
 private
   Start: integer;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin;
 Shape1.Top:=0;
 end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin;
 if CheckBox1.Checked then begin;
   Shape1.Top:=0;
   Self.Start:=GetTickCount;
   end;
 end;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
const
 g=9.8;
var
 tick, delta, path: integer;
begin;
 Done:=not CheckBox1.Checked;
 if not Done then begin;
   tick:=GetTickCount;
   delta:=tick-Self.Start;
   path:=Trunc(g*delta*delta/2/4000);
   if path>=Self.ClientHeight-Shape1.Height then begin;
     Self.Start:=tick;
     path:=0;
     end;
   Shape1.Top:=path;
   end;
 end;

end.



Страницы: 1 вся ветка

Текущий архив: 2014.05.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1384806604
Юрий
2013-11-19 00:30
2014.05.25
С днем рождения ! 19 ноября 2013 вторник


15-1384939416
Nil
2013-11-20 13:23
2014.05.25
Работа с SQLite


15-1384765946
KeyMouse
2013-11-18 13:12
2014.05.25
KVM бывают разные?


15-1384870709
Dr.Wolf
2013-11-19 18:18
2014.05.25
Поиск стихотворения


2-1375632164
NewOne
2013-08-04 20:02
2014.05.25
Проверка на существование