Immer noch Probleme mit der Schwerkraft
Übersicht

![]() |
EPSBetreff: Immer noch Probleme mit der Schwerkraft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich schon wieder.
Es geht nochmal um die Kugeln die sich stapeln sollen. Ich hab mittlerweile die Kollision der Kugeln und auch die Gravitation recht gut hinbekommen (Wer meine vorige Frage verfolgt hat). Ein Problem hab ich allerdings immer noch. Die Kugeln prallen richtig voneinander ab und werden auch langsamer. Sie fallen auch nach unten wie sie sollen. Dort allerdings kommen sie einfach nicht zur Ruhe!!! Ich kann die Engine auch so umschreiben das die Kugeln die am Boden liegen ruhig bleiben. Die Kugeln die darüber liegen allerdings "hippeln" ständig herum. Ich weis nicht mehr weiter wie ich das lösen kann. hat jemand ne Idee? Code: [AUSKLAPPEN] Graphics 800,600,0,1
font = LoadFont("Tahoma.ttf",12,1) SetFont font Type ball Field x# Field y# Field dx# Field dy# Field col End Type Global D=50 ;--> Balldurchmesser Global L=50 ;--> Levelgrenzen Global R=750 Global O=50 Global U=550 L=L+D:R=R-D:O=O+D:U=U-D ;--> Wertkorrektur ;--> Erzeuge 10 Bälle For t=0 To 9: Createball(): Next ti=CreateTimer(100) SetBuffer BackBuffer() Repeat Cls If MouseHit(2) Then CreateBall() For c.ball = Each ball ;--> Reibungsverlust c\dx=c\dx*.99 c\dy=c\dy*.99 ;--> Schwerkraft c\dy#=c\dy+.2 ;--> Wandkollision If c\x<L Then c\x=L: c\dx=c\dx*-0.8 If c\x>R Then c\x=R: c\dx=c\dx*-0.8 If c\y<O Then c\y=O: c\dy=c\dy*-0.8 If c\y>U Then c\y=U: c\dy=c\dy*-0.8 ;--> neuen Vektor errechnen c\y=c\y+c\dy c\x=c\x+c\dx Next ;--> Ballkollision For c.ball = Each ball For c2.ball = Each ball If c2<>c Then abstand# = Sqr((c2\x - c\x) ^ 2 + (c2\y - c\y) ^ 2) If abstand<D Then collNormalAngle# = ATan2(c2\y - c\y, c2\x - c\x) moveDist# = (D - abstand) / 2 c\x = c\x + moveDist * Cos(collNormalAngle + 180) c\y = c\y + moveDist * Sin(collNormalAngle + 180) c2\x = c2\x + moveDist * Cos(collNormalAngle) c2\y = c2\y + moveDist * Sin(collNormalAngle) nX# = Cos(collNormalAngle) nY# = Sin(collNormalAngle) a1# = c\dx * nX + c\dy * nY a2# = c2\dx * nX + c2\dy * nY Abprall# = a1 - a2 c\dx = c\dx - (Abprall * nX) c\dy = c\dy - (Abprall * nY) c2\dx = c2\dx + (Abprall * nX) c2\dy = c2\dy + (Abprall * nY) End If End If Next Next ;--> Anzeigen For c.ball = Each ball Color 0,0,c\col Oval (c\x-D/2,c\y-D/2,D,D,1) Next Color 255,255,255 Text 400,10,"Rechter Mausklick erzeugt neuen Ball",1 Text 400,30,"Ende mit ESC",1 Line L-D/2,O-D/2,R+D/2,O-D/2 Line R+D/2,O-D/2,R+D/2,U+D/2 Line R+D/2,U+D/2,L-D/2,U+D/2 Line L-D/2,U+D/2,L-D/2,O-D/2 Flip WaitTimer(ti) If KeyHit(1) Then Exit Forever FreeFont font End Function CreateBall() c.ball = New ball c\x = Rnd(L,R) c\y = Rnd(O,O+100) c\dx = Rnd(-10,10) c\dy = Rnd(-10,10) c\col = Rnd(100,255)*$10000+Rnd(100,255)*$100+Rnd(100,255) End Function |
||
![]() |
MBC |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
[edit] sorry, ich bin ein Idiot! Ich habe übersehen, dass du das was ich gemacht habe ja auch gemacht hast... tschuldigung nochmal, werd mich aber noch mal dahinterklemmen, wenn ich mehr Zeit habe als jetzt... vile Glück noch...[/edit] Ich hab mir den Code mal 'n bisschen angeguckt und würde auf den ersten Blick sagen, dass bei der letzten Zeile der "Wandkollission" das Problem liegt. Denn irgendwas *0.8 kann nie 0 ergeben außer *0), also hippeln die Bälle immer (<-- meine Erklärung dafür, keine Ahnung ob das stimmt) Ich habs mal mit ner Variable probiert, die langsam runtergezählt wird, also so: Code: [AUSKLAPPEN] z=1 . . . ;--> Wandkollision If c\x<L Then c\x=L: c\dx=c\dx*-0.8 If c\x>R Then c\x=R: c\dx=c\dx*-0.8 If c\y<O Then c\y=O: c\dy=c\dy*-0.8 If c\y>U Then z#=z#-0.001 If z#<0 Then z#=z#+0.001 c\y=U: c\dy=c\dy*-z# EndIf Wahrscheinlich müsstest du z# für jeden Ball unterschiedlich definieren, denn ich beherrsche (noch) keine Types. Ich hoffe, ich konnte dir ein bisschen helfen... Mit freundlichen Grüßen MBC |
||
Computer sind auch nur Menschen! ![]() |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group