Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ball am Tisch (https://www.delphipraxis.net/128864-ball-am-tisch.html)

Hawkeye4077 7. Feb 2009 18:36


Ball am Tisch
 
hi, ich bin hier neu und hab gleich eine frage:
in der schule hab ivh seit einem halben jahr informatik, seit einem vierteljahr arbeiten wir nun mit delphi. eigentlich hab ich damit keine probleme, aber mit dem neuen projekt komm ich einfach nicht klar :( :
auf einem tisch ( panel) soll sich ein ball ( shape.objekt) bewegen, wenn m an in zwei edit felder werte für left und top eingibt und auf start klickt. hat der ball das ende des "tisches" erreicht, soll er abprallen und nicht aus dem panel verschwinden. ich hab zwar schon einige ideen gehabt und ausprobiert, aber es funktiniert einfach nicht. wenn ich bei edit1 bzw. edit2 werte eingebe und auf start drücke, tut sich nichts.
Meine note hängt davon zwar nicht ab, aber es ärgert mich einfach, dass ich es nicht hinkriege. wenn ich unseren lehrer frage, erklärt er mir nur: Das weiß ich auch nicht, musst du mal ausprobieren. :evil:

Könnt ihr mir bitte helfen????
bin für jeden tipp dankbar!!!!
LG Hawkeye4077

DeddyH 7. Feb 2009 18:38

Re: Ball am Tisch
 
Hallo und Willkommen in der DP :dp:

wohin soll sich der Ball denn bewegen? Da so eine Positionsverschiebung ja eine regelmäßig wiederkehrende Aufgabe ist, böte sich IMHO die Verwendung eines Timers an.

Hawkeye4077 7. Feb 2009 18:44

Re: Ball am Tisch
 
hi, der ball soll sich in alle richtungen bewegen, je nachdem welche left und top werte eingegeben werden. einen timer sollen wir nicht benutzen.
danke für die schnelle antwort.

DeddyH 7. Feb 2009 18:47

Re: Ball am Tisch
 
Sry, die Infos sind mir persönlich etwas zu dürftig (soll heißen: kapier ich nicht :wiejetzt:)

Whatever 7. Feb 2009 18:53

Re: Ball am Tisch
 
Ich glaube mit den left und top Werten soll die Richtung angegeben werden bzw. die "Schrittgröße".
Wenn ich damit richtig liege wäre das mit einem Timer wirklich am besten zu erledigen oder halt mit Sleep oder einer delay-procedure.

haentschman 7. Feb 2009 18:58

Re: Ball am Tisch
 
Zitat:

einen timer sollen wir nicht benutzen.
...wer sagt das ? Der Lehrer, der...
Zitat:

Das weiß ich auch nicht, musst du mal ausprobieren.
...gesagt hat ?

Sollte er noch mal fragen kannst du sagen, mit einem Timer ist das die eleganteste Lösung.

Zur Frage: im TimerEvent OnTimer setzt du dann die Position deines Shapes. Du müßtest noch die Richtung der Bewegung zwischenspeichern und bei Kollision mit dem "Rand" des Panels entsprechend die Richtung ändern. Desweiteren brauchst du noch eine Funktion für den Einfallswinkel und den Ausfallwinkel.

wenn mich nicht alles täuscht gab es hier schon mal was in dieser Richtung. Durchsuche mal die DP nach den Stichworten.

:hi:

PS: was ich nicht verstehe sind die Werte welche in die Edits eingetragen werden sollen ?

DeddyH 7. Feb 2009 18:59

Re: Ball am Tisch
 
[OT] Diese Sorte Lehrer hab ich gefressen :evil: [/OT]

Hawkeye4077 7. Feb 2009 19:01

Re: Ball am Tisch
 
das tut mir leid, ich versuchs nochmal besser zu erklären:
der ball soll sich innerhalb des panels verschieben. außerhalb des panels befinden sich zwei editfelder, in die man zwei zahlen eingeben soll. wenn man dann auf start drückt, soll sich der ball auf diese position begeben. i9ch hoffe, du verstehst, wei ich das meine!?

@deddyH: Ich auch!!!

@ whatever: genau das soll mi den left und top werten angegeben werden. den timer dürfen wir nicht benutzen. was ist denn die sleep bzw. die delay-procedure? das hatten wir in der schule noch nicht. (haben auch kein buch zum nachlesen)

haentschman 7. Feb 2009 19:08

Re: Ball am Tisch
 
Zitat:

(haben auch kein buch zum nachlesen)
...Delphi Hilfe :gruebel:
Zitat:

in die man zwei zahlen eingeben soll
3,1215926 oder 1000000000000000 oder 2E4 :gruebel:

was für Zahlen ? Bildschirmposition ? Position relativ zum Panel ? :gruebel:

wo nimmst du die Zahlen her ?

Whatever 7. Feb 2009 19:24

Re: Ball am Tisch
 
Sleep unterbricht das Programm komplett was ich aber nicht für sinnvoll halte.
Eine Delay-Procedure sorgt auch für eine Pause stoppt allerdings nicht das komplette Progamm.

Delphi-Quellcode:
procedure TForm1.Delay(time: word);
var
  Start : Integer;
begin
  Start:= GetTickCount;
  while (GetTickCount - Start <= time) do
  Application.ProcessMessages;
end;
Also kannst du z.B. in eine Schleife Delay(verzögerung) einbauen und sie wird "Schrittweise" ausgeführt womit du deine Bewegung erzeugen könntest.

Natürlich ist ein Timer das eleganteste aber dein genialer Lehrer möchte das ja nicht.

Sir Rufo 7. Feb 2009 19:24

Re: Ball am Tisch
 
Also zunächst mal zu Deiner Beschreibung bisher:

Zitat:

Zitat von Hawkeye4077
wenn ich bei edit1 bzw. edit2 werte eingebe und auf start drücke, tut sich nichts.

Warum soillte sich denn da was bewegen? Wenn ich mir hier 2 Edit-Felder mache und einen Button und ich trage bei den Edits was ein und drücke auf den Button, dann bewegt sich auch nichts (ich habe auch schon versucht den Button Start zu nennnen, aber da tut sich auch nichts) ... vielleicht liegt es ja am Panel (schnell dahingeklatscht und noch schnell ein shape auf das panel) ... nee, nix ... oh, shape mal rund machen ... nee immer noch nichts ....

Ok, jetzt mal die Ironie beiseite ...

Zitat:

Zitat von Hawkeye4077
auf einem tisch ( panel) soll sich ein ball ( shape.objekt) bewegen, wenn m an in zwei edit felder werte für left und top eingibt und auf start klickt. hat der ball das ende des "tisches" erreicht, soll er abprallen und nicht aus dem panel verschwinden.

da du erst ein halbes jahr unterricht in dem fach hattest, gehe ich mal davon aus, das wir soetwas wie timer, threads usw. mal vergessen können. Es geht hier wohl primär um die umsetzung des algorithmus.

Zitat:

Zitat von Hawkeye4077
ich hab zwar schon einige ideen gehabt und ausprobiert, aber es funktiniert einfach nicht.

ja, was hast du denn bist jetzt schon ausprobiert und wie ist dein algorithmus, auf den du aufsetzen möchtest?

@deddyh: Vielleicht möchte der Lehrer ihm das einfach nicht vorkauen, sondern mal die eigeninitiative fördern ... wäre ja auch möglich

@haentschman: da soll wohl die bildschirm-position eingegeben werden. ich persönlich würde natürlich auch eher Winkel und Anfangsgeschwindigkeit da bevorzugen :)

cu

Oliver

_frank_ 7. Feb 2009 19:24

Re: Ball am Tisch
 
anhand der beschreibung würde ich mal darauf tippen, dass der ball von der aktuellen position zu der mit den editfeldern angegebenen Position (Koordinaten in px) bewegt werden soll...scheinbar per schleife.

prinzipell musst du delta x und delta y berechnen und eine schleife so dimensionieren, dass sie x und y so berechnet, dass sich ein gerader weg ergibt (also gleichzeitig mit Verhältnis delta x/delta y). application.processmessages nicht vergessen, nachdem die neue position gesetzt wurde.

ich erspare mir erstmal code, da ich nicht genau weis, ob meine Vermutung richtig ist...

HTH Frank

Sir Rufo 7. Feb 2009 20:14

Re: Ball am Tisch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht hilft ja mal eine Zeichnung ;)

