Ich weis nicht genau ob es euch etwas bringt, oder ob es sowas schon gibt,
aber ich habe mit dem Code von Stargate etwas experimentiert.
Dabei ist mir aufgefallen, das meine Sprites verkehrt herum waren.
Ansonsten habe ich nur eine Kleinigkeit geändert.
Das Rotationscentrum wird nun innerhalb des Sprites verschoben und das
Sprite auch um das Centrum rotiert.
Ich habe ein Beispiel programmiert, damit könnt ihr ein wenig spielen...
Ich denke dann seht ihr selber wie es funktioniert.
Drago
Hier der Code:
Code: Alles auswählen
;****************************************************************************************
; Verändertes TransformSprite3D
; Ursprungsautor : Stargate
; Dieb/Bastler : Drago
; Sternenzeit : 31. Juli 2011 / 23.59 Uhr
;****************************************************************************************
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D()=0 Or InitSound()=0 Or InitMouse()=0
MessageRequester("Error", "Can't open DirectX 7 or later", 0)
End
EndIf
If OpenScreen(1024,768,32,"Test")=0
MessageRequester("Error", "Can't open Screen", 0)
End
EndIf
SetFrameRate(30)
; Zoom und Rotate und Display von einem Sprite3D
; ----------------------------------------------
; Sprite - Nummer des Anzuzeigenen Sprite
; x - X-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
; y - Y-Positon des Mittelpunks bzw. Rotationspunkts vom Sprite
; xx - Breite des Sprite
; yy - Höhe des Sprite
; w - Rotationswinkel des Sprite (in Grad, wobei 0° Richtung Osten ist)
; dx - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
; auf dem Sprite in X-Richtung
; dy - Verschiebt den Mittelpunkt und damit auch den Rotationspunkt
; auf dem Sprite in Y-Richtung
; h - Transparenz des Sprite (0 Transparent, 255 voll sichtbar)
Procedure DisplayZoomRotateSprite3D(Sprite, x, y, xx, yy, w.f, dx, dy, h)
Protected r.f, t.f, w1.f, w2.f, w3.f, w4.f
x - xx/2
y - yy/2
w - 90
If w < 0: w+360: EndIf
w = w * (#PI/180)
r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
t.f = ATan(xx/yy)
w1.f = w - t : w2.f = w + t : w3.f = w + #PI - t : w4.f = w + #PI + t
TransformSprite3D(Sprite, Cos(w1)*r, Sin(w1)*r, Cos(w2)*r, Sin(w2)*r, Cos(w3)*r, Sin(w3)*r, Cos(w4)*r, Sin(w4)*r)
DisplaySprite3D(Sprite, x +Cos(w)*dy+Sin(w)*dx+dx, y+Sin(w)*dy-Cos(w)*dx+dy, h)
EndProcedure
Global Sprite1_GL.l = CreateSprite( #PB_Any, 128, 128, #PB_Sprite_Texture )
StartDrawing( SpriteOutput(Sprite1_GL) )
DrawingMode( #PB_2DDrawing_Outlined )
Box( 0, 0, 128, 128, RGB( 255, 255, 0 ) )
For I = 1 To 8
LineXY( 0, 59 + I, 128, 59 + I, RGB( 20*I, 20*I, 255 ))
Next
StopDrawing()
Sprite1_GL = CreateSprite3D( #PB_Any, Sprite1_GL)
x = 512
y = 384
xx = 128
yy = 128
dx = 0
dy = 0
w = 135
Repeat
ClearScreen(0)
Start3D()
Sprite3DQuality(0)
DisplayZoomRotateSprite3D(Sprite1_GL, x, y, xx, yy, 0, 0, 0, 80 )
DisplayZoomRotateSprite3D(Sprite1_GL, x, y, xx, yy, w, dx, dy, 255)
Stop3D()
StartDrawing(ScreenOutput())
DrawingMode( #PB_2DDrawing_Outlined | #PB_2DDrawing_Transparent )
Circle( 380, 40, 4, RGB( 255, 0, 0 ) )
Plot ( 380, 40, RGB( Random(255), Random(255),255 ) )
Circle( x + dx - xx / 2, y+dy - yy / 2, 4, RGB( 255, 0, 0 ) )
Plot( x + dx - xx / 2, y + dy - yy / 2, RGB( Random(255), Random(255),255 ) )
DrawText( 410, 30, "= RotationsCentrum", RGB( 255, 255, 255 ) )
DrawText( 250, 600," Corsor links/rechts verschiebt das Rotationsxentrum auf der x - Achse", RGB( 255, 255, 255 ) )
DrawText( 250, 620," Corsor hoch/runter verschiebt das Rotationsxentrum auf der y - Achse", RGB( 255, 255, 255 ) )
DrawText( 250, 640," + = erhöht den Rotationswinkel", RGB( 255, 255, 255 ) )
DrawText( 250, 660," - = erniedrigt den Rotationswinkel", RGB( 255, 255, 255 ) )
StopDrawing()
FlipBuffers()
Delay(1)
ExamineKeyboard()
If KeyboardPushed( #PB_Key_Left )
dx - 1
EndIf
If KeyboardPushed( #PB_Key_Right )
dx + 1
EndIf
If KeyboardPushed( #PB_Key_Up )
dy - 1
EndIf
If KeyboardPushed( #PB_Key_Down )
dy + 1
EndIf
If KeyboardPushed( #PB_Key_Add )
w + 1
If w > 360: w - 360: EndIf
EndIf
If KeyboardPushed( #PB_Key_Subtract )
w - 1
If w < 0: w + 360: EndIf
EndIf
Until KeyboardPushed( #PB_Key_Escape)