Seite 1 von 2

Sprite vergrößern

Verfasst: 26.10.2004 12:01
von Lukas-P
Hallo ich ahb da mal ne kleine dumme Frage:

Wie kann ich ein Sprite Strecken???




danke schonmal im Voraus :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Verfasst: 26.10.2004 13:32
von Lukas-P
Hsllo??? weis das keiner

Verfasst: 26.10.2004 13:48
von KeyKon
ResizeImage(#Image, Breite, Höhe)
ist das einzige was mir spontan einfällt
und wenns dir wichtig ist sowas kann man auch selber schreiben /:->

KeyKon

Verfasst: 26.10.2004 13:59
von Lukas-P
Danke für die Idee. Darauf bin ich noch bnicht gekommen :oops: . ich hab mir das jetzt selber geschrieben

Code: Alles auswählen

Procedure Resizesprite(endsprite,pfad$,breite,weite)
LoadImage(100,pfad$)
ResizeImage(100,breite,weite)
SaveImage(100,"rezize.bmp")
LoadSprite(endsprite,"rezize.bmp")
EndProcedure

Verfasst: 26.10.2004 16:34
von PMV
Für Sprites ... wie wäre es mit der Sprite3D Lib, oder kommt die für dich nicht in Frage?

Code: Alles auswählen

TransformSprite3D(#Sprite3D, x1, y1, [z1], x2, y2, [z2], x3, y3, [z3], x4, y4, [z4]) 
^^müsstest nur wissen, wie man damit umgeht, aber dafür ist die PB Hilfe ja da :wink:

MFG PMV

Verfasst: 30.10.2004 00:37
von Andre
PMV hat geschrieben:Für Sprites ... wie wäre es mit der Sprite3D Lib, oder kommt die für dich nicht in Frage?

Code: Alles auswählen

TransformSprite3D(#Sprite3D, x1, y1, [z1], x2, y2, [z2], x3, y3, [z3], x4, y4, [z4]) 
^^müsstest nur wissen, wie man damit umgeht, aber dafür ist die PB Hilfe ja da :wink:
Tzzz, tzzz... :wink:

Ich kenn mich mit den 3D-Sachen selbst nur wenig aus, daher kann ich diese Hilfe nicht selbst erweitern. Wer gute Vorschläge hat, nur her damit. :D

Verfasst: 30.10.2004 01:16
von Ynnus
3DSprites sind leider dadurch etwas beschränkt, dass sie immer gleiche Proportionen haben müssen, also 32 x 32, 64 x 64, 128 x 128. Wenn man beliebig große Sprites vergrößern oder verkleinern will, hätte man da auf manchen Systemen ein problem da es da zu Fehlern kommen kann wenn die Größen nicht korrekt sind. Also die Idee mit Umwandlung in Image, Größenänderung und zurück find ich garnicht schlecht. ;)

Verfasst: 01.11.2004 00:32
von blbltheworm
könnte man nicht mit CatchImage() irgendwie das Sprite in ein Image kopieren, dann resizen und zurück in ein Sprite Kopieren (das dann mit CatchSprite()).
Ich hab nur leider keine Ahnung wie das geht :oops:, bräuchte es jedoch selbst auch.

Verfasst: 01.11.2004 17:13
von PMV
3DSprites sind leider dadurch etwas beschränkt, dass sie immer gleiche Proportionen haben müssen, also 32 x 32, 64 x 64, 128 x 128. Wenn man beliebig große Sprites vergrößern oder verkleinern will, hätte man da auf manchen Systemen ein problem da es da zu Fehlern kommen kann wenn die Größen nicht korrekt sind.
:| ... oh je stimmt ja -_- irgend wie bin immer nur von der annahme aus gegangen, das nur das Anfangssprite diese maße haben muss -_-.

Naja, aber es heißt doch, das neuere Grafikkarten das können, egal welche Größe die Sprites haben ... kommt also auf sein Anwendungsgebiet hat /:->

Hm, ging es denn, wenn man ein Sprite belibieg Transformiert (mit 3D Sprite) und dieses dann in ein normales Sprite umwandelt. Oder würde das dann bei diesen Systemen, wo zwischengrößen nicht funktioniert, das ganze auch nicht klappen?

Ich kann so was leider nicht testen, ich hab ein System wo ich damit bis jetzt noch keine Probleme hatte <)

MFG PMV

Verfasst: 02.11.2004 10:54
von Stefan
Hallo

Hier ein Lösungsvorschlag,der DirectDraw benutzt:

Code: Alles auswählen

#DDBLT_WAIT=16777216

Structure PB_Sprite
  Sprite.l
  Width.w
  Height.w
  Depth.w
  Mode.w
  FileName.l
  RealWidth.w
  RealHeight.w
  ClipX.w
  ClipY.w
EndStructure


Procedure ResizeSprite(Sprite,Width,Height);Gibt bei Fehlern 0 zurück.
  If Width<=0 Or Height<=0:ProcedureReturn 0:EndIf
  
  *Sprite.PB_Sprite=IsSprite(Sprite)
  If *Sprite=0:ProcedureReturn 0:EndIf
  
  *DDS.IDirectDrawSurface7=*Sprite\Sprite
  If *DDS=0:ProcedureReturn 0:EndIf
  
  *DDS\GetDDInterface(@*DD.IDirectDraw7)
  If *DD=0:ProcedureReturn 0:EndIf
  
  DDSD=AllocateMemory(124)
  If DDSD=0:ProcedureReturn 0:EndIf
  
  PokeL(DDSD,124)
  If *DDS\GetSurfaceDesc(DDSD):FreeMemory(DDSD):ProcedureReturn 0:EndIf
  PokeL(DDSD+8,Height)
  PokeL(DDSD+12,Width)
  
  If *DD\CreateSurface(DDSD,@*DDS2.IDirectDrawSurface7,0):FreeMemory(DDSD):ProcedureReturn 0:EndIf
  
  rect.RECT
  rect\left=0
  rect\right=Width
  rect\top=0
  rect\bottom=Height
  If *DDS2\Blt(rect,*DDS,0,#DDBLT_WAIT,0):FreeMemory(DDSD):*DDS\Release():ProcedureReturn 0:EndIf
 
  FreeMemory(DDSD)
  *DDS\Release()
  *Sprite\Sprite=*DDS2
  *Sprite\Width=Width
  *Sprite\Height=Height
  *Sprite\RealWidth=Width
  *Sprite\RealHeight=Height
  *Sprite\ClipX=0
  *Sprite\ClipY=0
  ProcedureReturn *DDS2
EndProcedure


;Test:
InitSprite()
InitKeyboard()

OpenScreen(800,600,16,"ResizeSprite()")

CreateSprite(1,128,128)
StartDrawing(SpriteOutput(1))
For M=0 To 500
  Circle(Random(128),Random(128),10,Random($FFFFFF))
Next
BackColor(0,0,0)
FrontColor(255,255,0)
DrawingFont(GetStockObject_(#ANSI_VAR_FONT))
DrawText("Press enter to quit.")
StopDrawing()


DisplaySprite(1,0,0)

ResizeSprite(1,256,128)
DisplaySprite(1,128,0)

ResizeSprite(1,256,256)
DisplaySprite(1,384,0)

ResizeSprite(1,100,100)
DisplaySprite(1,640,0)

FlipBuffers()

Repeat
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Return)

Gruß
Stefan