Seite 1 von 1

Normales Sprite zoomen ? Kein 3d

Verfasst: 16.01.2006 09:23
von mull
Wie bekomme ich ein normales 2D Sprite größer/kleiner ?
Finde keinen Befehl dafür, außer bei Image und Srite3D.

Verfasst: 16.01.2006 11:26
von Ypser
Geht nicht, soweit ich weiss.

Aber wieso nicht ein Sprite3D benutzen?

Verfasst: 16.01.2006 12:19
von Zaphod
du kommst aber an den drawingbuffer ran, sowas kannst du also selbst schreiben.

Verfasst: 16.01.2006 12:40
von SoS
Stefan hat geschrieben: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

Verfasst: 16.01.2006 13:43
von mull
Danke, klappt prima.
Hab es noch so umgeschrieben, das das Orginal Sprite nicht geändert wird.
Eigendlich sollte so ein Haus + Hof Befehl doch Standardmäßig enthalten sein.

Verfasst: 16.01.2006 14:28
von Konne
Das wird dir bei PB öffter passieren, dass es einen Haus + Hof Befehl nicht gibt. Dann muss man halt zB in der Purearea oder im Board (den post gabs schon mal) suchen.

Verfasst: 16.01.2006 18:04
von AndyX
Bei C wirste nichtmal nen Delay Befehl vorgefertigt finden :wink:

Verfasst: 16.01.2006 19:40
von MVXA
Sleep_()? Naja gut, du musst windows.h mit einbinden, hast aber dann
trotzdem ein Befehl um das Programm kurzzeitig zu stoppen.

Verfasst: 16.01.2006 20:32
von Lukaso
mull hat geschrieben:Eigendlich sollte so ein Haus + Hof Befehl doch Standardmäßig enthalten sein.
Naja, dann kommen aber wieder 1000. andere leute die den Befehl xyz haben wollen. Man sollte nie vergessen, dass es sich um eine Programmiersprache handelt. Und da ist es ja der zweck zu Programmieren was es nicht gibt :wink:

Lukas

Verfasst: 16.01.2006 20:58
von Zaphod
AndyX:

Sleep? Allegro? SDL? DircectX? Clanlib?

finde dein post ziemlich unreflektiert...