Seite 2 von 2

Verfasst: 04.11.2004 20:51
von remi_meier
@S.M.
Kann man irgendwie die Kantenglättung ausschalten bei deinem Code? Ich bekomme beim Zoomen so immer schwarze Ränder.
Danke :mrgreen:
remi

Verfasst: 05.11.2004 10:45
von Stefan
Hi remi_meier

Entweder du erstellst dein Sprite im Hauptspeicher(#PB_Sprite_Memory)
oder du verwendest diese langsame Funktion:

Code: Alles auswählen

Procedure ResizeSpriteWithoutAA(Sprite,Width,Height);Gibt bei Fehler 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  
  
  *DDS\GetDC(@DC)
  *DDS2\GetDC(@DC2)
  SetStretchBltMode_(DC2,#COLORONCOLOR)
  StretchBlt_(DC2,0,0,Width,Height,DC,0,0,SpriteWidth(Sprite),SpriteHeight(Sprite),#SRCCOPY)
  *DDS\ReleaseDC(DC)
  *DDS2\ReleaseDC(DC2)
 
  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
Gruß
Stefan

Verfasst: 05.11.2004 16:43
von ParkL
Hm. Also ich würde das ganz anders machen. Lade die Sprites die du brauchst immer zuerst als "normales" Image. Danach malst du das Sprite mit startdrawing(spriteoutput()) auf ein leeres sprite und benutzt es dann.

Wenn Du dann einen resize benötigst, greifst du einfach auf das Original-Image zu und machst ein neues Sprite auf das Du ein resiztes Image draufmalst.

Sowas ähnliches hab ich auch schonmal benutzt, das ist performanter als man denkt.

Verfasst: 07.11.2004 10:54
von remi_meier
Danke euch beiden!
Habs nur für dieses kleine Minispiel gebraucht:
Bubble
greetz
remi

Verfasst: 08.11.2004 19:38
von nco2k
@remi_meier
schönes prog, gefällt mir. :mrgreen:

c ya,
nco2k

Verfasst: 08.11.2004 21:57
von bluejoke
6000 Punkte, saugeil!

eine Alt+F4 "Unterstützung" wär vielleicht ganz nett

Verfasst: 08.11.2004 22:03
von remi_meier
Rekord von mir im Moment: 8800 8)
Bedienung: ESC zum Abbrechen, P für Pause
Neuer Link: http://mypage.bluewin.ch/remimeier/zip/Bubble.zip

Re: Sprite vergrößern

Verfasst: 23.06.2010 15:46
von ralle
Der Thread ist zwar schon ein bisl älter, aber da ich gerade das selbe Problem hatte und finde, dass die bisher geposteten Codes unnötig komplex sind poste ich mal, ganz nach ParkL's Ansatz meine Lösung:

Code: Alles auswählen

UseJPEGImageDecoder()
InitKeyboard()
InitSprite()

image.l = LoadImage(#PB_Any, "background.jpg")

OpenScreen(1024, 768, 32, "testImageResizeToSprite")

w.l = 700
h.l = 200

sprite.l = CreateSprite(#PB_Any, w, h)

ResizeImage(image, w, h)
StartDrawing(SpriteOutput(sprite))
DrawImage(ImageID(image), 0, 0)
StopDrawing()

Repeat
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(sprite, 0, 0)
    FlipBuffers()
    ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

CloseScreen()
End
Vielleicht kann das ja irgendwer brauchen.

mfG
Ralle

PS: Funktioniert bei mir mit DX7, sowie auch DX9 als Subsystem.