| Autor |
Beitrag |
tm2007
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 14:32
hallo, ich ich soll im unterricht einen ball sich hin un her bewegen lassen, was ich mit einem shape un der verschiebung mit left un top gemacht habe...
allerdings soll ich auch eine kollisionsabfrage mit form un den zwei bällen machen, also wenn die bälle die wand treffen, un wenn sich dei bälle gegenseitig treffen, hat da jmd einen vorschlag?
Moderiert von Christian S.: Abgeteilt von [url=www.delphi-forum.de/...hp?t=8643]hier[/url]
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 14:47
tm2007 hat folgendes geschrieben: | hallo, ich ich soll im unterricht einen ball sich hin un her bewegen lassen, was ich mit einem shape un der verschiebung mit left un top gemacht habe...
|
Vielleicht wäre es besser gewesen, wenn du einen neuen Thread eröffnet hättest ansatt einen so alten wieder hochzukramen.
tm2007 hat folgendes geschrieben: |
allerdings soll ich auch eine kollisionsabfrage mit form un den zwei bällen machen, also wenn die bälle die wand treffen, un wenn sich dei bälle gegenseitig treffen, hat da jmd einen vorschlag? |
Also eine ganz einfache Möglichkeit wäre folgende:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Function Kollision(Shape1, Shape2: TShape): Boolean; Begin Result := False; If (Shape1.Left > Shape2.Left) And (Shape1.Top > Shape2.Top) And (Shape1.Left < (Shape2.Left + Shape2.Width)) And (Shape1.Top < (Shape2.Top + Shape2.Height)) Then Result := True; End;
(...) If Kollision(Ball_Eins, Ball_Zwei) Then (...) |
Der Code ist ganz spontan entstanden und wurde nicht ausprobiert. Möglicherweise haben sich in der Eile Fehler eingeschlichen oder ich habe die ein oder andere Möglichkeit übersehen. In meiner Engine habe ich eine ähnliche Möglichkeit für Kollisionsabfragen eingebaut.
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 14:53
vielen dank... probiers gleich aus 
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 14:56
also muss ich das
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Function Kollision(Shape1, Shape2: TShape): Boolean; Begin Result := False; If (Shape1.Left > Shape2.Left) And (Shape1.Top > Shape2.Top) And (Shape1.Left < (Shape2.Left + Shape2.Width)) And (Shape1.Top < (Shape2.Top + Shape2.Height)) Then Result := True; End; |
in den timer einfügen ...
If Kollision(Ball_Eins, Ball_Zwei) Then un das auch?
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 15:04
Die Funktion Kollision (der größere Quelltextteil) musst nach den Variablendeklerationen einfügen.
Das "If Kollision(Ball_Eins, Ball_Zwei) Then" solltest du in den Timer einfügen, wenn du die Kollisionsabfrage über einen Timer handhaben willst (es gibt auch andere Möglichkeiten). Nach dem Then solltest du noch eine Kontrolle einbauen, ob die Kollisionsabfrage auch wirklich funktionniert, beispielsweise eine MessageBox aufrufen.
Ball_Eins und Ball_Zwei musst du natürlich durch die Namen ersetzen, wie du deine Bälle getauft hast.
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 15:08
Stoney hat folgendes geschrieben: | Die Funktion Kollision (der größere Quelltextteil) musst nach den Variablendeklerationen einfügen.
Das "If Kollision(Ball_Eins, Ball_Zwei) Then" solltest du in den Timer einfügen, wenn du die Kollisionsabfrage über einen Timer handhaben willst (es gibt auch andere Möglichkeiten). Nach dem Then solltest du noch eine Kontrolle einbauen, ob die Kollisionsabfrage auch wirklich funktionniert, beispielsweise eine MessageBox aufrufen.
Ball_Eins und Ball_Zwei musst du natürlich durch die Namen ersetzen, wie du deine Bälle getauft hast. |
wenn ich die funktion unter var kopiere, kommen massig viele fehlermeldungen *seuftz*
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm2 = class(TForm) Button1: TButton; shape1: TShape; Timer1: TTimer; shape2: TShape; wand_rechts: TShape; wand_unten: TShape; wand_links: TShape; wandoben: TShape; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Timer1Timer(Sender: TObject); begin
shape1.Top := shape1.Top +10; shape1.left := shape1.Left +10;
shape1.Brush.color := random(color);
shape2.Top := shape2.top -10; shape2.Left := shape2.left -10; shape2.brush.Color := random(color); end;
procedure TForm2.Button1Click(Sender: TObject); begin timer1.Enabled := true;
end;
end. |
dass is mein quelltext
Moderiert von Christian S.: Quote- durch Delphi-Tags ersetzt
Moderiert von Christian S.: Beiträge zusammengefasst
|
|
Thunderwave
      
