Autor Beitrag
wiefrie94
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 07.04.10 09:56 
hallo
viele hier von euch schon ein pong spiel programmiert.
ich hab das auch versucht hab aber ein problem mit dem bereich des schlägers und mit paneln die ich treffen muss
mein ball hat die form ellipse(x1,y1,x1+20,y1+20)
habt ihr eine idee, wie man so etwas löst?
danke
wiefrie94
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if (y1+20>panel1.top)                                 {wenn der Ball unter dem Panel}
   then if (x1>panel1.left)                           {der Ball recht von der linken Seite des Panels}
    and (x1<(panel1.Left+panel1.Width))               {und links von der rechten Seite des Panel ist}
then  vy:=(-1)*vy;                                    {wird der Ball abgestoßen}

mein problem, ist, dass der ball viel zu hoch abprallt

bei den panels die ich treffen muss ich das problem genau anders herum...der ball geht viel zu tief in das panel hinein bis er abprallt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if (y1+33+vy>panel1.top)                              {wenn der Ball unter dem Panel}
   then if (x1>panel1.left)                           {der Ball recht von der linken Seite des Panels}
    and     (x1<(panel1.Left+panel1.Width))           {und links von der rechten Seite des Panel ist}
then  vy:=(-1)*vy;                                    {wird der Ball abgestoflen}

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 07.04.10 10:10 
Der Ball ist unter dem Panel, wenn Y1>Panel.Top+Panel.Height
Der Ball ist rechts vom Panel, wenn X1>Panel.Left+Panel.Width
Der Ball ist über dem Panel, wenn Y1+20<Panel.Top
Der Ball ist links vom Panel, wenn X1+20<Panel.Left

Abhängig von deiner Geschwindigkeit des Balls wirst du das Problem bekommen, dass der Ball entweder in das Panel eindringt oder sogar ganz durchfliegt.
Bsp:

Panel ist 10 breit, Ball hat einen Radius von 10. Ball fliegt 30. Der Ball ist noch 5 vom Panel entfernt. Wenn du jetzt den Ball um 30 verschiebst ist er auf einmal an dem Panel vorbei. Du müsstest also im Vorraus berechnen, wann der Ball das Panel trifft, und dann für diesen Zeitpunkt die Kollision berechnen. Du kannst das höchstens umgehen, indem du den Ball einfach immer nur um 1 bewegst, aber das in einem Timer machst, der schneller oder langsamer läuft. Dabei würde ich dann das zeichnen unabhängig von der Bewegung machen. Allerdings wird der Timer sehr schnell ungenau wenns um kleine Intervalle geht.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
wiefrie94 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 07.04.10 10:42 
danke
dass hatte ich auch schon vorher versucht, aber das klappt trotzdem nicht so richtig gut
hat jemand ne andere idee?
kann man diesen bereich besser definieren.


noch eine andere frage: gibt es einen befehl mit dem man das timer interval ändert
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 07.04.10 16:19 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst das höchstens umgehen, indem du den Ball einfach immer nur um 1 bewegst, aber das in einem Timer machst, der schneller oder langsamer läuft. [...] Allerdings wird der Timer sehr schnell ungenau wenns um kleine Intervalle geht.

Das ist natürlich Quatsch, du kannst ja einfach 30 mal auf kollision überprüfen in einer Schleife im normalen Timer

user profile iconwiefrie94 hat folgendes geschrieben Zum zitierten Posting springen:

noch eine andere frage: gibt es einen befehl mit dem man das timer interval ändert

ausblenden Delphi-Quelltext
1:
Timer1.Interval:=100;					


user profile iconwiefrie94 hat folgendes geschrieben Zum zitierten Posting springen:
danke
dass hatte ich auch schon vorher versucht, aber das klappt trotzdem nicht so richtig gut
hat jemand ne andere idee?
kann man diesen bereich besser definieren.

Ich vermute mal du meinst mit "das" die Erkennung, wie der Ball/das Panel zueinander liegen.

Am besten du zeichnest dir das mal aufn Blatt Papier, schreibst an die Ecken die x/y koordinaten ran (0/0 ist bei Delphi oben links) und dann siehst du eher, wie es sein muss. Danach könntest du noch ein TRect befüllen mit Position des Balls und mit Position des Panels. Das hilft ggf. bei der Übersicht, da du dann statt Left+Width nur Right schreiben musst. Vernünftige Variablennamen helfen auch immer. Zudem gibts den Typ TPoint, der dir eine X und eine Y Koordinate zur Verfügung stellt (statt X1,Y1 dann Ball.X/Ball.Y).

An sich würde ichs mal so machen:
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:
function Between(Value, V1,V2: real): boolean;
begin
  if (Value>=V1)and(Value<=V2) then
    Result:=True 
  else
    Result:=False;
end;

function GetHit: boolean;
var Ball,Panel: TRect;
    xMatch,yMatch: boolean;
begin
  Ball.Left:=X1;
  Ball.Right:=X1+30;
  Ball.Top:=Y1;
  Ball.Bottom:=?;//Lerneffekt ;)

  Panel.Left:=Panel1.Left;
  Panel.Right:=Panel1.Left+Panel1.Width;
  Panel.Top:=Panel1.Top;
  Panel.Bottom:=?; //Lerneffekt ;)

  //xMatch:=Liegt der Ball von der x position her im/am Panel?
  xMatch:= Between(Ball.Left,Panel.Left,Panel.Right); 
  if xMatch=False then
    xMatch:= Between(Ball.Right,Panel.Left,Panel.Right); 

  yMatch:= Between(Ball.Top,Panel.Top,Panel.Bottom); 
  if yMatch=False then
    yMatch:= ?;   //Lerneffekt 

  if (xMatch) and (yMatch) then
    Result:=True //der Ball liegt im/am Panel
  else
    Result:=False;//der Ball liegt nicht im/am Panel
end;


Möglicherweise ist da auch noch ein Denkfehler drin, habs mir nicht aufgemalt :D

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)