![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускорение свободного падения [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]что, не помог "точный таймер"?
может к советам из прошлой ветки прислушаешься все таки?