Beiträge: 35
|
Verfasst: Sa 25.03.06 15:14
Um noch einmal auf das anfangsproblem zurück zu kommen:
Ich würde dir als anfänger, genau wie ich einer bin nicht empfelen ein Jump and run spiel zu bauen. Ich denke das ist ein bisschen kompliziert. Wenn du aber umbedingt was mit bewegung haben möchtest kann ich dir was einfacheres vorschlagen:
Versuch doch mal den Klassiker PONG zu programmieren, das hab selbst ich geschafft.
Den Ball zu bewegen is ganz simpel:
du brauchst:
4 timer:
timer 1 ist für die bewegung nach links
timer 2 ist für die bewegung nach rechts
timer 3 ist für die bewegung nach oben
timer 4 ist für die bewegung nach unten
die anweisung in dem Timer ist dann:
timer 1: left:=left+1
timer 2: left:=left-1
timer 3: top:=top-1
timer 4: top:=top+1
(du kannst entweger die position von nem "o" in nem label verändern oder halt ein Bild von nem ball(image))
jetzt musst du nur noch dafür sorgen das der ball an den wänden reflektiert wird:
wenn der ball startet sind 1(timer 1) und 4(timer 4) aus --> bewegung nach rechts oben
wenn er oben anstößt, also ein bestimmter top wert erreicht ist dann schaltet sich 3 aus und 4 an --> bewegung nach rechts unten
wenn er am rechten schläger anstößt, er also den selben tob und left wert wie der schläger hat, wird 2 ausgeschalten und 1 angemacht --> bewegung nach links unten
usw.
jetzt wird der "ball" an den wänden und am schläger reflektiert
was hällst du von dem vorschlag? du brauchst auch kein directX (is doch viel zu kompliziert)
es ist ein Spiel und es bewegt sich etwas!
MfG Thunderwave
edit by me: ich sollte nicht nur die anfangsfrage sondern auch die antworten der anderen durchlesen...
Zuletzt bearbeitet von Thunderwave am Sa 25.03.06 15:18, insgesamt 1-mal bearbeitet
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 15:16
tm2007 hat folgendes geschrieben: |
wenn ich die funktion unter var kopiere, kommen massig viele fehlermeldungen *seuftz* |
Nicht direkt unter var; ich meinte nach dem implementation.
Falsch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var
Function Kollision(Shape1, Shape2: TShape): Boolean; Begin Result := False; If (Shape1.Left > Shape2.Left) And (Shape1.Top > Shape2.Top) And (Shape1.Left < (Shape2.Left + Shape2.Width)) And (Shape1.Top < (Shape2.Top + Shape2.Height)) Then Result := True; End;
implementation
{$R *.dfm} |
Richtig:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Variable1: Integer;
implementation
{$R *.dfm}
Function Kollision(Shape1, Shape2: TShape): Boolean; Begin Result := False; If (Shape1.Left > Shape2.Left) And (Shape1.Top > Shape2.Top) And (Shape1.Left < (Shape2.Left + Shape2.Width)) And (Shape1.Top < (Shape2.Top + Shape2.Height)) Then Result := True; End; |
Edit:
@Thunderwave: Über kurz oder lang lässt es sich nicht vermeiden eine Grafikschnittstelle wie DirectX, OpenGL oder SDL zu nutzen, wenn man sich mit der Spieleprogrammierung beschäftigen will.
Zuletzt bearbeitet von Stoney am So 26.03.06 10:30, insgesamt 1-mal bearbeitet
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 15:27
ok sry bin halt ein richtiger noop
If Kollision(Ball_Eins, Ball_Zwei) Then das muss in den timer... nur wenn ich das rein kopiere will der ne initialization...
un was muss ich dann hinschreiben...
If Kollision(shape1,shape2) Then shape1.top := -10; and shape2.top := +10; so in etwa=?
un ich hab keine ahnung wie ich das mit den wänden machen soll 
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 15:34
tm2007 hat folgendes geschrieben: | ok sry bin halt ein richtiger noop
|
Keine Sorge, das waren wir auch alle mal.
tm2007 hat folgendes geschrieben: |
If Kollision(Ball_Eins, Ball_Zwei) Then das muss in den timer... nur wenn ich das rein kopiere will der ne initialization...
un was muss ich dann hinschreiben...
If Kollision(shape1,shape2) Then shape1.top := -10; and shape2.top := +10; so in etwa=?
un ich hab keine ahnung wie ich das mit den wänden machen soll  |
Nicht ganz. Der Quelltext sollte folgendermaßen aussehen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm2 = class(TForm) Button1: TButton; shape1: TShape; Timer1: TTimer; shape2: TShape; wand_rechts: TShape; wand_unten: TShape; wand_links: TShape; wandoben: TShape; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form2: TForm2;
implementation
{$R *.dfm}
Function Kollision(Shape_1, Shape_2: TShape): Boolean; Begin Result := False; If (Shape_1.Left > Shape_2.Left) And (Shape_1.Top > Shape_2.Top) And (Shape_1.Left < (Shape_2.Left + Shape_2.Width)) And (Shape_1.Top < (Shape_2.Top + Shape_2.Height)) Then Result := True; End;
procedure TForm2.Timer1Timer(Sender: TObject); begin
shape1.Top := shape1.Top +10; shape1.left := shape1.Left +10;
shape1.Brush.color := random(color);
shape2.Top := shape2.top -10; shape2.Left := shape2.left -10; shape2.brush.Color := random(color);
If Kollision(shape1, shape2) Then Application.MessageBox('Es kollidiert!', 'Nachricht', mb_ok); end;
procedure TForm2.Button1Click(Sender: TObject); begin timer1.Enabled := true; end;
end. |
Ich hoffe mal das funktionniert 
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 15:47
also wenn die beienden shapes auf einander treffen bekommt man keine nachricht es passoert eigentlichj gar nichts...
un wie müsste es gehn, wenn alles von einander abprallen soll?
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 16:10
tm2007 hat folgendes geschrieben: | also wenn die beienden shapes auf einander treffen bekommt man keine nachricht es passoert eigentlichj gar nichts...
|
Hmm... es ist doch etwas komplizierter:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Function Kollision(Shape_1, Shape_2: TShape): Boolean; Function OnPoint(X, Y: Integer; Shape: TShape): Boolean; Begin If (X >= Shape.Left) And (Y >= Shape.Top) And (X < (Shape.Left + Shape.Width)) And (Y < (Shape.Top + Shape.Height)) then Result := True else Result := False; End; Begin Result := False; If OnPoint(Shape_1.Left, Shape_1.Top, Shape_2) Or OnPoint(Shape_1.Left + Shape_1.Width, Shape_1.Top, Shape_2) Or OnPoint(Shape_1.Left, Shape_1.Top + Shape_1.Height, Shape_2) Or OnPoint(Shape_1.Left + Shape_1.Width, Shape_1.Top + Shape_1.Height, Shape_2) Or OnPoint(Shape_2.Left, Shape_2.Top, Shape_1) Or OnPoint(Shape_2.Left + Shape_2.Width, Shape_2.Top, Shape_1) Or OnPoint(Shape_2.Left, Shape_2.Top + Shape_2.Height, Shape_1) Or OnPoint(Shape_2.Left + Shape_2.Width, Shape_2.Top + Shape_2.Height, Shape_1) Then Result := True; End; |
Diese Art der Kollisionsabfrage ist aber für Rechtecke zugeschnitten. Für Kreise müsste man vom den Satz des Pythagoras Gebrauch machen... Ich kann mal schauen, was sich da machen lässt.
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 16:24
also würde das nur für rechtecke funzen?
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 16:28
tm2007 hat folgendes geschrieben: | | also würde das nur für rechtecke funzen? |
Es geht auch mit Kreisen, die Kreise werden aber als Rechtecke betrachtet. Ich habe es vorhin ausprobiert, es funktionniert, ist aber nicht perfekt.
Ach ja und mit dem Abprallen müsstest du am besten eine Variable machen, die du als Geschwindigkeitsfaktor des Shapes nimmst und das bei der Kollision das Vorzeichen ändert.
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: Sa 25.03.06 16:34
oman das hört sich alles SEHR kompliziert an!
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: Sa 25.03.06 16:41
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 26.03.06 08:57
könntest du mir eventuell den quelltext nochmal erklären, falls ich vom lehrer gefragt werden?
un wie funzt das mit den anderen shape, shape2 einfach in nder funktion mit shape3 ersetzen(shape3,4,5,6 sind die wände)?
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 26.03.06 10:20
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm2 = class(TForm) Button1: TButton; shape1: TShape; Timer1: TTimer; shape2: TShape; shape3: TShape; wandunten: TShape; shape4: TShape; wandoben: TShape; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private public end;
var Form2: TForm2; Geschwindigkeit: Integer = 10;
implementation
{$R *.dfm}
Function Kollision(Shape1, Shape2: TShape): Boolean; Function OnPoint(X, Y: Integer; Shape: TShape): Boolean; Begin If (X >= Shape.Left) And (Y >= Shape.Top) And (X < (Shape.Left + Shape.Width)) And (Y < (Shape.Top + Shape.Height)) then Result := True else Result := False; End; Begin Result := False; If OnPoint(Shape1.Left, Shape1.Top, Shape2) Or OnPoint(Shape1.Left + Shape1.Width, Shape1.Top, Shape2) Or OnPoint(Shape1.Left, Shape1.Top + Shape1.Height, Shape2) Or OnPoint(Shape1.Left + Shape1.Width, Shape1.Top + Shape1.Height, Shape2) Or OnPoint(Shape2.Left, Shape2.Top, Shape1) Or OnPoint(Shape2.Left + Shape2.Width, Shape2.Top, Shape1) Or OnPoint(Shape2.Left, Shape2.Top + Shape2.Height, Shape1) Or OnPoint(Shape2.Left + Shape2.Width, Shape2.Top + Shape2.Height, Shape1) Then Result := True; End;
Function Kollision2(Shape1, Shape3: TShape): Boolean; Function OnPoint(X, Y: Integer; Shape: TShape): Boolean; Begin If (X >= Shape.Left) And (Y >= Shape.Top) And (X < (Shape.Left + Shape.Width)) And (Y < (Shape.Top + Shape.Height)) then Result := True else Result := False; End; Begin Result := False; If OnPoint(Shape1.Left, Shape1.Top, Shape3) Or OnPoint(Shape1.Left + Shape1.Width, Shape1.Top, Shape3) Or OnPoint(Shape1.Left, Shape1.Top + Shape1.Height, Shape3) Or OnPoint(Shape1.Left + Shape1.Width, Shape1.Top + Shape1.Height, Shape3) Or OnPoint(Shape3.Left, Shape3.Top, Shape1) Or OnPoint(Shape3.Left + Shape3.Width, Shape3.Top, Shape1) Or OnPoint(Shape3.Left, Shape3.Top + Shape3.Height, Shape1) Or OnPoint(Shape3.Left + Shape3.Width, Shape3.Top + Shape3.Height, Shape1) Then Result := True; End;
procedure TForm2.Timer1Timer(Sender: TObject); begin
shape1.Top := shape1.Top - Geschwindigkeit; shape1.left := shape1.Left - Geschwindigkeit;
shape1.Brush.color := random(color);
shape2.Top := shape2.top + Geschwindigkeit; shape2.Left := shape2.left + Geschwindigkeit; shape2.brush.Color := random(color);
If Kollision(shape1, shape2) Then Geschwindigkeit := Geschwindigkeit * (-1);
If Kollision2(shape1, shape3) Then Geschwindigkeit := Geschwindigkeit * (-1);
end;
procedure TForm2.Button1Click(Sender: TObject); begin timer1.Enabled := true;
end;
end. |
so ahb einfachj ne 2. funktion gemacht mit einer wand(shape3), allerdings is des halt nich ganz perfekt, weil wenn der eine ball die wand berüht, macht der andere auch nen abpraller egal wo er ist, da geschwindigkeit * -1
kannst du mir da nochmal helfen=?
Moderiert von Gausi: Quote- durch Delphi-Tags ersetzt
|
|
Stoney
      
