Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Ball bewegen mit Canvas (https://www.delphipraxis.net/54612-ball-bewegen-mit-canvas.html)

Penelopee 7. Okt 2005 15:59


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:
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);
Nun soll der Ball an allen 4 Wänden apprallen.Wie mache ich das????

MFG Penelopee

[edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit]

BenjaminH 7. Okt 2005 16:17

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

tigerman33 7. Okt 2005 16:21

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:
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;
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:

Penelopee 7. Okt 2005 17:26

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);

]

Spoon 7. Okt 2005 17:44

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:
if (x >759)then
die Variable xMove kleiner 0 setzten und natürlich überhaupt die Position des Balles mit xMove berrechnen. (x := x+xmove)

Penelopee 7. Okt 2005 18:10

Re: Ball bewegen mit Canvas
 
wann und wo muss ich die Position des Balles berechnen???Vielen Dank für die Hilfe!!

tigerman33 7. Okt 2005 18:59

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-Referenz durchsuchenwhile,Delphi-Referenz durchsuchenrepeat,Delphi-Referenz durchsuchenfor an. Damit wird der Ball solange bewegt, bis eine von dir vorgegebene Abbruchbedingung eintritt. Die Berechnung der Position (bzw. in meinem Beispiel erst mal ja nur der x-Koordinate) des Balles geschieht in der Zeile
Delphi-Quellcode:
x := x + xMove

Penelopee 7. Okt 2005 21:01

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.

sniper_w 7. Okt 2005 21:22

Re: Ball bewegen mit Canvas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hoffe, es hilft....

tigerman33 7. Okt 2005 21:47

Re: Ball bewegen mit Canvas
 
Die repeat..until Schleife:
Delphi-Quellcode:
repeat
  <Anweisungen>
until <Bedingung>
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:
Delphi-Quellcode:
while <Bedingung> do
  Anweisung
Der Unterschied ist, dass zuerst die Bedingung getestet wird, die Schleife also u.U. gar nicht erst durchlaufen wird.

Penelopee 7. Okt 2005 23:08

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:
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)
danke!

himitsu 7. Okt 2005 23:31

Re: Ball bewegen mit Canvas
 
Delphi-Quellcode:
if (x >759) and (xmove<0) then
xmove:=-10;
zu
Delphi-Quellcode:
if x >= 759 - 50 then xmove := -10;
if x <= 0 then xmove := +10;

oder in der Initialisierung:
Delphi-Quellcode:
// 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);
und in der Schleife:
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);

Penelopee 7. Okt 2005 23:49

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!!

himitsu 8. Okt 2005 00:50

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:

Zitat von Penelopee
danke für deine hilfe!!!Es klappt aber leider immer noch nicht.Ich soll eigentlich ein billiard spiel mit dem Canvas Befehl programmieren , aber ich bekomm ja nicht mal hin , dass ein Ball an der Wand apprallt!!

's tut mir allerdings etwas Leid, daß die Dateien einzeln sin ... aber mein Packer will im Moment wohl noch nicht so richtig -.-''

tigerman33 8. Okt 2005 08:48

Re: Ball bewegen mit Canvas
 
Hier liegt der Hase im Pfeffer:
Zitat:

Zitat von Penelopee
Delphi-Quellcode:
if (x >759) and (xmove<0) then
  xmove:=-10;

Das bedeutet:
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;

Penelopee 8. Okt 2005 11:26

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);

BenjaminH 8. Okt 2005 11:29

Re: Ball bewegen mit Canvas
 
Zitat:

Zitat von Penelopee
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);

Das ist dasselbe wie
Delphi-Quellcode:
x:=x+xMove;
y:=y+yMove;

Chegga 8. Okt 2005 11:45

Re: Ball bewegen mit Canvas
 
Hi,

wie Benjamin schon sagte,
ist:
Delphi-Quellcode:
Inc(x, xMove);
das Selbe wie:
Delphi-Quellcode:
x := x + xMove;
Inc bedeutet immer eine Erhöhung eines Wertes.
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:
Dec(x, xMove);
MfG Marc

P.S.:
Zu spät -ich weiß-
aber jetzt habe ich mir schon mal die "Mühe" gegeben. :stupid:

Penelopee 8. Okt 2005 12:20

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?

tigerman33 8. Okt 2005 16:53

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
  ...

Penelopee 8. Okt 2005 17:59

Re: Ball bewegen mit Canvas
 
Was kommt dann nach dem then???Ich hab jetzt geschrieben:
Delphi-Quellcode:
if (xBall = xHole) and (yBall = yHole) then
start:=false;
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???

tigerman33 9. Okt 2005 08:31

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:

Penelopee 9. Okt 2005 13:08

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????

tigerman33 9. Okt 2005 13:09

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?

Penelopee 9. Okt 2005 13:17

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 22:44 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