pinball abprallwinkel

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Peak7810

Betreff: pinball abprallwinkel

BeitragDi, Jan 20, 2009 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ich tu mich mit winkelfunktionen immer etwas schwer, könnte mir jemand sagen, ob es eine formel gibt, wie man den winkel der flugrichtung des balls bestimmt, wenn er in einem bestimmten winkel auf die schläger unten oder auch andere objekte stösst?

mir geht es nur darum, für die restlichen physikalischen dinge habe ich schon eine lösung gefunden.

viel vielen dank

tedy

BeitragDi, Jan 20, 2009 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn der Ball auf etwas gerades Trifft dann gilt Einfallswinkel = Ausfallswinkel.
Ich weiß aber nicht wie das bei Rundungen ist
01010100 01100101 01000100 01111001 00100000 00111010 01000100

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 20, 2009 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist eine Möglichkeit. Ob es die beste ist, wage ich zu bezweifeln.

Code: [AUSKLAPPEN]
;*****************************************
;Collision detection and rebounding angles
;-----------------------------------------
;Andrew Constant ukandrewc@aol.com
;-----------------------------------------
;There are faster ways to detect line/ball
;collisions, but this way, you can have
;any line position & any sprite shape
;*****************************************

Const SW=800
Const SH=600


Type IMG
   Field hi,ix,iw
   Field x#,y#,xi#,yi#
End Type

Type PNT
   Field hi,ix
   Field x,y
End Type

Type OBS
   Field hi,ix,a
   Field x,y,w,h
   Field x1,y1,x2,y2
End Type

;Title bits
Global t$="Angles, balls and walls"
Global ts=-StringWidth(t$)
Global tx=0

;Image and wall indeces
Global bc=0
Global wc=0
Global pc=0


Global sp=3
Global repCount

Global oik=LoadSound("oik.wav")
Global wait=CreateTimer(30)

SeedRnd MilliSecs()
Graphics SW,SH,0,2

;Create some random balls
For c=1 To 5
   CreateBall(64,Rand(128,255),Rand(128,255))
Next

;Create some bollards
Restore BollardData
For c=1 To 5
   Read x,y
   CreatePoint x,y,255,255,0
Next

.BollardData
Data 200,150
Data 250,300
Data 400,350
Data 100,400
Data 550,070

Restore WallData
For c=1 To 9
   Read x1,y1,x2,y2
   CreateWall x1,y1,x2,y2,Rand(128,255),Rand(128,255),192
Next

.WallData
Data 010,010,629,010
Data 629,010,629,469
Data 629,469,010,469
Data 010,469,010,010

Data 150,70,550,150
Data 580,220,520,400
Data 200,220,500,220
Data 200,420,450,400
Data 170,350,70,150


;enable double buffering
SetBuffer BackBuffer()

;loop until ESC pressed...
While Not KeyDown(1)
   MoveBalls()
   While KeyDown(57)
;Pause while space pressed
   Wend
Wend
End


Function MoveBalls()
   c=WaitTimer(wait)
   
   Cls
   Color 255,255,255
;Draw walls
   For wall.obs=Each OBS
      DrawImage wall\hi,wall\x,wall\y
      Text wall\x+(wall\w/2),wall\y+(wall\h/2),Str$(wall\a),True,True
      Text wall\x1,wall\y1,"*",True,True
      Text wall\x2,wall\y2,"*",True,True
   Next
   
;Draw rebound points
   For point.pnt=Each PNT
      DrawImage point\hi,point\x,point\y
      Text point\x,point\y,point\ix,True,True
   Next
   
;Draw & check balls for collision
   For ball.img=Each IMG
      
      ball\x=ball\x+ball\xi
      ball\y=ball\y+ball\yi
      DrawImage ball\hi,ball\x,ball\y
      
;Draw line in front of ball
      ang=ATan2(ball\yi,ball\xi)
      cx=ball\x+16
      cy=ball\y+16
      Line cx,cy,cx+15*Cos(ang),cy+15*Sin(ang)
      Text cx,cy,ang,True,True
      
      collide=False
      
