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 ????
3D-Sprites in Sprite Rendern
- Epyx
- Beiträge: 247
- Registriert: 29.08.2004 01:40
- Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX - Kontaktdaten:
3D-Sprites in Sprite Rendern
If you can't make it good, at least make it look good.
Bill Gates
Bill Gates
- Hroudtwolf
- Beiträge: 1416
- Registriert: 30.10.2004 23:33
- Kontaktdaten:
- Epyx
- Beiträge: 247
- Registriert: 29.08.2004 01:40
- Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX - Kontaktdaten:
@Hroudt
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
Will ich nicht, ich arbeite mit mehreren Sprites die nur bestimmte Bereiche des Bildschirms wiedergeben, also sowas wie DualPlayfield.Du könntest das 3dSprite mit Grabsprite holen.
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
Dachte ich auch, doch das tuts nicht,Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!
If you can't make it good, at least make it look good.
Bill Gates
Bill Gates
Hallo Epyx
Ich hab mal 2 Prozeduren programmiert, mit denen das möglich ist:
Gruß
Stefan
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)
Stefan
-
Hellhound66
- Beiträge: 476
- Registriert: 23.03.2005 23:19
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..
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..