Gå til innhold

Anbefalte innlegg

Hei..

 

Har laget en knapp som gjør dette: trykker du på den skrur maskinen seg av..

 

har oxo laget slik at label 1 går mot label3 og nå label 1 treffer label3

står det en melding på skjermen.. så skulle jeg gjerne laget slik at når label1 treffer label3 skrur maskinene seg av ved hjelp av knappen jeg lagget. Hvordan får jeg dette til??

Lenke til kommentar
Videoannonse
Annonse

Jeg tipper han har to labler ved siden av hverandre med et lite mellomrom på en cm eller så, og den ene - for eksempel den høyre beveger seg mot den til venstre.

 

En timer flytter den høyre labelen mot venstre etter et enkelt opplegg a la dette:


Procedure TForm1.Timer1Timer (Sender: TObject);

Begin

 If Label2.Left > (Label1.Left + Label1.Width) Then

   Label2.Left:= Label2.Left - 1;

 If Label2.Left = (Label1.Left + Label1.Width) Then

   Label3.Caption:= 'PANG !';

End;

Label1 her er den til venstre, label2 er den til høyre som beveger seg. Label3 er en label under disse to som sier PANG når label2 sin Left er lik Label1 sin (Left + Width)

Lenke til kommentar

hvis dette skal være en algoritme for collision-test så må jeg si at dette må skrives om. for det første tester den kun i x-plan. det må ihvertfall implementeres en test for xy-planet.

 

så da må dette tas med i beregningen:

labelX.Top + font-høyden for labelen

Lenke til kommentar

Hehe du må prøve litt selv. Først sier jeg deg hvordan maskinen skrus av, og så klarer du ikke engang dette?!? Den koden som står i knappen er jo BARE shutdown som kaller på procedyren shutdown. Så alt du trenger å bytte ut den Pang greia er bare ved å skrive SHUTDOWN. Hmmz ikke for å være slem men det burde du ha skjønt.

 


Procedure TForm1.Timer1Timer (Sender: TObject); 

Begin 

 If Label2.Left > (Label1.Left + Label1.Width) Then 

   Label2.Left:= Label2.Left - 1; 

 If Label2.Left = (Label1.Left + Label1.Width) Then 

   SHUTDOWN;

End; 

 

Sorry hvis jeg er litt slem men jeg tror du burde kjøpe en bok og sette deg ned å lese litt.

Lenke til kommentar

Hvis labelene ikke er justert like høyt så får han (konsept1) ta utgangspunkt i en rett linjes ligning, y = ax + b.

Først beregne stigningsforholdet a ved hjelp av

a = dy/dx = (y1 – y2) / (x1- x2) = (Label1.Top – Label2.Top) / (Label1.Left – Label2.Left)

 

Deretter b :

b = y1 – a * x1 = Label1.Top – (a * Label1.Left)

 

Så setter han inn a og b I den første ligninga :

 

y = (Label1.Top – Label2.Top) / (Label1.Left – Label2.Left) * x + Label1.Top – (a * Label1.Left)

 

og lar x gå fra x2 til x1 i en løkke (hvis Label2.Left > Label1.Left):


x1:= Label1.Left;

x2:= Label2.Left;

a:= (Label1.Top - Label2.Top) / (Label1.Left - Label2.Left);

for x:= x2 downto x1 do

 begin

  y:= (Label1.Top - Label2.Top) / (Label1.Left - Label2.Left) * x + Label1.Top - (a * Label1.Left);

 Label2.Top:= y;

 Lavel2.Left:= x;

 End;

Tilsvarende løkke hvis Label2.Left < Label1.Left, men ikke downto, og x1 bytter plass med x2 i løkkehodet.

 

Siden dette skal skje med en beregning som skal gi en ny x-verdi i en timerprosedyre, må han istedenfor deklarere x og y globalt, og inkrementere eller dekrementere x i timerens OnTimer. Deretter beregne ny y-verdi og legge x og y som nye verdier til Label2 sin Left og Top henholdsvis i samme prosedyre.

 

Da kan Label2 være hvor som helst på et skjema, og bevege seg mot Label1. Kollisjonstesten blir identisk som i innlegget ovenfor, og så kan maskinen stenges av ved å kalle opp en annen prosedyre, shutdown.

 

Vel, det var det i full fart. Beklager evn. trykkfeil… Resten får konsept1 tygge litt på – litt mosjon for de små grå er vel bare sunt.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...