;Check other balls
      For ball2.Img=Each IMG
         If ball2<>ball Then
            If ImagesCollide(ball\hi,ball\x,ball\y,0,ball2\hi,ball2\x,ball2\y,0) Then
               ang=ATan2(ball\y-ball2\y,ball\x-ball2\x)
               collide=True
            EndIf
         EndIf
      Next
      
;Check rebound points
      If collide=False Then
         For point.pnt=Each PNT
            If ImagesCollide(ball\hi,ball\x,ball\y,0,point\hi,point\x,point\y,0) Then
               ang=ATan2(ball\y-point\y,ball\x-point\x)
               collide=True
            EndIf
         Next
      EndIf
      
;Check walls
      If collide=False Then
         For wall.obs=Each OBS
            
;Check x1,y1 end points
            If ImageRectCollide(ball\hi,ball\x,ball\y,0,wall\x1,wall\y1,1,1) Then
;Rebound away from line but keep some ball direction
               ang=ATan2(wall\y1-wall\y2,wall\x1-wall\x2)+(ang/2)
               repCount=repCount+1
               collide=True
               
;Check x2,y2 end points
            ElseIf ImageRectCollide(ball\hi,ball\x,ball\y,0,wall\x2,wall\y2,1,1) Then
;Rebound away from line but keep some ball direction
               ang=ATan2(wall\y2-wall\y1,wall\x2-wall\x1)+(ang/2)
               collide=True
               
;Check mid line
            ElseIf ImagesCollide(ball\hi,ball\x,ball\y,0,wall\hi,wall\x,wall\y,0) Then
;Rebound compound of ball and wall angles
               ang=-ang+(wall\a*2)
               collide=True
            EndIf
         Next
      EndIf
      
      If collide Then
;New ball direction
         ball\xi=sp*Cos(ang)
         ball\yi=sp*Sin(ang)
;Do extra move away
         ball\x=ball\x+ball\xi
         ball\y=ball\y+ball\yi
      EndIf
      
   Next
   
   tx=tx+2
   If tx=640 Then tx=ts
   Color 255,255,0
   Text tx,12,t$
   
;swap front and back buffers
   Flip 0
   
End Function


;*************************
Function CreateBall(r,g,b)
   
   bc=bc+1
   ball.img = New IMG
   
   ball\x=50
   ball\y=50
   
   ang=Rand(0,360)
   ball\xi=sp*Cos(ang)
   ball\yi=sp*Sin(ang)
   
   ball\hi=CreateImage(32,32)
   SetBuffer ImageBuffer(ball\hi)
   
;Anti-alias it a bit
   Color 96,96,96
   Oval 0,0,32,32
   
;Draw main ball
   Color r,g,b
   Oval 1,1,30,30
   
   Color 0,0,0
;Text 16,16,Str$(bc),True,True
   
End Function


;*************************************
Function CreateWall(x1,y1,x2,y2,r,g,b)
   
   wall.obs=New OBS
   
   wc=wc+1
   wall\ix=wc
   wall\y1=y1
   wall\y2=y2
   wall\x1=x1
   wall\x2=x2
   
;Size of the image
   w=Abs(x1-x2)
   h=Abs(y1-y2)
   wall\w=w
   wall\h=h
   
;Adjust from real world co-ords
   If x1>x2 Then
      wall\x=x2
      x1=w:x2=0
   Else
      wall\x=x1
      x2=w:x1=0
   EndIf
   
   If y1>y2 Then
      wall\y=y2
      y1=h:y2=0
   Else
      wall\y=y1
      y2=h:y1=0
   EndIf
   
;Keep the line's angle
   a=ATan2(y2-y1,x2-x1)
   wall\a=a
   
;Adjust To give correct rebound
   If a>0 And a<90 Then wall\a=a
   If a>90 And a<180 Then wall\a=a-180
   
;Create & draw wall image
   wall\hi=CreateImage(w+1,h+1)
   SetBuffer ImageBuffer(wall\hi)
   Color r,g,b
   Line x1,y1,x2,y2
   
End Function


;******************************
Function CreatePoint(x,y,r,g,b)
   
   point.pnt=New PNT
   
   pc=pc+1
   
   point\ix=pc
   point\x=x
   point\y=y
   point\hi=CreateImage(1,1)
   SetBuffer ImageBuffer(point\hi)
   
;Draw the point
   Color r,g,b
   Plot 0,0
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group