Kleiner Tip: Diese Zeichnung berücksichtigt nicht den Umfang des Balls, es ist aber sehr einfach dieses zu berücksichtigen

cu

Oliver

Hawkeye4077 8. Feb 2009 10:55

Re: Ball am Tisch
 
Liste der Anhänge anzeigen (Anzahl: 1)
die oberfläche sieht so aus, vielleicht hilft ja.

Sir Rufo 8. Feb 2009 11:12

Re: Ball am Tisch
 
Ich dachte jetzt eigentlich, die Zeichnung hilft Dir, dafür den passenden Algorithmus zu finden ...

In deinem Projekt ist ja quasi nix drin ...

cu

Oliver

Hawkeye4077 8. Feb 2009 11:18

Re: Ball am Tisch
 
ich dachte, dass auch die zeichnung hilft, mein anliegen zu versetehen, da es ja doch zu einigen missverständnisen gekommen ist.

Whatever 8. Feb 2009 11:18

Re: Ball am Tisch
 
Woran genau hängts denn?
An der Bewegung? An dem Abprall? ...
Wär vielleicht ganz gut zu wissen was dir fehlt.

Hawkeye4077 8. Feb 2009 11:21

Re: Ball am Tisch
 
ich weiß einfach nicht, was ich eingeben muss, damit sich der ball bewegt, wenn ich zahlen bei edit1 und edit2 eingebe und auf start klicke!

Sir Rufo 8. Feb 2009 11:23

Re: Ball am Tisch
 
Also komplett ...

