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. :mrgreen: