weil es gerade wieder "hoch kam", würde ich euch bitte mal folgenden Code zu testen.
Quelle: ClipSprite3D for DirectX7 / DirectX9 (x86/x64) (Fluid Byte)
Voraussetzung: DirectX 9 , PB 4.50
Was soll passieren: Ein kleines Sprite3D (32x32), oben links zu sehen, soll mittels ClipSprite3D gekachelt werden und mit RotateSprite3D und ZoomSprite3D behandelt werden wie ein großen Sprite3D,
dabei soll die Kachelung auch innerhalb des anzeigebereiches, sich bewegen.
Code: Alles auswählen
InitSprite()
InitSprite3D()
; DirectX9
Structure D3DTLVERTEX
x.f:y.f:z.f
rhw.f:Color.l
tu.f:tv.f
EndStructure
Structure PB_DX9Sprite3D
TexRes.i ; TexRes
Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
TmpVertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
Width.l ; width set with ZoomSprite3D()
Height.l ; height set with ZoomSprite3D()
RealWidth.l
RealHeight.l
Angle.f
Transformed.l
EndStructure
Procedure ClipSprite3D(Sprite3D, x, y, Width, Height)
Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
With *Sprite3D
\Vertice[0]\tu = x / \RealWidth
\Vertice[0]\tv = y / \RealHeight
\Vertice[1]\tu = (x + Width) / \RealWidth
\Vertice[1]\tv = y / \RealHeight
\Vertice[2]\tu = x / \RealWidth
\Vertice[2]\tv = (y + Height) / \RealHeight
\Vertice[3]\tu = (x + Width) / \RealWidth
\Vertice[3]\tv = (y + Height) / \RealHeight
EndWith
EndProcedure
OpenWindow(0, 0, 0, 800, 600, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)
Sprite3DQuality(1)
CreateSprite(1, 32, 32, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0,0,16,16,$FFFF00)
Box(16,16,16,16,$00FFFF)
StopDrawing()
CreateSprite3D(1, 1)
Repeat
ClearScreen(0)
Start3D()
ClipSprite3D(1, 0, 0, 32, 32)
RotateSprite3D(1, 0, #PB_Absolute)
ZoomSprite3D(1, 32, 32)
DisplaySprite3D(1, 128, 64)
Time.f = ElapsedMilliseconds()/1000
ClipSprite3D(1, Mod(Time*50,256), Mod(Time*70,256), 256, 256)
RotateSprite3D(1, Time*25, #PB_Absolute)
ZoomSprite3D(1, 256, 256)
DisplaySprite3D(1, 128, 128)
Stop3D()
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
Wenn dieser Code wirklich nahezu überall läuft, würde ich von nun an diese Art der Kachelung nutzen, statt dem "normalen" For-Schleifen.