... aber für die Herleitung des Algorithmus brauchen wir auch gar kein Delphi, sondern reine Mathematik!

Das ist der erste Schritt ... die Umsetzung in eine Programmiersprache kann erst danach erfolgen.

cu

Oliver

Hawkeye4077 8. Feb 2009 11:25

Re: Ball am Tisch
 
na toll, mathe ist nicht gerade mein lieblingsfach.

Whatever 8. Feb 2009 11:27

Re: Ball am Tisch
 
Eine Bewegung ist eine aneinander reihung einzelner Schritte. Also musst Du eine Schleife bauen die bei jedem Durchlauf einen Schritt macht (die X und Y Werte des Shapes werden verändert). Durch eine Verzögerung entsteht dann eine Bewegung. Die Schleife kommt dann in die OnClick Prozedur des StartButtons.

Sir Rufo 8. Feb 2009 11:27

Re: Ball am Tisch
 
Ja, nur bevor du mich gleich fressen möchtest :mrgreen: schau mal hier unter Punkt 2.3.2.3

Hawkeye4077 8. Feb 2009 11:34

Re: Ball am Tisch
 
danke, das hilft mir weiter. dann muss ich doch die repeat until schleife verwenden, oder?

@ sir rufo:
ich weiß, dass die null bock haltung hier nicht erwünscht ist, aber habe ich denn je geschrieben, dass ich von euch erwrte, dass ihr meine hausaufgaben macht? das projekt ist im übrigen freiwillig, ich mache es, weil mir delphi spaß macht. nur diesmal hab ich halt ein brett vorm kopf!

Whatever 8. Feb 2009 11:40

Re: Ball am Tisch
 
Ja zum Beispiel die.
Oder die For Schleife ansonsten musst du dir eine geeignete Abbruchsbedingung überlegen.

Hawkeye4077 8. Feb 2009 11:45

Re: Ball am Tisch
 
gut, vielen dank!

_frank_ 8. Feb 2009 11:52

Re: Ball am Tisch
 
Zitat:

Zitat von Hawkeye4077
na toll, mathe ist nicht gerade mein lieblingsfach.

was wir mit "delta x" und "delta y" meinen, ist aber schon klar (sollte auch aus der zeichnung ersichtlich sein), und wie du diese berechnen kannst?
dann brauchst ja nur noch das verhältnis der beiden berechnen, eine schleife mit der länge eines deltas bauen (am besten das größte der beiden) den entsprechenden wert mit jedem schleifendurchlauf erhöhen und gleichzeitig den anderen mit hilf des Verhältniswertes erhöhen.

kleiner tip...machs erstmal ohne abprallen. das verkompliziert das Ganze am Anfang nur.

HTH Frank

Sir Rufo 8. Feb 2009 12:00

Re: Ball am Tisch
 
Ja, anbieten würde sich eine Funktion, die das Shape um max. 1 Pixel in x- und y- Richtung auf den Zielpunkt bewegt.

Diese Funktion so lange aufrufen, bis der Zielpunkt erreicht wurde.

Das Abprallen wird dann dadurch realisiert, dass sich jeweils beim Erreichen der Grenzen der Zielpunkt ändert.

cu

Oliver

Hawkeye4077 8. Feb 2009 12:03

Re: Ball am Tisch
 
hi, danke. was mit delta x und delta y gemeint ist, verstehe ich schon. an das apprallen mache ich mich später, wenn der ball sich erstmal bewegt.

_frank_ 8. Feb 2009 14:19

Re: Ball am Tisch
 
um das mal ganz einfach (ohne sonderfälle zu berücksichtigen) in code zu fassen (muss natürlich noch optimiert werden):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    dx,dy:integer;
    v:double;
    ps,pz:TPoint;
begin
  ps:=Point(10,10); //ball soll von da
  pz:=Point(100,200); //nach da
  //den weg als linie vorzeichnen
  canvas.moveto(ps.x,ps.y);
  canvas.lineto(pz.x,pz.y);
  shape1.SetBounds(ps.x,ps.y,10,10);//die startposition und größe des Shapes setzen
  sleep(1000);//einfach mal warten, um den startpunkt in ruhe zu betrachten
  //deltas berechnen
  dx:=pz.x-ps.x;
  dy:=pz.y-ps.y;
  if dx>dy then
  begin
    v:=dy/dx; //verhältnis berechnen
    for i:=1 to dx do
    begin
      //neu positionieren
      shape1.left:=ps.x+i;
      shape1.Top:=ps.y+trunc(i*v);
      application.ProcessMessages;
      sleep(20); //damit die bewegung bisschen langsamer wird...
    end;
  end else
  begin
    v:=dx/dy; //verhältnis berechnen
    for i:=0 to dy do
    begin
      //neu positionieren
      shape1.top:=ps.y+i;
      shape1.Left:=ps.x+trunc(i*v);
      application.ProcessMessages;
      sleep(20); //damit die bewegung bisschen langsamer wird...
    end;
  end;
end;
HTH Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz