Форум: "Начинающим";
Текущий архив: 2014.05.25;
Скачать: [xml.tar.bz2];
ВнизУскорение свободного падения Найти похожие ветки
← →
Света (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c