[B2D] ToeB's BallPhysik
Übersicht

![]() |
ToeBBetreff: [B2D] ToeB's BallPhysik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bastle grad an einer kleinen BallPhysik für 2D Spiele. Ziel ist es, das sich kreisrunde objecte (egal was auf ihenn gemalt werden soll) sich Physikalisch korrekt verhalten. Man soll diese Engine in beliebigen spielen anwenden können (z.B. Billiard, Minigolf, Pingpong oder anderen sachen).
Meine Engine kann bisher : ![]() ![]() ![]() ![]() ![]() ![]() Hier der Download : http://www.toebproductions.de/Blitz/BallPhysik.rar Und der Code damit die Moderatoren nicht merkern ![]() BlitzBasic: [AUSKLAPPEN] Const GRWidth = 800 Have fun ! mfg ToeB P.S: Schreibt bitte was ![]() |
||
- Zuletzt bearbeitet von ToeB am Mo, Sep 14, 2009 17:01, insgesamt einmal bearbeitet
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn 2 bälle zusammenprallen(ball 1 steht ball2 trifft ball1 genau mittig) müsste theoretisch ball 2 stehen bleiben und die gesammte energie an ball 1 übergeben.. tut er aber nicht..
*anmerk* aber auf den ersten blick schönes stückchen code |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja da sitz ich auch schon die ganze zeit dran... ka muss ich mir nochmal überlegen ... bin jetzt auch einfach zu müde ![]() mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
kräfteparallelogramm is das zauberwort.
spiele selbst pool billard und hab mich damit mal befasst wann wieviel kraft(anteilsmäßig gesehen auf den bällen bleibt) fals du infos zu braucht(und für erweiterungen bezgl effet) einfach PN |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
So ich habe jetzt eine neue Version. Dank meines Vaters habe ich jetzt endlich eine annäherde Lösung (st nicht perfect, aber was ist schon perfekt ![]() ![]() Hier der neue Code (download oben bleibt so) : Code: [AUSKLAPPEN] Const GRWidth = 800
Const GRHeight = 600 Graphics GRWidth,GRHeight,16,2 SetBuffer BackBuffer() Type ball Field midx#,midy# Field radius# Field speedx#,speedy# Field move End Type Global GravityY# = 0.0 Global GravityX# = 0 Const AirAcc# = 0.991 Global timer = CreateTimer(60) CreateBall(200,300,20) CreateBall(160,280,20) CreateBall(160,320,20) CreateBall(120,340,20) CreateBall(120,300,20) CreateBall(120,260,20) CreateBall(500,300,20) Repeat If MouseHit(1) MouseOldX = MouseX() MouseOldY = MouseY() MousePress = 1 EndIf If MousePress = 1 absx# = (MouseOldX-MouseX()) absy# = (MouseOldY-MouseY()) radius# = 20;Sqr(absx*absx+absy*absy) If MouseDown(1) = 0 MousePress = 0 CreateBall(MouseOLDX,MouseOldY,radius) EndIf EndIf If MouseHit(2) tmpBall.ball = GetBall(MouseX(),MouseY()) If tmpBall <> Null tmpBall\move = 0 MousePress = 2 MouseOldX = tmpBall\midx MouseOldY = tmpBall\midy EndIf EndIf If MousePress = 2 absx# = (MouseOldX-MouseX()) absy# = (MouseOldY-MouseY()) speed# = Sqr(absx*absx+absy*absy) winkel# = ATan2(absy,absx) If MouseDown(2) = 0 MousePress = 0 tmpBall\move = 1 MoveBall(tmpBall,-Cos(winkel)*speed/10.0,-Sin(winkel)*speed/10.0) EndIf EndIf If KeyHit(28) If GravityY = 0 GravityY = 0.1 Else GravityY = 0 EndIf EndIf UpdateBalls(1) Cls DrawDebug() If MousePress = 1 Color 0,255,0 Oval MouseOldX-radius,MouseOldY-radius,radius*2,radius*2,0 ElseIf MousePress = 2 Color 0,0,255 Line MouseOldX,MouseOldY,MouseX(),MouseY() Line MouseX(),MouseY(),MouseX()+Cos(winkel+30)*15,MouseY()+Sin(winkel+30)*15 Line MouseX(),MouseY(),MouseX()+Cos(winkel-30)*15,MouseY()+Sin(winkel-30)*15 Line MouseX()+Cos(winkel+30)*15,MouseY()+Sin(winkel+30)*15,MouseX()+Cos(winkel-30)*15,MouseY()+Sin(winkel-30)*15 EndIf Color 255,255,0 Text 0,0,"Maustaste Links (drücken + halten) - Ball erstellen" Text 0,15,"Maustaste Rechts (drücken + halten) - Ball bewegen" Text 0,30,"Enter - Gravitation ein/ausschalten ("+(GravityY<>0)+")" Rect MouseX()-2,MouseY()-2,5,5 WaitTimer(timer) Flip 0 Until KeyHit(1) End Function CreateBall.ball(x_pos#,y_pos#,radius#) tmp.ball = New ball tmp\midx = x_pos tmp\midy = y_pos tmp\move = 1 tmp\radius = radius Return tmp End Function Function MoveBall(b.ball,speedx#,speedy#) b\speedx = speedx b\speedy = speedy End Function Function GetBall.ball(x_pos#,y_pos#) For b.ball = Each ball absz# = Sqr((x_pos-b\midx)*(x_pos-b\midx)+(y_pos-b\midy)*(y_pos-b\midy)) If absz <= b\radius Return b Next Return Null End Function Function UpdateBalls(FrameSpeed#=1) For b.ball = Each ball ;Bälle bewegen If b\move = 1 b\midx = b\midx + b\speedx * FrameSpeed b\midy = b\midy + b\speedy * FrameSpeed b\speedx = (b\speedx * (AirAcc-FrameSpeed/1000)) + GravityX * FrameSpeed b\speedy = (b\speedy * (AirAcc-FrameSpeed/1000)) + GravityY * FrameSpeed ; b\speedx = b\speedx * AirAcc * FrameSpeed ; b\speedy = b\speedy * AirAcc * FrameSpeed ;Auf rand Prüfen If b\midx-b\radius < 0 Then b\midx = b\radius : b\speedx = b\speedx * -0.5 If b\speedx < 0.5 And b\speedx > - 0.5 b\speedx = 0 EndIf If b\midx+b\radius > GRWidth Then b\midx = GRWidth-b\radius : b\speedx = b\speedx * -0.5 If b\speedx < 0.5 And b\speedx > - 0.5 b\speedx = 0 EndIf If b\midy+b\radius > GRHeight Then b\midy = GRHeight-b\radius : b\speedy = b\speedy * -0.5 If b\speedy < 0.5 And b\speedy > - 0.5 b\speedy = 0 EndIf If b\midy-b\radius < 0 Then b\midy = b\radius : b\speedy = b\speedy * -0.5 If b\speedy < 0.5 And b\speedy > - 0.5 b\speedy = 0 EndIf ;Auf Kollison mit anderen Bällen prüfen For b2.ball = Each ball If b2 <> b If RectsOverlap(b\midx-b\radius,b\midy-b\radius,b\radius*2,b\radius*2,b2\midx-b2\radius,b2\midy-b2\radius,b2\radius*2,b2\radius*2) absx# = (b2\midx - b\midx) absy# = (b2\midy - b\midy) absb# = Sqr(absx*absx+absy*absy) gesb# = b2\radius + b\radius If absb < gesb absb = gesb - absb + 1 winb# = ATan2(absy,absx) newwx# = Cos(winb) newwy# = Sin(winb) b\midx = b\midx - newwx * absb b\midy = b\midy - newwy * absb b2\midx = b2\midx + newwx * absb b2\midy = b2\midy + newwy * absb win_s# = ATan2(b\speedy,b\speedx) win_ab# = AbsW(winb,win_s) win_n# = winb + win_ab + 180 abs_n# = Sqr(b\speedx*b\speedx + b\speedy*b\speedy) win_n2# = Absw(win_s,winb + win_ab) win_s2# = ATan2(b2\speedy,b2\speedy) win_ab2# = Sqr(b2\speedx*b2\speedx + b2\speedy*b2\speedy) b2\speedx = Cos(win_s2)*win_ab2 + abs_n*Cos(winb)*( 1 - Sin( win_n2 ) ) * 0.5 b2\speedy = Sin(win_s2)*win_ab2 + abs_n*Sin(winb)*( 1 - Sin( win_n2 ) ) * 0.5 b\speedx = abs_n * Cos(win_n) * 0.5 b\speedy = abs_n * Sin(win_n) * 0.5 Exit EndIf EndIf EndIf Next EndIf Next End Function Function DrawDebug() For b.ball = Each ball Color 255,0,0 Oval b\midx-b\radius,b\midy-b\radius,b\radius*2,b\radius*2,0 Color 0,255,0 Plot b\midx,b\midy Next End Function Function AbsW#(win1#,win2#) If win1 < 180.0 And win1 => 0 Then win1 = 360 + win1 If win2 < 180.0 And win2 => 0 Then win2 = 360 + win2 Return (win1-win2) End Function |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wenn du ie Masse nicht beachtest,dann musst du einfach die Geschwindigkeiten beim aufprall vertauschen. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Eisvogel hat Folgendes geschrieben: Also wenn du ie Masse nicht beachtest,dann musst du einfach die Geschwindigkeiten beim aufprall vertauschen.
Und wenn er die Masse beachtet, ist es auch nicht viel schwerer, denke ich. Das Zauberwort hier lautet Impulserhaltung: m1 * v1 = m2 * v2 (Masse1 * Geschwindigkeit1 = Masse2 * Geschwindigkeit2) |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da muss ich dir leider wieder sprechen, den wenn man die Masse bechtet, dann muss man auch die Energie beachten, sonst müsste ein Flummi wenn man ihn an die Wand wirft, einfach runterfallen. Ergo, kommt ein Ball mit kleiner Masse auf einen ruhenden Ball mit großer Masse, so prallt der Ball mit kleiner Masse mit weniger Impuls zurück und der große bewegt sich mit dem Impuls fort, den der kleine Ball verloren hat.
So wie der Flummi von der Wand, nur das man da die Bewgung der Wand nicht sieht. EDIT: Hier noch ein Link zu Impuls: http://de.wikipedia.org/wiki/Impuls |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die masse wird erst später berücksichtigt...
Außerdem kann man nicht eifach so die Geschwindigkeiten tauschen (zumindest Programmatisch nicht), da die Geschwindigkeiten auch die Flugrichtung angeben. Auch gilt das mit dem Tauschen nur wenn Ball a genau auf Ball b trifft, streift er ihn beispielsweise nur, dann lenkt Ball a sich nur ein wenig ab und Ball b wird minimal beschleunigt. Sonst würde jetzt Ball a stehen bleiben und Ball b mit hohe geschwindigkeit davon zischen, nicht sehr realistisch . mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da hste auch recht, man muss auf so vieles achten. Uff | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey das wird mir sicherlich helfen thx | ||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der Eisvogel hat Folgendes geschrieben: Da muss ich dir leider wieder sprechen, den wenn man die Masse bechtet, dann muss man auch die Energie beachten, sonst müsste ein Flummi wenn man ihn an die Wand wirft, einfach runterfallen. Ergo, kommt ein Ball mit kleiner Masse auf einen ruhenden Ball mit großer Masse, so prallt der Ball mit kleiner Masse mit weniger Impuls zurück und der große bewegt sich mit dem Impuls fort, den der kleine Ball verloren hat.
So wie der Flummi von der Wand, nur das man da die Bewgung der Wand nicht sieht. EDIT: Hier noch ein Link zu Impuls: http://de.wikipedia.org/wiki/Impuls In dem Fall hast du Recht, ich meinte eigentlich nur die Kugel-Kugel Kollision. Oder so ähnlich, ich bin mir gerade nicht sicher, was genau passend wäre, da müsste ich jetzt ein wenig überlegen. ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group