Sprite3D clippen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Sprite3D clippen

Beitrag von Kekskiller »

Gibts eine Möglichkeit, ein Sprite3D zu clippen? Ich meine, ich baue momentan auf SpecialFX auf und das ist nicht sonderlich schnell im Gegensatz zu den 3D-Funktion (nicht zuletzt zurückzuführen auf ein 3D-Karte). Ich müsste sonst nähmlich theoretisch jedes Tile meines Tile-Sets als Sprite3D ausschneiden... Das ist mir zu speicherfressend und aufwändig. Mit clippen meine ich, dem Programm klar zu machen, welchen Ausschnitt des Sprite er zeichnen soll.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Hab ich aus dem englischen Forum, funktioniert gut:

Code: Alles auswählen

;- Sprite3D zuschneiden

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 D3DTLVERTEX 
  sx.f 
  sy.f 
  sz.f 
  rhw.f 
  color.l 
  specular.l 
  tu.f 
  tv.f 
EndStructure 

Structure PB_Sprite3D 
  Texture.IDirectDrawSurface7 ; DirectDrawSurface7 
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite 
  width.w          ; width set with ZoomSprite3D() 
  Height.w       ; height set with ZoomSprite3D() 
  unknown.l 
EndStructure 

Procedure ClipSprite3D(Sprite3D, ClipX ,ClipY ,ClipWidth, ClipHeight) 
  *Sprite3D.PB_Sprite3D = IsSprite3D(Sprite3D) 
  
  If *Sprite3D = 0
    ProcedureReturn 0
  EndIf 
  *DDS.IDirectDrawSurface7 = *Sprite3D\Texture 
  
  DDSDESC.DDSURFACEDESC2 
  DDSDESC\dwSize = SizeOf(DDSURFACEDESC2) 
  result = *DDS\GetSurfaceDesc(DDSDESC) 
  If result
    ProcedureReturn 0
  EndIf 
  
  *Sprite3D\Vertice[0]\tu = ClipX / DDSDESC\dwWidth 
  *Sprite3D\Vertice[0]\tv = ClipY / DDSDESC\dwHeight 
  
  *Sprite3D\Vertice[1]\tu = (ClipX + ClipWidth) / DDSDESC\dwWidth 
  *Sprite3D\Vertice[1]\tv = ClipY / DDSDESC\dwHeight 
  
  *Sprite3D\Vertice[2]\tu = ClipX / DDSDESC\dwWidth 
  *Sprite3D\Vertice[2]\tv = (ClipY + ClipHeight) / DDSDESC\dwHeight 
  
  *Sprite3D\Vertice[3]\tu = (ClipX + ClipWidth) / DDSDESC\dwWidth 
  *Sprite3D\Vertice[3]\tv = (ClipY + ClipHeight) / DDSDESC\dwHeight 
  
  ProcedureReturn 1 
EndProcedure
Sven
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

warum nimmst du keine einzelnen sprites statt eines zusammenhängenden tilesets?

in der Graka brauchen die gleich viel platz.
und die paar header mehr sollten deine festplatte auch nicht überanspruchen.
und wenn du se in ein unterverzeichnis packst, dann behältst du auch die übersicht.

wenn du in jedem frame dein tileset auseinanderschnibbeln willst, ist deine performance schnell im eimer.
allein ein clipsprite befehl für jedes angezeigte tile (wenns nich 3Dsprites wären) wär mir schon zu viel.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Vielen Dank, werds gleich mal ausprobieren, Antwort kommt als Nachtrag.

@Kaeru Gaman: Aber du hast Recht würde gleich viel verbrauchen... Nur mit dem Clippen gebe ich dir nicht recht. Der Clipp-Befehl hat bei mir keinerlei Auswirkung, es werden ja lediglich Render-Start und -Ende angegeben, also nur, von wo beim nächsten Zeichnen angefangen werden soll. Das ist kein großer Performance-Verlust. Ich zumindest hattest noch nie Probleme damit, ev. ist das ja bei dir anders so.

Thema Einzelsprites: Bei bis zu 200 Tiles in einem Set will ich keinem Leveleditor zumuten, alles selbst zusammenschnippeln zu müssen ;) . Zumal ich lieber die Übersicht habe, ist Gewohnheitssache (kommt wohl vom RPgmakern).

EDIT: Klappt wunderbar! Sven, kannst du mir noch sagen, von wem der Quelltext ist? Ich bin nähmlich bestrebt, diesmal wirklich ALLE eingebundenen Codes mit Name der Ersteller zu versehen :D
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Nee, mußt Du mal im englischen Forum suchen, einfach nach einem Teil des Codes, zum Beispiel dem Proc-Name.

Sven
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Kekskiller hat geschrieben:Der Clipp-Befehl hat bei mir keinerlei Auswirkung, es werden ja lediglich Render-Start und -Ende angegeben, also nur, von wo beim nächsten Zeichnen angefangen werden soll.
der performance-unterschied des clip-befehls selber besteht darin, dass das clip überhaupt aufgerufen werden muss, also schon mal ein zusätzlicher call mit inhalt.

dazu kommt (bei meiner herangehensweise) noch, dass ich kompliziert umrechnen muss, denn ich muss ja aus der in der Map übergebenen Tile-Nr. den clipping-bereich berechnen.

beispiel 1:
(tileset 16x16Tiles, à 32x32pix)

Code: Alles auswählen

Nr = Map(x,y)
TileLine = Nr/16 : TileRow = Nr-16*TileLine
ClipSprite(#tileset, 32*TileRow, 32*TileLine, 32, 32)
DisplaySprite(#tileset, TX, TY)
beispiel 2:
(Tiles ab Sprite-Nr. 1000)

Code: Alles auswählen

Nr = Map(x,y)
DisplaySprite(1000+Nr, TX, TY)
klar kann man die berechnung noch optimieren, aber grundsätzlich bleibt das problem:
man muss den clipping-bereich vorberechnen, und das clipping ausführen.

je nachdem, was für performance-kritische sachen noch im game passieren sollen (komplexe gegner-KI) bietet die arbeit mit getrennten tiles irgendwann deutliche vorteile.


> Bei bis zu 200 Tiles in einem Set will ich keinem Leveleditor zumuten, alles selbst zusammenschnippeln zu müssen

versteh ich nich. wo ist das problem?
ist nur die frage, wie du deinen leveleditor programmierst.

oder meinst du menschlichen leveleditor?

also, ich persönlich erzeuge Tiles grundsätzlich als einzelsprites, kann mir das auch nicht anders vorstellen.
also müsste man doch sowieso neu designte tiles zu nem set zusammenschnibbeln, wenn die engine ein set zum clippen haben will.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten