![]() |
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 |
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. |
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. |
Re: Ball am Tisch
Sry, die Infos sind mir persönlich etwas zu dürftig (soll heißen: kapier ich nicht :wiejetzt:)
|
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. |
Re: Ball am Tisch
Zitat:
Zitat:
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 ? |
Re: Ball am Tisch
[OT] Diese Sorte Lehrer hab ich gefressen :evil: [/OT]
|
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) |
Re: Ball am Tisch
Zitat:
Zitat:
was für Zahlen ? Bildschirmposition ? Position relativ zum Panel ? :gruebel: wo nimmst du die Zahlen her ? |
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:
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.
procedure TForm1.Delay(time: word);
var Start : Integer; begin Start:= GetTickCount; while (GetTickCount - Start <= time) do Application.ProcessMessages; end; Natürlich ist ein Timer das eleganteste aber dein genialer Lehrer möchte das ja nicht. |
Re: Ball am Tisch
Also zunächst mal zu Deiner Beschreibung bisher:
Zitat:
Ok, jetzt mal die Ironie beiseite ... Zitat:
Zitat:
@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 |
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 |
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 |
Re: Ball am Tisch
Liste der Anhänge anzeigen (Anzahl: 1)
die oberfläche sieht so aus, vielleicht hilft ja.
|
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 |
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.
|
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. |
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!
|
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 |
Re: Ball am Tisch
na toll, mathe ist nicht gerade mein lieblingsfach.
|
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.
|
Re: Ball am Tisch
Ja, nur bevor du mich gleich fressen möchtest :mrgreen: schau mal
![]() |
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! |
Re: Ball am Tisch
Ja zum Beispiel die.
Oder die For Schleife ansonsten musst du dir eine geeignete Abbruchsbedingung überlegen. |
Re: Ball am Tisch
gut, vielen dank!
|
Re: Ball am Tisch
Zitat:
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 |
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 |
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.
|
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:
HTH Frank
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz