Sprite vergrößern

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Beitrag 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
Benutzeravatar
ParkL
Beiträge: 17
Registriert: 02.11.2004 16:13
Wohnort: Ruhrpott
Kontaktdaten:

Beitrag 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.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Danke euch beiden!
Habs nur für dieses kleine Minispiel gebraucht:
Bubble
greetz
remi
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@remi_meier
schönes prog, gefällt mir. :mrgreen:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

6000 Punkte, saugeil!

eine Alt+F4 "Unterstützung" wär vielleicht ganz nett
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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
Benutzeravatar
ralle
Beiträge: 88
Registriert: 29.11.2004 17:50
Wohnort: Berlin

Re: Sprite vergrößern

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