3D-Sprites in Sprite Rendern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
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

Beitrag 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 ????
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Du könntest das 3dSprite mit Grabsprite holen.
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!
Benutzeravatar
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:

Beitrag 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,
If you can't make it good, at least make it look good.
Bill Gates
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag von Stefan »

Hallo Epyx
Ich hab mal 2 Prozeduren programmiert, mit denen das möglich ist: :D

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
Benutzeravatar
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:

Beitrag 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!
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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 :allright:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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..
Antworten