Sprite zentriert zoomen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
AnonymousForAll
Beiträge: 13
Registriert: 28.04.2017 11:21
Wohnort: Magdeburg

Sprite zentriert zoomen

Beitrag 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. :)
PW für alle: 4n0nym0us
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Sprite zentriert zoomen

Beitrag 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.
Bild
Benutzeravatar
AnonymousForAll
Beiträge: 13
Registriert: 28.04.2017 11:21
Wohnort: Magdeburg

Re: Sprite zentriert zoomen

Beitrag 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. :(
PW für alle: 4n0nym0us
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Sprite zentriert zoomen

Beitrag 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.
Bild
Benutzeravatar
AnonymousForAll
Beiträge: 13
Registriert: 28.04.2017 11:21
Wohnort: Magdeburg

Re: Sprite zentriert zoomen

Beitrag 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 :)
PW für alle: 4n0nym0us
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Sprite zentriert zoomen

Beitrag 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
Bild
Benutzeravatar
AnonymousForAll
Beiträge: 13
Registriert: 28.04.2017 11:21
Wohnort: Magdeburg

Re: Sprite zentriert zoomen

Beitrag von AnonymousForAll »

Auch sehr schön :)
PW für alle: 4n0nym0us
Benutzeravatar
AnonymousForAll
Beiträge: 13
Registriert: 28.04.2017 11:21
Wohnort: Magdeburg

Re: Sprite zentriert zoomen

Beitrag von AnonymousForAll »

NicTheQuick hat geschrieben:Bestimmt kannst du daraus noch die Y-Achse ableiten.
Ja das schaffe ich, ich bin ja nicht funkheld. :mrgreen:
PW für alle: 4n0nym0us
Antworten