Seite 1 von 1
3D-Sprites in Sprite Rendern
Verfasst: 04.03.2005 16:46
von Epyx
Hi,
Wie der Titel schon sagt würde ich gern ein paar 3D Sprites in ein normales Sprite rendern. Aber irgendwie scheint das auf normalen Weg nicht zu gehen, kennt jemand eine Methode es trotzdem zu machen ????
Verfasst: 04.03.2005 16:52
von Hroudtwolf
Du könntest das 3dSprite mit Grabsprite holen.
Verfasst: 04.03.2005 16:53
von Leo
Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!
Verfasst: 04.03.2005 17:08
von Epyx
@Hroudt
Du könntest das 3dSprite mit Grabsprite holen.
Will ich nicht, ich arbeite mit mehreren Sprites die nur bestimmte Bereiche des Bildschirms wiedergeben, also sowas wie DualPlayfield.
Und da wäre es doch sehr umständlich die 3D Sprites auf dem Bildschirm zu rendern, zu Grabben dann ins Sprite kopieren wobei ich im Playfield-Sprite auch noch eine weitere Hintergrund Ebene habe.
Danach lasse ich erst alle Sprites (Playfields) auf den Screen darstellen.
Schön wäre es, wenn ich die 3D Sprites direkt in den Speicher der Sprites rendern lassen könnte.
@Leo
Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!
Dachte ich auch, doch das tuts nicht,
Verfasst: 04.03.2005 17:31
von Stefan
Hallo Epyx
Ich hab mal 2 Prozeduren programmiert, mit denen das möglich ist:
Code: Alles auswählen
Structure DDPIXELFORMAT
dwSize.l
dwFlags.l
dwFourCC.l
dwRGBBitCount.l
dwRBitMask.l
dwGBitMask.l
dwBBitMask.l
dwRGBAlphaBitMask.l
EndStructure
Structure DDCOLORKEY
dwColorSpaceLowValue.l
dwColorSpaceHighValue.l
EndStructure
Structure DDSCAPS2
dwCaps.l
dwCaps2.l
dwCaps3.l
dwCaps4.l
EndStructure
Structure DDSURFACEDESC2
dwSize.l
dwFlags.l
dwHeight.l
dwWidth.l
lPitch.l
dwBackBufferCount.l
dwRefreshRate.l
dwAlphaBitDepth.l
dwReserved.l
lpSurface.l
ddckCKDestOverlay.DDCOLORKEY
ddckCKDestBlt.DDCOLORKEY
ddckCKSrcOverlay.DDCOLORKEY
ddckCKSrcBlt.DDCOLORKEY
ddpfPixelFormat.DDPIXELFORMAT
ddsCaps.DDSCAPS2
dwTextureStage.l
EndStructure
Structure PB_Sprite
Sprite.l
Width.w
Height.w
Depth.w
Mode.w
FileName.l
RealWidth.w
RealHeight.w
ClipX.w
ClipY.w
EndStructure
#DDSD_WIDTH=4
#DDSD_HEIGHT=2
#DDSD_CAPS=1
#DDSCAPS_3DDEVICE=8192
#DDSCAPS_OFFSCREENPLAIN=64
Global *D3DDevice.IDirect3DDevice7
Global *BackBuffer.IDirectDrawSurface7
Procedure CreateRenderSprite(Sprite,Width,Height)
Result=CreateSprite(Sprite,Width,Height)
If Result=0:ProcedureReturn 0:EndIf
*PBSprite.PB_Sprite=IsSprite(Sprite)
*DDS.IDirectDrawSurface7=*PBSprite\Sprite
*DDS\GetDDInterface(@*DD.IDirectDraw7)
*DDS\Release()
DDSD.DDSURFACEDESC2
DDSD\dwSize=SizeOf(DDSURFACEDESC2)
DDSD\dwFlags=#DDSD_WIDTH|#DDSD_HEIGHT|#DDSD_CAPS
DDSD\dwWidth=Width
DDSD\dwHeight=Height
DDSD\ddsCaps\dwCaps=#DDSCAPS_3DDEVICE|#DDSCAPS_OFFSCREENPLAIN
Result=*DD\CreateSurface(DDSD,*PBSprite,0)
If Result:ProcedureReturn 0:EndIf
ProcedureReturn *PBSprite\Sprite
EndProcedure
Procedure SelectRenderSprite(Sprite)
!extrn _PB_Direct3D_Device
!MOV Eax,[_PB_Direct3D_Device]
!MOV [p_D3DDevice],Eax
!extrn _PB_DirectX_BackBuffer
!MOV Eax,[_PB_DirectX_BackBuffer]
!MOV [p_BackBuffer],Eax
*D3DDevice\EndScene()
Select Sprite
Case -1
*D3DDevice\SetRenderTarget(*BackBuffer,2)
Default
*D3DDevice\SetRenderTarget(PeekL(IsSprite(Sprite)),2)
EndSelect
*D3DDevice\BeginScene()
EndProcedure
;Example:
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
OpenScreen(640,480,16,"Collision detection with 3D-Sprites")
CreateRenderSprite(0,181,181)
CreateRenderSprite(1,181,181)
TransparentSpriteColor(0,255,0,255)
TransparentSpriteColor(1,255,0,255)
LoadSprite(5,"C:\PureBASIC2\Examples\Sources\Data\GeeBee2.bmp",#PB_Sprite_Texture) ;Pfad anpassen !
CreateSprite3D(5,5)
Repeat
ExamineKeyboard()
ExamineMouse()
ClearScreen(0,0,0)
UseBuffer(0)
ClearScreen(255,0,255);Clear Sprite 0
UseBuffer(1)
ClearScreen(255,0,255);Clear Sprite 1
UseBuffer(-1)
Start3D()
SelectRenderSprite(0);Draw the 3D-Sprite on Sprite 0
Angle1+2
RotateSprite3D(5,Angle1,0)
DisplaySprite3D(5,27,27)
SelectRenderSprite(1);Draw the 3D-Sprite on Sprite 1
Angle2-2
RotateSprite3D(5,Angle2,0)
DisplaySprite3D(5,27,27)
SelectRenderSprite(-1);Draw on Backbuffer
Stop3D()
DisplayTransparentSprite(0,MouseX(),MouseY())
DisplayTransparentSprite(1,200,100)
If SpritePixelCollision(0,MouseX(),MouseY(),1,200,100)
StartDrawing(ScreenOutput())
FrontColor(255,255,0)
DrawingMode(1)
DrawingFont(GetStockObject_(#ANSI_FIXED_FONT))
DrawText("Collision !")
StopDrawing()
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Gruß
Stefan
Verfasst: 05.03.2005 17:53
von Epyx
Juhu danke Stefan, klappt einwandfrei und ist sogar ne Pixel Kollision mit drin. Schon richig krass brauchbar der Source, auf jedenfall was fürs Code Archive!
Verfasst: 05.03.2005 22:03
von Andre
Epyx hat geschrieben:Juhu danke Stefan, klappt einwandfrei und ist sogar ne Pixel Kollision mit drin. Schon richig krass brauchbar der Source, auf jedenfall was fürs Code Archive!
Yup, schon abgespeichert

Verfasst: 03.07.2005 02:04
von Hellhound66
Wo ich das hier gerade durchlese, habe ich ein anderes Problem:
Ich möchte ein 3DSprite während der Laufzeit verändern. Damit meine ich nicht, den MESH zu verändern, sondern die Textur. Wie kann ich ein #PB_TEXTURE_SPRITE verändern, wenn schon ein MESH (3DSprite) zugewiesen wurde? Beim mir funktioniert das überhaupt nicht. Und über zig Backbuffer möchte ich das nicht erreichen..