| Autor |
Beitrag |
wiefrie94
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
Delphi-Quelltext 1: 2: 3: 4:
| if (y1+20>panel1.top) then if (x1>panel1.left) and (x1<(panel1.Left+panel1.Width)) then vy:=(-1)*vy; |
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
Delphi-Quelltext 1: 2: 3: 4:
| if (y1+33+vy>panel1.top) then if (x1>panel1.left) and (x1<(panel1.Left+panel1.Width)) then vy:=(-1)*vy; |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Xion
      

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)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      

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)
|
Verfasst: Mi 07.04.10 16:19
Xion hat folgendes geschrieben : | | 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
wiefrie94 hat folgendes geschrieben : |
noch eine andere frage: gibt es einen befehl mit dem man das timer interval ändert |
Delphi-Quelltext
wiefrie94 hat folgendes geschrieben : | 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:
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:=?; Panel.Left:=Panel1.Left; Panel.Right:=Panel1.Left+Panel1.Width; Panel.Top:=Panel1.Top; Panel.Bottom:=?; 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:= ?; if (xMatch) and (yMatch) then Result:=True else Result:=False;end; |
Möglicherweise ist da auch noch ein Denkfehler drin, habs mir nicht aufgemalt 
_________________ 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)
|
|
|