Autor Beitrag
tm2007
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 user profile iconChristian S.: Abgeteilt von [url=www.delphi-forum.de/...hp?t=8643]hier[/url]
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 14:47 
user profile icontm2007 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.

user profile icontm2007 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:

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

(...)
  // Einfügen, wo du es brauchst: z.B. in einem Timer
  If Kollision(Ball_Eins, Ball_Zwei) Then // Was auch immer passieren soll
  // Wenn die Wand auch ein Shape ist, würde es genauso gehen
(...)


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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 25.03.06 14:53 
vielen dank... probiers gleich aus :D
tm2007 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 25.03.06 14:56 
also muss ich das

ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 25.03.06 15:08 
user profile iconStoney 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*



ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Beiträge zusammengefasst
Thunderwave
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 15:16 
user profile icontm2007 hat folgendes geschrieben:

wenn ich die funktion unter var kopiere, kommen massig viele fehlermeldungen *seuftz*


Nicht direkt unter var; ich meinte nach dem implementation. :oops:

Falsch:

ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var Variable1: Integer;
// etc.

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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 :oops:
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 15:34 
user profile icontm2007 hat folgendes geschrieben:
ok sry bin halt ein richtiger noop ;)

Keine Sorge, das waren wir auch alle mal. ;)

user profile icontm2007 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 :oops:


Nicht ganz. Der Quelltext sollte folgendermaßen aussehen:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 16:10 
user profile icontm2007 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 25.03.06 16:24 
also würde das nur für rechtecke funzen?
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 16:28 
user profile icontm2007 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 25.03.06 16:34 
oman das hört sich alles SEHR kompliziert an!
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: Sa 25.03.06 16:41 
user profile icontm2007 hat folgendes geschrieben:
oman das hört sich alles SEHR kompliziert an!

Kollisionsabfragen sind nie leicht :)

Hier mal ein (ungetester Versuch), wie es mit dem Abprallen klappen könnte:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
[...]
Var 
  Form2: TForm2;
  Geschwindigkeit: Integer = 10;
[...]

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


end;
tm2007 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 26.03.06 10:20 
ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconGausi: Quote- durch Delphi-Tags ersetzt
Stoney
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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)
BeitragVerfasst: So 26.03.06 10:23 
user profile icontm2007 hat folgendes geschrieben:
könntest du mir eventuell den quelltext nochmal erklären, falls ich vom lehrer gefragt werden?

An welchen Stellen hakt's?

user profile icontm2007 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



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