Na events od forme nisam nasao OnIdle event? Nema ga!
Video igre u Delphiu?
Zaključano
Zakačeno
OnIdle je event aplikacije, a ne forme.
Evo... nemam instaliran Delphi, ali mozes da upotrebis ovaj kod koji sam napisao u Lazarus-u:
Evo... nemam instaliran Delphi, ali mozes da upotrebis ovaj kod koji sam napisao u Lazarus-u:
Code:
unit MainUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TVector2D }
TVector2D = record
X, Y: Double;
end;
{ TfrmMain }
TfrmMain = class(TForm)
shpCircle: TShape;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: char);
private
{ private declarations }
Position2D: TVector2D;
Speed2D: TVector2D;
LastTime: Int64;
procedure AppIdle(Sender: TObject; var Done: Boolean);
procedure RenderScene(DeltaTime: Double);
public
{ public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses
dos;
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Position2D.X := ClientWidth / 2;
Position2D.Y := ClientHeight / 2;
Speed2D.X := Random(100) + 100;
Speed2D.Y := Random(100) + 100;
LastTime := GetMsCount;
Application.OnIdle := @AppIdle;
end;
procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: char);
begin
if Key = #27 then
Application.Terminate;
end;
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end;
procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
begin
Position2D.X := ClientWidth - shpCircle.Width / 2;
Speed2D.X := -Random(100) - 100;
end;
if Position2D.X < (shpCircle.Width / 2) then
begin
Position2D.X := shpCircle.Width / 2;
Speed2D.X := Random(100) + 100;
end;
if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
begin
Position2D.Y := ClientHeight - shpCircle.Height / 2;
Speed2D.Y := -Random(100) - 100;
end;
if Position2D.Y < (shpCircle.Height / 2) then
begin
Position2D.Y := shpCircle.Height / 2;
Speed2D.Y := Random(100) + 100;
end;
shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;
initialization
{$I mainunit.lrs}
end.
unit MainUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TVector2D }
TVector2D = record
X, Y: Double;
end;
{ TfrmMain }
TfrmMain = class(TForm)
shpCircle: TShape;
procedure FormCreate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: char);
private
{ private declarations }
Position2D: TVector2D;
Speed2D: TVector2D;
LastTime: Int64;
procedure AppIdle(Sender: TObject; var Done: Boolean);
procedure RenderScene(DeltaTime: Double);
public
{ public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses
dos;
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Position2D.X := ClientWidth / 2;
Position2D.Y := ClientHeight / 2;
Speed2D.X := Random(100) + 100;
Speed2D.Y := Random(100) + 100;
LastTime := GetMsCount;
Application.OnIdle := @AppIdle;
end;
procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: char);
begin
if Key = #27 then
Application.Terminate;
end;
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end;
procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
begin
Position2D.X := ClientWidth - shpCircle.Width / 2;
Speed2D.X := -Random(100) - 100;
end;
if Position2D.X < (shpCircle.Width / 2) then
begin
Position2D.X := shpCircle.Width / 2;
Speed2D.X := Random(100) + 100;
end;
if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
begin
Position2D.Y := ClientHeight - shpCircle.Height / 2;
Speed2D.Y := -Random(100) - 100;
end;
if Position2D.Y < (shpCircle.Height / 2) then
begin
Position2D.Y := shpCircle.Height / 2;
Speed2D.Y := Random(100) + 100;
end;
shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;
initialization
{$I mainunit.lrs}
end.
Potpis
Bravo Srki Care!!!!
Hvala ti na kodu!
Samo jedno pitanje kako meni treba da izgleda interfejs i imena komponenti da bi se slagao sa kodom?
Kod mi nije bas najjasniji to ti moram priznati-ja na Delphiu radim tek 3 meseca.
Koliko sam ja shvatio radi se o pomeranju nekog kruga (ispravi me ako gresim).
Tvoj Kod je za mene babaroga!!
Pogledaj moj kod (cisto radi uporedjivanja) za kretanje i sudaranje crvenog objekta sa republickog takmicenja!
Hvala na trudu i pisanju koda!
Hvala ti na kodu!
Samo jedno pitanje kako meni treba da izgleda interfejs i imena komponenti da bi se slagao sa kodom?
Kod mi nije bas najjasniji to ti moram priznati-ja na Delphiu radim tek 3 meseca.
Koliko sam ja shvatio radi se o pomeranju nekog kruga (ispravi me ako gresim).
Tvoj Kod je za mene babaroga!!
Pogledaj moj kod (cisto radi uporedjivanja) za kretanje i sudaranje crvenog objekta sa republickog takmicenja!
Code:
procedure TForm1.TredTimer(Sender: TObject);
begin
if game_=true then
begin
if Sdole1=true then
begin
if Fred1.Top <512 then Fred1.Top:=Fred1.Top+1
else Sdole1:=false;
end
else
begin
if Fred1.Top >416 then Fred1.top:=Fred1.Top-1
else Sdole1:=true;
end;
if fred1.visible=true then
begin
if (bl1.left+25>Fred1.left) and (bl1.left<Fred1.left+Fred1.Width) and
(bl1.Top+25>Fred1.Top) and (bl1.top<Fred1.Top+Fred1.Height) then
begin
bl1.Left:=832;
bl1.Top:=16;
live:=live-1;
bl2.Left:=832;
bl3.Left:=832;
bl2.Top:=16;
bl3.Top:=16;
bl4.Left:=832;
bl4.Top:=16;
end;
end;
procedure TForm1.TredTimer(Sender: TObject);
begin
if game_=true then
begin
if Sdole1=true then
begin
if Fred1.Top <512 then Fred1.Top:=Fred1.Top+1
else Sdole1:=false;
end
else
begin
if Fred1.Top >416 then Fred1.top:=Fred1.Top-1
else Sdole1:=true;
end;
if fred1.visible=true then
begin
if (bl1.left+25>Fred1.left) and (bl1.left<Fred1.left+Fred1.Width) and
(bl1.Top+25>Fred1.Top) and (bl1.top<Fred1.Top+Fred1.Height) then
begin
bl1.Left:=832;
bl1.Top:=16;
live:=live-1;
bl2.Left:=832;
bl3.Left:=832;
bl2.Top:=16;
bl3.Top:=16;
bl4.Left:=832;
bl4.Top:=16;
end;
end;
Hvala na trudu i pisanju koda!
Srki jos jednom hvala za kod!
Hvala vam svima na pomoci evo napravio sam jedan mali demo igre i uspeo sam da namestim da se tenkic krece na arowkeys preko virtual coda i uspeo sam da namestim i da puca.
Resio sam seckanje tako sto sam ispod stavio panel.
Samo ima jedan problem.
Kada se tenk krece i kada pritisne space i ispali metak onda zastane pa onda mora ponovo da se klikne taster da bi se ponovo kretao.
Kako vam se cini?
Hvala vam svima na pomoci evo napravio sam jedan mali demo igre i uspeo sam da namestim da se tenkic krece na arowkeys preko virtual coda i uspeo sam da namestim i da puca.
Resio sam seckanje tako sto sam ispod stavio panel.
Samo ima jedan problem.
Kada se tenk krece i kada pritisne space i ispali metak onda zastane pa onda mora ponovo da se klikne taster da bi se ponovo kretao.
Kako vam se cini?
Treba da imas formu i na njoj jedan TShape objekat koji se zove shpCircle. Velicine i pozicoje forme i shpCircle uopste nisu bitne, program ce sam da se pobrine za sve. U Delphi-u jedino ne treba da koristis dos unit, a umesto GetMsCount koristi GetTickCount. Delphi ce sam ukljuciti sve unit-e koji su mu potrebni za kompajliranje programa.
Reci sta ti nije jasno pa cu probati da ti objasnim... kod bi trebalo da je bas jako jednostavan.
Reci sta ti nije jasno pa cu probati da ti objasnim... kod bi trebalo da je bas jako jednostavan.
Potpis
Izvini sto te gnjavim Srki i hvala ti sto hoces da mi objasnis tvoj code.
Mislim da si primetio da ti ovde imas posla sa pocetnikom!
Evo ovaj deo mi uopste nije jasan?
Hvala na saradnji!
Jesi li pogledao onaj fajl "Pucanje" u mojoj prosloj poruci Jer bi znao kako da resis onaj problem sto tenk uvek zastane kad puca?
Thank's for your Help!
Mislim da si primetio da ti ovde imas posla sa pocetnikom!
Evo ovaj deo mi uopste nije jasan?
Hvala na saradnji!
Code:
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end
Jesi li pogledao onaj fajl "Pucanje" u mojoj prosloj poruci Jer bi znao kako da resis onaj problem sto tenk uvek zastane kad puca?
Thank's for your Help!
Nakuckah ovo nabrzaka na poslu pa vidi kako ide. Kad se vratim kuci, objasnicu ti deo koda koji ti nije jasan.
BTW: program je radjen u Lazarusu, ali ga je lako prevesti na Delphi.
BTW: program je radjen u Lazarusu, ali ga je lako prevesti na Delphi.
Potpis
Citat:
Jesi li pogledao onaj fajl "Pucanje" u mojoj prosloj poruci Jer bi znao kako da resis onaj problem sto tenk uvek zastane kad puca?
Ako zelis da ti neko pomogne oko problema na koji si naisao, izvrsni fajl nista ili vrlo malo znaci onome ko trazi gde si pogresio. Postuj kod programa kao sto ja radim i onda mozemo da vidimo sta radis pogresno.
Code:
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end;
procedure TfrmMain.AppIdle(Sender: TObject; var Done: Boolean);
var
NewTime: Int64;
begin
NewTime := GetMsCount;
RenderScene((NewTime - LastTime) / 1000);
LastTime := NewTime;
Done := False;
end;
Ovako... na pocetku programa u LastTime uzimamo vreme u milisekundama koje cemo koristiti za racunanje proteklog vremena prilikom iscrtavanja. Svaki put kada se pozove AppIdle funkcija uzimamo novo vreme u milisekundama, zatim racunamo razliku izmedju vremena koje smo ranije uzeli i ovog novog. Posto su vremena u milisekundama, kada ih podelimo sa 1000 dobijemo vreme u sekundama. Pozivamo funkciju RenderScene i kao parametar joj dajemo vreme u sekundama koje je proslo od kad smo je poslednji put zvali tako da zna koliko treba da pomeri objekte. Na kraju u LastTime ubacujemo novo vreme jer je sada ono vec staro :)
Nadam se da je bilo jasno.
Potpis
Jasno hvala ti.
Code cu ti poslati kada dodjem kuci!
Ovde ga trenutno nemam!
Sta radi RenderScene?
Code cu ti poslati kada dodjem kuci!
Ovde ga trenutno nemam!
Sta radi RenderScene?
Pise u kodu sta radi 
Pomera shpCircle... samo to i nista vise
Code:
procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
begin
Position2D.X := ClientWidth - shpCircle.Width / 2;
Speed2D.X := -Random(100) - 100;
end;
if Position2D.X < (shpCircle.Width / 2) then
begin
Position2D.X := shpCircle.Width / 2;
Speed2D.X := Random(100) + 100;
end;
if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
begin
Position2D.Y := ClientHeight - shpCircle.Height / 2;
Speed2D.Y := -Random(100) - 100;
end;
if Position2D.Y < (shpCircle.Height / 2) then
begin
Position2D.Y := shpCircle.Height / 2;
Speed2D.Y := Random(100) + 100;
end;
shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;
procedure TfrmMain.RenderScene(DeltaTime: Double);
begin
Position2D.X := Position2D.X + Speed2D.X * DeltaTime;
Position2D.Y := Position2D.Y + Speed2D.Y * DeltaTime;
if Position2D.X > (ClientWidth - shpCircle.Width / 2) then
begin
Position2D.X := ClientWidth - shpCircle.Width / 2;
Speed2D.X := -Random(100) - 100;
end;
if Position2D.X < (shpCircle.Width / 2) then
begin
Position2D.X := shpCircle.Width / 2;
Speed2D.X := Random(100) + 100;
end;
if Position2D.Y > (ClientHeight - shpCircle.Height / 2) then
begin
Position2D.Y := ClientHeight - shpCircle.Height / 2;
Speed2D.Y := -Random(100) - 100;
end;
if Position2D.Y < (shpCircle.Height / 2) then
begin
Position2D.Y := shpCircle.Height / 2;
Speed2D.Y := Random(100) + 100;
end;
shpCircle.Left := Trunc(Position2D.X - shpCircle.Width / 2);
shpCircle.Top := Trunc(Position2D.Y - shpCircle.Height / 2);
end;
Pomera shpCircle... samo to i nista vise
Potpis
Iscrtava ti narednu scenu.Novi polozaj tenka metka i.t.d.
Ovo ti Srki kod (malo je dugacak) ali ti ces se sigurno snaci
Nisam znao koji deo da stavim pa sam ti poslao ceo!
U cemu je problem?
Nisam znao koji deo da stavim pa sam ti poslao ceo!
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
gt1: TImage;
gt2: TImage;
gt3: TImage;
gt4: TImage;
Tgtright: TTimer;
Tgtup: TTimer;
Tgtdown: TTimer;
Tgtleft: TTimer;
Tbgt1: TTimer;
Tbgt2: TTimer;
Tbgt3: TTimer;
Tbgt4: TTimer;
gbull: TImage;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Tbgt1Timer(Sender: TObject);
procedure Tbgt3Timer(Sender: TObject);
procedure Tbgt2Timer(Sender: TObject);
procedure Tbgt4Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
gtup:boolean;
gtdown:boolean;
gtleft:boolean;
gtright:boolean;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
gt2.Left:=gt1.Left;
gt2.top:=gt1.top;
gt3.Left:=gt1.Left;
gt3.top:=gt1.top;
gt4.Left:=gt1.Left;
gt4.top:=gt1.top;
if key=VK_SPACE then
begin
if gt1.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top;
Tbgt1.enabled:=true;
Tbgt2.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt2.visible=true then
begin
gbull.left:=gt1.left+25;
gbull.top:=gt1.top+12;
Tbgt2.enabled:=true;
Tbgt1.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt3.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top+25;
Tbgt3.enabled:=true;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt4.visible=true then
begin
gbull.left:=gt1.left;
gbull.top:=gt1.top+12;
Tbgt4.enabled:=true;
Tbgt3.enabled:=false;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
end;
end;
if key=VK_UP then
begin
gt1.top:=gt1.Top-4;
gtup:=true;
gtdown:=false;
gtleft:=false;
gtright:=false;
end;
if key=VK_DOWN then
begin
gt1.Top:=gt1.top+4;
gtup:=false;
gtdown:=true;
gtleft:=false;
gtright:=false;
end;
if key=VK_LEFT then
begin
gt1.left:=gt1.left-4;
gtup:=false;
gtdown:=false;
gtleft:=true;
gtright:=false;
end;
if key=VK_RIGHT then
begin
gt1.left:=gt1.left+4;
gtup:=false;
gtdown:=false;
gtleft:=false;
gtright:=true;
end;
////////////////////////////////////////////////////////////////////////////////
if gtup=true then
begin
gt1.Visible:=true;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=false;
end;
if gtleft=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=true;
end;
if gtdown=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=true;
gt4.Visible:=false;
end;
if gtright=true then
begin
gt1.Visible:=false;
gt2.Visible:=true;
gt3.Visible:=false;
gt4.Visible:=false;
end;
end;
procedure TForm1.Tbgt1Timer(Sender: TObject);
begin
gbull.top:=gbull.top-6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt3Timer(Sender: TObject);
begin
gbull.top:=gbull.top+6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt2Timer(Sender: TObject);
begin
gbull.left:=gbull.left+6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt4Timer(Sender: TObject);
begin
gbull.left:=gbull.left-6;
gbull.Visible:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
gt1.visible:=true;
gt2.visible:=false;
gt3.visible:=false;
gt4.visible:=false;
gbull.Visible:=false;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
gt1: TImage;
gt2: TImage;
gt3: TImage;
gt4: TImage;
Tgtright: TTimer;
Tgtup: TTimer;
Tgtdown: TTimer;
Tgtleft: TTimer;
Tbgt1: TTimer;
Tbgt2: TTimer;
Tbgt3: TTimer;
Tbgt4: TTimer;
gbull: TImage;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Tbgt1Timer(Sender: TObject);
procedure Tbgt3Timer(Sender: TObject);
procedure Tbgt2Timer(Sender: TObject);
procedure Tbgt4Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
gtup:boolean;
gtdown:boolean;
gtleft:boolean;
gtright:boolean;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
gt2.Left:=gt1.Left;
gt2.top:=gt1.top;
gt3.Left:=gt1.Left;
gt3.top:=gt1.top;
gt4.Left:=gt1.Left;
gt4.top:=gt1.top;
if key=VK_SPACE then
begin
if gt1.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top;
Tbgt1.enabled:=true;
Tbgt2.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt2.visible=true then
begin
gbull.left:=gt1.left+25;
gbull.top:=gt1.top+12;
Tbgt2.enabled:=true;
Tbgt1.enabled:=false;
Tbgt3.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt3.visible=true then
begin
gbull.left:=gt1.left+12;
gbull.top:=gt1.top+25;
Tbgt3.enabled:=true;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
Tbgt4.enabled:=false;
end;
if gt4.visible=true then
begin
gbull.left:=gt1.left;
gbull.top:=gt1.top+12;
Tbgt4.enabled:=true;
Tbgt3.enabled:=false;
Tbgt2.enabled:=false;
Tbgt1.enabled:=false;
end;
end;
if key=VK_UP then
begin
gt1.top:=gt1.Top-4;
gtup:=true;
gtdown:=false;
gtleft:=false;
gtright:=false;
end;
if key=VK_DOWN then
begin
gt1.Top:=gt1.top+4;
gtup:=false;
gtdown:=true;
gtleft:=false;
gtright:=false;
end;
if key=VK_LEFT then
begin
gt1.left:=gt1.left-4;
gtup:=false;
gtdown:=false;
gtleft:=true;
gtright:=false;
end;
if key=VK_RIGHT then
begin
gt1.left:=gt1.left+4;
gtup:=false;
gtdown:=false;
gtleft:=false;
gtright:=true;
end;
////////////////////////////////////////////////////////////////////////////////
if gtup=true then
begin
gt1.Visible:=true;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=false;
end;
if gtleft=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=false;
gt4.Visible:=true;
end;
if gtdown=true then
begin
gt1.Visible:=false;
gt2.Visible:=false;
gt3.Visible:=true;
gt4.Visible:=false;
end;
if gtright=true then
begin
gt1.Visible:=false;
gt2.Visible:=true;
gt3.Visible:=false;
gt4.Visible:=false;
end;
end;
procedure TForm1.Tbgt1Timer(Sender: TObject);
begin
gbull.top:=gbull.top-6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt3Timer(Sender: TObject);
begin
gbull.top:=gbull.top+6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt2Timer(Sender: TObject);
begin
gbull.left:=gbull.left+6;
gbull.Visible:=true;
end;
procedure TForm1.Tbgt4Timer(Sender: TObject);
begin
gbull.left:=gbull.left-6;
gbull.Visible:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
gt1.visible:=true;
gt2.visible:=false;
gt3.visible:=false;
gt4.visible:=false;
gbull.Visible:=false;
end;
end.
U cemu je problem?
OnKeyDown event se poziva dok drzis taster pritisnut. Dakle... drzis desno... i imas OnKeyDown(desno), OnKeyDown(desno), OnKeyDown(desno), OnKeyDown(desno),... ne pustas desno, ali pritisnes i space OnKeyDown pocinje da se poziva za space OnKeyDown(space), OnKeyDown(space), OnKeyDown(space),... pustis space u dobijes OnKeyUp(space)... ti i dalje drzis desno, ali nema vise OnKeyDown(desno) jer OnKeyDown tj. WM_KEYDOWN poruka tako radi. Cim pustis bilokoji taster nema vise OnKeyDown. Posto se tebi tenk pomera bas u OnKeyDown eventu posle pritiska na space kretanje prestaje jer vise nema OnKeyDown poruke.
Pogledaj kako sam ja to uradio (ni to nije najsrecnije resenje, ali je bolje od tvog) pa ces videti razliku.
BTW da sam na tvom mestu, krenuo bih da pisem program iz pocetka jer si ga iskomplikovao bez potrebe.
Pogledaj kako sam ja to uradio (ni to nije najsrecnije resenje, ali je bolje od tvog) pa ces videti razliku.
BTW da sam na tvom mestu, krenuo bih da pisem program iz pocetka jer si ga iskomplikovao bez potrebe.
Potpis
Nisam bas razumeo u cemu sam pogresio problem nije u kretanju nego u pucanju kako da napravim da puca i da se krece u isto vreme.On kad pukne odma prestane sa kretanjem-kako to da popravim?
Pa Srki ti je upravo to i objasnio! Cim ispalis raketu (znaci, pritisnes SPACE) OnKeyDown za gore (dole, levo, desno) se vise ne poziwa, jer je program primio poruku za OnKeyUp za SPACE! Posto ti pomeras tenkic na taj event, a event se vise ne poziva, nema ni kretanja tenkica! Kako sto je Srki rekao, ne koristi OnKeyDown za kretanje i pucanje! Pozdrav!
Pogledaj kod koji sam poslao. U OnKeyXXXX eventima samo postavljaj flag koji ce prilikom iscrtavanja novog frejma da kaze programu da li treba da pomeri objekat ili ne. Ovako je dovoljno da dobijes samo jedan OnKeyDown event za npr. gore... onda postavis flag za kretanje na gore, kad crtas frejm vidis da je flag postavljen i pomeris objekat, itd... kad dobijes OnKeyUp za gore skines flag za kretanje i u sledecem iscrtavanju ne pomeras objekat.
Potpis
Izvini sto te ovo pitam znam da ce zvucati pocetnicko ali stacu kad sam pocetnik:
Sta je flag (znam da je zastava) ali verovatno ti mislis na nesto drugo?
Sta je flag (znam da je zastava) ali verovatno ti mislis na nesto drugo?
Flag... to je promenljiva :)
Uglavnom je to boolean ili integer promenljiva. U ovom slucaju flag treba da ti kaze da li da i gde da pomeras objekat ako treba. Posto moze da ima vise vrednost, tip bi mogao da bude integer. Kada je promenljiva koja ti predstavlja flag postavljena na 0 ti nemoj da pomeras objekat. Kada je postavljen na 1 onda ga pomeraj gore, kada je 2 onda dole i sl... Flag postavljas u OnKeyXXXX eventu. Kada se neki taster pritisne, ti proveris koji je i na osnovu toga postavis flag. Kada se taster otpusti, prvo proveris da li se otpustio taster koji je postavio flag (moguce je da si pritisnuo levo, pa gore, pa pustio levo... objekat i dalje treba da ide gore) i onda resetujes flag na 0. U tajmeru ili gde god vec updatujes objekte proveris u kom stanju se nalazi flag i na osnovu njega oderdjujes sta ces da radis.
Uglavnom je to boolean ili integer promenljiva. U ovom slucaju flag treba da ti kaze da li da i gde da pomeras objekat ako treba. Posto moze da ima vise vrednost, tip bi mogao da bude integer. Kada je promenljiva koja ti predstavlja flag postavljena na 0 ti nemoj da pomeras objekat. Kada je postavljen na 1 onda ga pomeraj gore, kada je 2 onda dole i sl... Flag postavljas u OnKeyXXXX eventu. Kada se neki taster pritisne, ti proveris koji je i na osnovu toga postavis flag. Kada se taster otpusti, prvo proveris da li se otpustio taster koji je postavio flag (moguce je da si pritisnuo levo, pa gore, pa pustio levo... objekat i dalje treba da ide gore) i onda resetujes flag na 0. U tajmeru ili gde god vec updatujes objekte proveris u kom stanju se nalazi flag i na osnovu njega oderdjujes sta ces da radis.
Potpis
Vlado The Boy, sta se desava sa igrom. Ne javljas se vec duze vreme?
Potpis
Sigurno sprema neshto extra mega giga specijano pa nas drzi u neizvesnosti ;)!