Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускорение свободного падения [D7]


Света ©   (2013-08-05 17:50:00) 

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

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 должна меняться только частота перерисовки.


Sha   (2013-08-06 12:11:00) [1]


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.


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

обшибся :)

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;


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

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

как-то так
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:01:00) [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-05 21:22:00) [5]


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


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


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

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

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


sniknik   (2013-08-05 18:17:00) [7]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо