Seite 1 von 1
Sprite zentriert zoomen
Verfasst: 18.07.2017 12:52
von AnonymousForAll
Hi
Ich brauche eure Hilfe. Ich habe ein Screen und ein Sprite und möchte mein Sprite zoomen. Das klappt auch. Aber ich möchte dass er mittig zoomt.
Mein Code
Code: Alles auswählen
Define MainX = 100
Define MainY = 100
Define X
Define Y
InitSprite()
InitKeyboard()
LoadFont(1, "Arial", 10)
If OpenScreen(1920, 1080, 32, "")
SetFrameRate(60)
CreateSprite(1, 5000, 500)
If StartDrawing(SpriteOutput(1))
For X=0 To SpriteWidth(1)
If X % 50 = 0
DrawText(MainX+X, MainY+60, Str(X/50), RGB(255, 255, 255))
EndIf
Next
StopDrawing()
EndIf
Repeat
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
DisplaySprite(1, MainX, MainY)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
MainX+10
EndIf
If KeyboardPushed(#PB_Key_Right)
MainX-10
EndIf
If KeyboardPushed(#PB_Key_Up)
;MainX-5 ; <<< reicht nicht aus, irgendeine Berechnungsformel brauche ich
ZoomSprite(1, SpriteWidth(1)+20, SpriteHeight(1)+2)
EndIf
If KeyboardPushed(#PB_Key_Down)
;MainX+5 ; <<< reicht nicht aus, irgendeine Berechnungsformel brauche ich
ZoomSprite(1, SpriteWidth(1)-20, SpriteHeight(1)-2)
EndIf
Until KeyboardReleased(#PB_Key_Escape)
EndIf
Erklärung : Mit den Tasten RECHTS und LINKS bewegt man das Sprite hin und her und mit den Tasten OBEN und UNTEN zoomt man rein und raus. Wenn ich zoome dann zommt er relativ auf 0,0. Ich möchte aber dass er auf aktuelles MainX zoomt so dass er immer mittig zoomt. Wie mache ich das? Ich bin zu dumm um mir eine Berechnungsformel auszudenken. Ich brauche daher eure Hilfe.

Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 12:55
von NicTheQuick
Wenn du das Sprite um 20 Pixel nach rechts vergrößerst, musst du es einfach 10 Pixel weiter links anzeigen, also von MainX 10 abziehen. Also immer die Hälfte.
Würde man den Code etwas umstrukturieren, könnte man es vielleicht etwas eleganter lösen, aber vielleicht reicht dir dieser Tipp ja schon.
Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 13:00
von AnonymousForAll
Danke NicTheQuick aber das klappt nicht. Das habe ich auch schon probiert. Ich habe beim Zoom MainX-10 eingefügt aber wenn du es startest siehst du beim ersten zoomen sofort dass das Sprite sich zur Seite bewegt. Viel schneller als der Zoom selbst. Da ist auf jeden Fall eine Formel notwendig.

Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 13:22
von NicTheQuick
Das Sprite wird so genau mittig gezoomt. Deine Mitte ist am Anfang aber außerhalb des Bildschirms. Was du aber offfenbar willst, ist das Sprite aus der Mitte des Bildschirms heraus zu zoomen. Das ist natürlich etwas komplizierter. Ich habe noch die Maus dazu genommen. So kannst du genau an die Stelle zoomen, auf die die Maus zeigt:
Code: Alles auswählen
Define.d MainX.d = 0, MainY.d = 100
Define X
Define Y
InitSprite()
InitKeyboard()
InitMouse()
Define.d zoomPointX.d = 1920.0 / 2.0
Define.d spr
LoadFont(1, "Arial", 10)
OpenWindow(0, 0, 0, 1920, 1080, "test", #PB_Window_BorderLess)
If OpenWindowedScreen(WindowID(0), 0, 0, 1920, 1080)
;SetFrameRate(60)
CreateSprite(1, 5000, 500)
If StartDrawing(SpriteOutput(1))
For X=0 To SpriteWidth(1)
If X % 50 = 0
DrawText(MainX+X, MainY+60, Str(X/50), RGB(255, 255, 255))
EndIf
Next
StopDrawing()
EndIf
Repeat
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
DisplaySprite(1, MainX, MainY)
ExamineKeyboard()
ExamineMouse()
zoomPointX = MouseX()
If StartDrawing(ScreenOutput())
LineXY(zoomPointX, 0, zoomPointX, 1080, $ffffff)
StopDrawing()
EndIf
If KeyboardPushed(#PB_Key_Left)
MainX+10
EndIf
If KeyboardPushed(#PB_Key_Right)
MainX-10
EndIf
If KeyboardPushed(#PB_Key_Up)
MainX - 20 * (zoomPointX - MainX) / SpriteWidth(1)
ZoomSprite(1, SpriteWidth(1)+20, SpriteHeight(1)+2)
EndIf
If KeyboardPushed(#PB_Key_Down)
MainX + 20 * (zoomPointX - MainX) / SpriteWidth(1)
ZoomSprite(1, SpriteWidth(1)-20, SpriteHeight(1)-2)
EndIf
Until KeyboardReleased(#PB_Key_Escape)
EndIf
Bestimmt kannst du daraus noch die Y-Achse ableiten.
Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 13:46
von AnonymousForAll
Danke NicTheQuick das klappt nun. Diese Formel habe ich gebraucht. Weil ich keine Maus brauchte habe ich nehme ich für zoomPointX einfach die Hälfte der Screen Breite. Klappt wunderbar danke

Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 13:55
von NicTheQuick
Ich persönlich finde es ja schöner, wenn man einen Zoomfaktor hat statt einer absoluten Vergrößerung in Pixel. Wie gefällt dir das?
Code: Alles auswählen
Define.d MainX.d = 0, MainY.d = 100
Define X
Define Y
InitSprite()
InitKeyboard()
InitMouse()
Define.d zoomPointX.d = 1920.0 / 2.0
Define.d zoomFactor.d = 1.01
Define.d spriteWidth.d, spriteHeight.d, diffWidth.d
Define.d spr
LoadFont(1, "Arial", 10)
OpenWindow(0, 0, 0, 1920, 1080, "test", #PB_Window_BorderLess)
If OpenWindowedScreen(WindowID(0), 0, 0, 1920, 1080)
;SetFrameRate(60)
CreateSprite(1, 5000, 500)
If StartDrawing(SpriteOutput(1))
For X=0 To SpriteWidth(1)
If X % 50 = 0
DrawText(MainX+X, MainY+60, Str(X/50), RGB(255, 255, 255))
EndIf
Next
StopDrawing()
EndIf
spriteWidth = SpriteWidth(1)
spriteHeight = SpriteHeight(1)
Repeat
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
DisplaySprite(1, MainX, MainY)
ExamineKeyboard()
ExamineMouse()
zoomPointX = MouseX()
If StartDrawing(ScreenOutput())
LineXY(zoomPointX, 0, zoomPointX, 1080, $ffffff)
StopDrawing()
EndIf
If KeyboardPushed(#PB_Key_Left)
MainX+10
EndIf
If KeyboardPushed(#PB_Key_Right)
MainX-10
EndIf
If KeyboardPushed(#PB_Key_Up)
spriteWidth * zoomFactor
spriteHeight * zoomFactor
MainX - (zoomFactor - 1.0) * (zoomPointX - MainX)
ZoomSprite(1, spriteWidth, spriteHeight)
EndIf
If KeyboardPushed(#PB_Key_Down)
spriteWidth / zoomFactor
spriteHeight / zoomFactor
MainX + (zoomFactor - 1.0) * (zoomPointX - MainX)
ZoomSprite(1, spriteWidth, spriteHeight)
EndIf
Until KeyboardReleased(#PB_Key_Escape)
EndIf
Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 14:04
von AnonymousForAll
Auch sehr schön

Re: Sprite zentriert zoomen
Verfasst: 18.07.2017 14:14
von AnonymousForAll
NicTheQuick hat geschrieben:Bestimmt kannst du daraus noch die Y-Achse ableiten.
Ja das schaffe ich, ich bin ja nicht funkheld.
