Sprite vergrößern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Sprite vergrößern

Beitrag 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:
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag von Lukas-P »

Hsllo??? weis das keiner
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag 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
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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. ;)
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Antworten