Seite 1 von 1

"Handle" von Sprites neu definieren

Verfasst: 07.05.2021 18:59
von Olafmagne
Hallo,
ich habe da ein Problem, zu dem ich keine Lösung finde.

Es geht um folgendes:

Von BlitzBasic bin ich gewohnt, mit der Function HandleImage den Null-Punkt eines Images auf einen anderen Punkt setzen
zB ImageWidth(img)/2,ImageHeight(img),
womit der Null-Punkt In der Mitte x und unteren Rand y sitzt ein Zeichnen des Images wird nun diesen Punkt als Koordinate nehmen!

Giebt es eine Möglichkeit, soetwas in PB mit Sprites zu machen?
Das Image wird ständig gedreht so dass es quasi unmöglich ist,den Punkt "manuell" zu bestimmen

Für anregungen,Hilfe,DLL?,... wäre ich sehr Dankbar

Olaf

Re: "Handle" von Sprites neu definieren

Verfasst: 07.05.2021 23:03
von Burstnibbler
Vorausgesetzt ich habe dein Problem richtig verstanden, würde ich es wahrscheinlich so lösen...

Code: Alles auswählen

EnableExplicit
;
#WIN = 0
#SPR = 0
#PNK = $FF00FF
;
Define.s sprSrc = GetCurrentDirectory() + "Examples\Sources\Data\Geebee2.bmp"
Define.i sprW, sprH, angle
;
InitSprite()
InitKeyboard()
;
OpenWindow(#WIN, 0, 0, 800, 600, "Foo", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#WIN), 0, 0, 800, 600)
;
TransparentSpriteColor(#PB_Default, #PNK)
LoadSprite(#SPR, sprSrc)
sprW = SpriteWidth(#SPR)
sprH = SpriteHeight(#SPR)
;
ClearScreen(#PNK)
DisplaySprite(#SPR, 0, 0)
GrabSprite(#SPR, 0, 0, sprW, sprH * 2)
sprW / 2
;
Repeat
  While WindowEvent() : Wend
  ExamineKeyboard()
  ;
  ClearScreen(0)
  RotateSprite(#SPR, angle, #PB_Absolute)
  DisplayTransparentSprite(#SPR, WindowMouseX(#WIN) - sprW, WindowMouseY(#WIN) - sprH)
  FlipBuffers()
  ; 
  angle = (angle + 2) % 360
  Delay(16)
Until (KeyboardPushed(#PB_Key_Escape))
;

Re: "Handle" von Sprites neu definieren

Verfasst: 08.05.2021 01:17
von Olafmagne
Bingo!

Das PB die images/Sprites um die Mitte Dreht hatte ich vergessen und bin von x,y(0,0) ausgegangen!

hab den Code etwas angepasst,
und das img verändert (höhe verdoppelt und das eigentliche bild soweit runter geschoben,bis der gewünschte Drehpunkt
in der mitte liegt.
Nun dreht 'et sich, wie'et soll!

Code: Alles auswählen

EnableExplicit
;

#PNK = $FF00FF
;
Define sprSrc$ = GetCurrentDirectory() + "Examples\Sources\Data\Geebee22.bmp"
Define.i sprW, sprH, angle
Define win,spr,bee
;
InitSprite()
InitKeyboard()
;
win=OpenWindow(#PB_Any, 0, 0, 800, 600, "", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(win), 0, 0, 800, 600)
;
TransparentSpriteColor(#PB_Default, #PNK)
spr=LoadSprite(#PB_Any, sprSrc$)
sprW = SpriteWidth(spr)
sprH = SpriteHeight(spr)
;
ClearScreen(#PNK)
DisplaySprite(spr, 0, 0)
bee=GrabSprite(#PB_Any, 0, 0, sprW, sprH)
sprW / 2
sprH/2
;
Repeat
  While WindowEvent() : Wend
  ExamineKeyboard()
  ;
  ClearScreen(0)
  RotateSprite(bee, angle, #PB_Absolute)
  DisplayTransparentSprite(bee, WindowMouseX(win) - sprW, WindowMouseY(win) - sprH)
  FlipBuffers()
  ; 
  angle = (angle + 2) % 360
  Delay(25)
Until (KeyboardPushed(#PB_Key_Escape))
;
Merci und , na gute Nacht

Olaf


Edit:

Ich sehe gerade ,das es ja mit einem angepasstem Image nicht mehr nötig ist,das Sprite erst zu zeichnen
und dann zu" grabben", es ist ja schon auf die doppelte grösse deändert worden!
Kann dann weg
Olaf