Immer noch Probleme mit der Schwerkraft

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

EPS

Betreff: Immer noch Probleme mit der Schwerkraft

BeitragSo, März 21, 2004 1:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 02, 2004 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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! Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group