Und schon wieder ein Problem zum Thema.
ich hab eure beiden codes/befehle mal angeguckt und ausprobiert.
zu clipsprite3d muss ich sagen, dass es zwar das ausgegebene, gedrehte Bild "verkleinert" (blauer Rand),
aber nicht so, wie ich es brauche (roter Rand).
(der große rote rand soll den clipbereich zeigen, den man angibt)
würde ich das sprite3d nicht drehen, wär es eine lösung...
bei usebuffer() hab ich eigt genau das gefunden, was ich gesucht hab, aber durch ausprobieren hab ich gemerkt,
dass es keine sprite3d's unterstützt-.-
(hab anschließend im forum geguckt, ob man es beheben kann und hab massig posts dazu gefunden, aber ohne lösung)
dann hab ich wieder das ganze internet durchforstet nach alternativen zu usebuffer()
und bin in diesem Post fündig geworden:
http://forum.purebasic.com/english/view ... 14&start=0
(englische pb-forum)
ich hab die beiden proceduren ohne veränderung übernommen und sie auch wie im beispielcode aufgerufen.
es funktioniert auch so wie ich es wollte, BIS AUF EINEN "KLEINEN" SCHÖNHEITSFEHLER!
jedesmal, wenn die monster (gedrehte sprite3d's) über den unteren rand des buffers hinausragen,
bekommt JEDES Sprite, egal ob sprite3d oder 2d eine bemahlung in der farbe der monster (s. Bild).
auch wenn andere sprite3d's (z.B. schüsse) über den unteren rand fliegen tritt der fall ein (bloß andere farben)
überlappen 2d sprites den rand (z.B. die bodenkacheln) passiert das ganze nicht.
(rote Linie = unterer Rand des sprites, das ich als buffer nehme;
das monster is leider schon aus dem Bild gelaufen, aber man sieht sehr gut die grün-roten linien auf allen sprites;
ganz unten ist das männchen direkt auf dem screen dargestellt; man sieht, dass das sprite selbst übermalt wird und es nicht beim rendern passiert)
zu meinem code:
er ist ein wenig unübersichtlich, daher werd ich in mal grob beschreiben.
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)
*DD\Release()
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
Repeat
ClearScreen(0)
UseBuffer(kamera(0)\pic) ; das is das Bild, dass ich für spieler1 als buffer nehme
ClearScreen($FF00FF)
For x = 0 To boden_maxx
For y = 0 To boden_maxy
If boden(x,y)
px = x*64-kamera(0)\posx
If px > -64 And px < 1024
py = y*64-kamera(0)\posy
If py > -64 And py < 384
DisplayTransparentSprite(boden(x,y),px,py) ;hab den Boden als Tile in dem array Boden(x,y)
EndIf
EndIf
EndIf
Next
Next
UseBuffer(-1)
Start3D()
SelectRenderSprite(kamera(0)\pic)
RotateSprite3D(spielfigur3D,spieler(0)\winkel,#PB_Absolute)
DisplaySprite3D(spielfigur3D,spieler(0)\posx-kamera(0)\posx-32,spieler(0)\posy-kamera(0)\posy-32)
ForEach gegnerliste()
monsterx = gegnerliste()\posx-kamera(0)\posx ;sind x und y position, wie sie auf dem screen angezeigt werden
monstery = gegnerliste()\posy-kamera(0)\posy
If monsterx + 32 > 0 And monsterx - 32 < 1024 ;unnötiges weglassen...
If monstery + 32 > 0 And monstery - 32 < 385
RotateSprite3D(gegner(gegnerliste()\art)\Pic,gegnerliste()\winkel,#PB_Absolute)
DisplaySprite3D(gegner(gegnerliste()\art)\Pic,monsterx-32,monstery-32)
EndIf
EndIf
Next
SelectRenderSprite(-1)
Stop3D()
UseBuffer(#PB_Default)
DisplayTransparentSprite(kamera(0)\pic,0,0)
FlipBuffers()
Until ...
lasst euch von den vielen structuren/arrays nicht stören...
ich weis, es klingt auf den ersten Blick verwirrend, aber ich bin nun mal kein Held im schreiben und der fehler selbst ist seltsam...
mein verdacht ist, dass es an den proceduren liegt, aber in dem beispiel, aus dem ich sie hab, funktionieren sie ohne probleme.
in meinem Code seh ich den fehler nicht (kann mich nat. irren). komisch ist auch, dass es nur beim unteren rand auftritt. als würde eine reihe (höhe 1pxl) statt auf dem "kamera"-sprite wie'n broadcast auf allen sprites landen...
kann mir einer helfen?
(wenn ihr mehr infos braucht, sagts)