Beiträge: 122
Mac OS X 10.6 "Snow Leopard", Ubuntu Linux 9.04, Mandriva 2010, Win 7, Win Vista, Win XP
Object Pascal (Turbo Delphi, FPC 2.2.4, Lazarus), C++ (Code::Blocks, XCode), Java (Eclipse)
|
Verfasst: So 26.03.06 10:23
tm2007 hat folgendes geschrieben: | | könntest du mir eventuell den quelltext nochmal erklären, falls ich vom lehrer gefragt werden? |
An welchen Stellen hakt's?
tm2007 hat folgendes geschrieben: |
un wie funzt das mit den anderen shape, shape2 einfach in nder funktion mit shape3 ersetzen(shape3,4,5,6 sind die wände)? |
Genau.
Inzwischen habe ich mir noch eine spezielle Kollisionsabfrage für Kreise überlegt. Beachte, dass die Kollisionsabfrage nur unter Kreisen funktionniert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Function Kollision(Shape_1, Shape_2: TShape): Boolean; Var Radius1, Radius2, Linie1, Linie2: Integer; Abstand: Real; Begin Result := False;
Radius1 := Shape_1.Width div 2; Radius2 := Shape_2.Width div 2;
If Shape_1.Left > Shape_2.Left Then Linie1 := Shape_1.Left + Radius1 - Shape_2.Left - Radius2; If Shape_1.Left < Shape_2.Left Then Linie1 := Shape_2.Left + Radius2 - Shape_1.Left - Radius1; If Shape_1.Top > Shape_2.Top Then Linie2 := Shape_1.Top + Radius1 - Shape_2.Top - Radius2; If Shape_1.Top < Shape_2.Top Then Linie2 := Shape_2.Top + Radius2 - Shape_1.Top - Radius1;
Abstand := Sqrt(Sqr(Linie1)+Sqr(Linie2)); If Abstand < (Radius1+Radius2) Then Result := True; End; |
Bestimmt kann man die Kollisionsabfrage noch etwas vereinfachen, aber darüber habe ich mir keine Gedanken gemacht.
Edit:
Das ist bei dir etwas kompliziert geraten. Du brauchst keine zweite Funktion deklarieren, nur die Funktion "Kollision" mit anderen Parameter aufrufen. Und für dein Problem mit dem Abprallen, mach am besten für jeden Ball eine eigene Geschwindigkeitsvariable.
Edit2:
Mach die Quelltexte bitte mit einem Delphi-Tag und nicht als Zitat. 
|
|
tm2007 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 26.03.06 11:16
habs jetzt ersmal mit deinem erstmal vorschlag mit mehren funktionen gemacht....
hab den zweiten ball weggenommen... weil die sonst immer nur gegeneinandern prallen...
aber wenn ejtzt der ball an ne wand prallt, dann geht er immer auf gleichem weg zzürck un nich an verschiedene stellen....
kannst du mir erstmal deine neue idee erklären ?
|
|
|