Sprite3D clippen
-
Kekskiller
- Beiträge: 752
- Registriert: 14.09.2004 21:39
- Kontaktdaten:
Sprite3D clippen
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.
Hab ich aus dem englischen Forum, funktioniert gut:
Sven
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
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Weise weiß, dass er ein Narr ist.
-
Kekskiller
- Beiträge: 752
- Registriert: 14.09.2004 21:39
- Kontaktdaten:
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
@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
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
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.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.
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)(Tiles ab Sprite-Nr. 1000)
Code: Alles auswählen
Nr = Map(x,y)
DisplaySprite(1000+Nr, TX, TY)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.
Der Weise weiß, dass er ein Narr ist.