![]() |
Ball bewegen mit Canvas
Hallo!
Ich benutze Delphi 7 Ich bin noch Anfänger , habe seit ein paar Wochen in der Schule Informatik.Nun zu meinem Problem: Ich habe einen Ball gezeichnet mit diesem Code:Image1.Canvas.Ellipse(x,y,x+50,y+50).Und diesen Ball habe ich auch schon in Bewegung versetzt:
Delphi-Quellcode:
Nun soll der Ball an allen 4 Wänden apprallen.Wie mache ich das????
y:=100;
Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); Image1.Canvas.Pen.Color:=clwhite; Image1.Canvas.brush.Color:=clwhite; Image1.Canvas.Ellipse(x,y,x+50,y+50); x:=x+10; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); MFG Penelopee [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Ball bewegen mit Canvas
Hallo,
willkommen in der DP Verwende doch bitte die Delphi Tags, um deinen Code zu kennzeichnen... Überprüfe doch einfach die X bzw. die Y Position des Balls, wenn sie >=Höhe,Breit ist, dann einfach das + zu einem - machen. oder bei <=0 halt wieder zu +# Grüße Benjamin |
Re: Ball bewegen mit Canvas
Du speicherst dir die aktuelle x- und y-Bewegungsrichtung. Dann überprüfst du, ob der Ball gerade die Wand berührt, wenn ja, setzt du die Bewegungsrichtung entsprechend um. Als Beispiel (für die x-Richtung):
Delphi-Quellcode:
Das ist jetzt quick and dirty, und für den Programmierstil gehör ich eigentlich auch erschossen, aber ein bisschen Arbeit muss dir ja auch noch bleiben. :wink:
var xMove: integer;
x,y: integer; begin // Initialisieren: xMove := +10; x := 100; y := 100; repeat // alten Ball löschen: Image1.Canvas.Pen.Color:=clwhite; Image1.Canvas.brush.Color:=clwhite; Image1.Canvas.Ellipse(x,y,x+50,y+50); // neuen Ball malen: Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); if (x = 50) and (xMove < 0) then xMove := +10 else // an der linken Wand abprallen if (x = Image1.Width - 50) and (xMove > 0) then xMove := -10; // an der rechten Wand abprallen x := x + xMove; Delay(500); until <Abbruchbedingung>; end; |
Re: Ball bewegen mit Canvas
danke für die hilfe , ich hab aber noch ein problem.Wenn der Ball die Wand erreicht , prallt er einmal ab , aber dann ist die if Bedingung ja nicht mehr erfüllt und der Ball geht wieder auf die wand zu!!Hier nochmla mein Code:
[xmove:=+50; y:=100; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); Image1.Canvas.Pen.Color:=clwhite; Image1.Canvas.brush.Color:=clwhite; Image1.Canvas.Ellipse(x,y,x+50,y+50); x:=x+10; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); if (x >759)then x:=x-50; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); ] |
Re: Ball bewegen mit Canvas
Du hast da einen grundsätzlichen Fehler drin, du deklarierst zwar xMove, doch benutzt du sie nicht.
Wenn du dir das Bsp. von tigerman anschaust, so ist: Neue_Ball_Position := Alte_Ball_Position + xMove xMove muss dementsprechend für eine Bewegung nach rechts größer 0 sein, für eine Bewegung nach links kleiner 0. d.h. du musst bei
Delphi-Quellcode:
die Variable xMove kleiner 0 setzten und natürlich überhaupt die Position des Balles mit xMove berrechnen. (x := x+xmove)
if (x >759)then
|
Re: Ball bewegen mit Canvas
wann und wo muss ich die Position des Balles berechnen???Vielen Dank für die Hilfe!!
|
Re: Ball bewegen mit Canvas
Du berechnest die Position des Balles in der repeat..until-Schleife. Hattet ihr Schleifen schon im Unterricht? Wenn nicht, sieh dir mal
![]() ![]() ![]()
Delphi-Quellcode:
x := x + xMove
|
Re: Ball bewegen mit Canvas
Kannst du bitte nochmal den Text Delphi Text posten , so dass es funktioniert.Wär sehr nett!Und wir hatten in der Schule bisher nur if und for schleifen.
|
Re: Ball bewegen mit Canvas
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe, es hilft....
|
Re: Ball bewegen mit Canvas
Die repeat..until Schleife:
Delphi-Quellcode:
Das wiederholt die Anweisungen solange, bis die Abbruchbedingung erfüllt ist, mindestens jedoch einmal (die Abbruchbedingung wird ja erst am Ende überprüft). Ähnlich funktioniert die while Schleife:
repeat
<Anweisungen> until <Bedingung>
Delphi-Quellcode:
Der Unterschied ist, dass zuerst die Bedingung getestet wird, die Schleife also u.U. gar nicht erst durchlaufen wird.
while <Bedingung> do
Anweisung |
Re: Ball bewegen mit Canvas
was ist daran bitte falsch???Kann mal bitte einer meinen Quelltext so verändern , dass es fuktioniert , also der Ball soll rechts bei x=759 und links bei x=0 abprallen.Hier der Text:
Delphi-Quellcode:
danke!
y:=100;
Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); Image1.Canvas.Pen.Color:=clwhite; Image1.Canvas.brush.Color:=clwhite; Image1.Canvas.Ellipse(x,y,x+50,y+50); x:=x+10; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50); if (x >759) and (xmove<0) then xmove:=-10; x:=x+xmove; Image1.Canvas.Pen.Color:=clgreen; Image1.Canvas.brush.Color:=clyellow; Image1.Canvas.Ellipse(x,y,x+50,y+50) |
Re: Ball bewegen mit Canvas
Delphi-Quellcode:
zu
if (x >759) and (xmove<0) then
xmove:=-10;
Delphi-Quellcode:
if x >= 759 - 50 then xmove := -10;
if x <= 0 then xmove := +10; oder in der Initialisierung:
Delphi-Quellcode:
und in der Schleife:
// Variablen initialisieren
x := 0; y := 0; xmove := 10; ymove := 10; // wenn erwünscht die Ausgangsposition einzeichnen Image1.Canvas.Pen.Color := clGreen; Image1.Canvas.Brush.Color := clYellow; Image1.Canvas.Ellipse(x, y, x + 50, y + 50);
Delphi-Quellcode:
// Löschen
Image1.Canvas.Pen.Color := clWhite; Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.Ellipse(x, y, x + 50, y + 50); // Position ändern If x < 0 Then xmove := 10 Else If x >= Width - 50 Then xmove := -10; If y < 0 Then ymove := 10 Else If y >= Heigth - 50 Then ymove := -10; Inc(x, xmove); // x := x + xmove; Inc(y, ymove); // y := y + ymove; // auf neuer Position einzeichnen Image1.Canvas.Pen.Color := clGreen; Image1.Canvas.Brush.Color := clYellow; Image1.Canvas.Ellipse(x, y, x + 50, y + 50); |
Re: Ball bewegen mit Canvas
es klappt leider immer noch nicht.Ich versteh einfach nciht , was dieses xmove macht , mir ist schon klar , dass damit die Richtung des Balls angegebvn wird.Kann nicht nochmal einer den quelltext so von mir verändern , dass es klappt.
sorry mein lehrer in der schule erklärt gar nichts!! |
Re: Ball bewegen mit Canvas
Liste der Anhänge anzeigen (Anzahl: 4)
xMove und yMove speichern einfach die Bewegungsrichtung des Balls.
Diese beiden Variablen verden einfach beim auftreffen an der Wand entsprechend umgekehrt, ansonsten werden diese zur aktuellen Position des Balls dazuaddiert. Zitat:
|
Re: Ball bewegen mit Canvas
Hier liegt der Hase im Pfeffer:
Zitat:
Wenn der Ball den rechten Rand berührt (x > 759) und sich gleichzeitig nach links bewegt (xMove < 0) dann setze die Bewegungsrichtung des Balles auf "links" Was ist daran falsch? Um abzuprallen, muss sich der Ball ja vorher nach rechts bewegt haben. Richtig wäre also:
Delphi-Quellcode:
if (x >= 760)and (xMove > 0) then
xMove := -10; |
Re: Ball bewegen mit Canvas
Vielen Dank für die Hilfe!Kann mir jetzt noch einer erklären , was das hier bedeutet:
Delphi-Quellcode:
Inc(x, xMove);
Inc(y, yMove); |
Re: Ball bewegen mit Canvas
Zitat:
Delphi-Quellcode:
x:=x+xMove;
y:=y+yMove; |
Re: Ball bewegen mit Canvas
Hi,
wie Benjamin schon sagte, ist:
Delphi-Quellcode:
das Selbe wie:
Inc(x, xMove);
Delphi-Quellcode:
Inc bedeutet immer eine Erhöhung eines Wertes.
x := x + xMove;
So wird mit Inc(x, xMove) x um den Wert xMove erhöht. Übrigens bedeutet Inc einfach Inkrementieren, das wiederum ist nichts anderes als Heraufzählen. :wink: Das Selbe gibt es dann natürlich auch als Herunterzählen. Dies nennt man Dekrementieren und würde so aussehn:
Delphi-Quellcode:
MfG Marc
Dec(x, xMove);
P.S.: Zu spät -ich weiß- aber jetzt habe ich mir schon mal die "Mühe" gegeben. :stupid: |
Re: Ball bewegen mit Canvas
Vielen Dank an alle Helfer!Hab jetzt alles verstanden und alles funktioniert.
Jetzt muss ich irgendwo im Image ein Loch erstellen und wenn der Ball dann zum Loch kommt , soll der ball darin verschwinden , also wie beim Billiard!Hat einer Idee , wie ich das mahcen kann? |
Re: Ball bewegen mit Canvas
Indem du prüfst, ob die x- und y-Koordinaten des Balls denen des Lochs entsprechen:
Delphi-Quellcode:
if (xBall = xHole) and (yBall = yHole) then
... |
Re: Ball bewegen mit Canvas
Was kommt dann nach dem then???Ich hab jetzt geschrieben:
Delphi-Quellcode:
Dann ist aber das problem , dass das Loch dann die Farbe des Balles hat.Das Loch soll aber weiß bleiben.Wie kann ich den Ball verschwinden lassen??Oder geht das nur , indem man den Ball weiß werden lässt???
if (xBall = xHole) and (yBall = yHole) then
start:=false; |
Re: Ball bewegen mit Canvas
Beim Ball zeichnen machst du doch eigentlich zwei Teilschritte: Du lässt ihn an der alten Position verschwinden und zeichnest ihn an der neuen Position neu. Ball verschwinden heißt also einfach, Ball löschen ohne ihn anschließend neu zu zeichnen. :roll:
|
Re: Ball bewegen mit Canvas
Ich hab jetzt 3 Bälle.Jetzt sollen die Bälle , wenn sie sich berühren von einander abprallen.Wie geht das????
|
Re: Ball bewegen mit Canvas
Da solltest du dich mal mit Vektoren, Tangenten, und dem Kreuzprodukt beschäftigen. Bist du sicher, dass der Aufwand gefordert ist?
|
Re: Ball bewegen mit Canvas
Nee ich lass das dann lieber.Hab ja jetzt schon viel hinbekommen!!!Vielen Dank für die Hilfe!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 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