Seite 1 von 1

split screen

Verfasst: 24.03.2010 19:30
von man-in-black
hab zwar schon via boardsuche u. Goggle geguckt, aber nichts gefunden. (Vllt bin ich aber auch zu blöd zum Suchen :( )

egal, ist es möglich bei einem 2d spiel (+-sprite3d) einen split screen zu erzeugen (oben/unten)?
z.B. für ein spiel, in dessen welt zwei spieler rumlaufen (+scrolling und co.)


mein einziger ansatz wär, die welt mit kleinen Tiles aufzubauen und über die Mitte vom ganzen Screen eine dicke Leiste zu packen,
damit die tiles "scheinbar" stück für stück verschwinden, OHNE auf dem anderen teilscreen aufzutauchen.
bei der version wär aber der fette Balken im Bild (Brett vorm Kopf^^). klar, man kann da anzeigen reinpacken, aber wieso einfach, wenns auch kompliziert geht... :lol:

daher nochmal, gibt es einen weg die beiden Teilscreens direkt aneinanderliegen zu lassen (OHNE abstand)?

Re: split screen

Verfasst: 24.03.2010 20:03
von TomS
Schau mal in der Hilfe nach ClipSprite().

Re: split screen

Verfasst: 24.03.2010 20:27
von man-in-black
mhh, nicht schlecht :lol:
ClipSprite() hat keinen Effekt, wenn es zusammen mit Sprite3D verwendet wird.
nur leider geht es laut Hilfe nicht mir sprite3d...
da ich ein paar effekte mit sprite3d erzeugen möchte, die auch teilweise über das "sichtbare" Bild hinausragen können,
wird diese lösung wohl nicht reichen-.-

trotzdem danke :allright:

hat sonst noch einer ne idee?

Re: split screen

Verfasst: 24.03.2010 21:17
von Fluid Byte

Re: split screen

Verfasst: 24.03.2010 21:24
von man-in-black
thx^^

hab grad gemerkt, dass ich mich ein wenig im unterforum vertan hab
(passt vllt besser bei Grafik&Sound...)
könnte einer meinen fehler ausbügeln?^^
is passiert(bobobo)

Re: split screen

Verfasst: 28.03.2010 20:57
von man-in-black
Und schon wieder ein Problem zum Thema.

ich hab eure beiden codes/befehle mal angeguckt und ausprobiert.

Bild

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.

Bild

(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? :praise:

(wenn ihr mehr infos braucht, sagts)

Re: split screen

Verfasst: 28.03.2010 22:35
von man-in-black
habs geschafft mal 3 screenshots zu erwischen, wo man sieht, was gemeint ist:

Bild

Bild
(männchen ist nicht da, weil er schaden bekommen hat; er blinkt dann)

Bild

sobald das grüne etwas den unteren rand berührt, kommen die ersten striche.
je weiter man geht, desdo mehr kommen... :(

Re: split screen

Verfasst: 29.03.2010 12:27
von man-in-black
habs grad auf zwei anderen PC getestet/testen lassen und da geht es ohne probleme.

dann liegt es also an meiner DX Version oder meinem grafikchip...