Seite 1 von 1
Zoom
Verfasst: 08.12.2017 17:34
von Bobo220673
Hallo!
Ich habe ein kleines Problem mit Sprites. Der Sprite soll wenn er nach Oben geht seine Größe verändern und kleiner werden, so das ein "3d" Effekt ensteht. Und natürlich wieder größer werden wenn er nach Unten "Vorne" kommt. Ich weis das es mit ZoomSprite geht, aber irgendwie sieht das bei mir nicht sauber aus. Darum habe ich mal in den Quelltext das Zoomen rausgelassen, in der Hoffnung das einer von euch vielleicht eine saubere Animation hin bekommt.
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"")
SetFrameRate(60)
Sprite=CreateSprite(#PB_Any,200,100)
StartDrawing(SpriteOutput(Sprite))
Box(0,0,SpriteWidth(Sprite),SpriteHeight(Sprite),RGB(255,0,0))
StopDrawing()
Grad = 0
Mittelpunkt_x = 640/2
Mittelpunkt_y = 480/2
Abstand_x = 170
Abstand_y = 170
Repeat
ExamineKeyboard()
ClearScreen(RGB(0,0,0))
If Grad >0
Grad = Grad - 1
Else
Grad = 360
EndIf
Rota_x = (Abstand_x * Cos(Grad * (2*#PI/360)))
Pos_x = Mittelpunkt_x + Rota_x
Rota_y = (Abstand_y * Sin(Grad * (2*#PI/360)))
Pos_y = Mittelpunkt_y + Rota_y
DisplayTransparentSprite(Sprite, Pos_x - SpriteWidth(Sprite)/2 , Pos_y - SpriteHeight(Sprite)/2 )
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Re: Zoom
Verfasst: 08.12.2017 19:09
von xdes
hemm auch wenn das anderes herum ist meinst du das ?
denn leider weiß ich nicht was du mit sauber meinst.... evtl. hilft´s ja trozdem
ps: warum machst du das ganze eigentlich nicht in 3 d ? desweiteren wenn ich mich nicht vertue wird es besser wenn es kein kreis ist sondern eine ei form ist ...
Code: Alles auswählen
InitSprite()
InitKeyboard()
;hir habe ich auch etwas gändert ...
OpenScreen(640,480,32,"",#PB_Screen_NoSynchronization)
SetFrameRate(160)
Sprite=CreateSprite(#PB_Any,200,100)
StartDrawing(SpriteOutput(Sprite))
Box(0,0,SpriteWidth(Sprite),SpriteHeight(Sprite),RGB(255,0,0))
StopDrawing()
Grad = 0
Mittelpunkt_x = 640/2
Mittelpunkt_y = 480/2
Abstand_x = 170
Abstand_y = 170
; orgnial gröse auslesen (damit du nicht dynamisch weite das ganze nutzen kannst... und nicht die zahlen nutezen must von 200 zu 100)
o_SpriteWidth=SpriteWidth(Sprite)
o_SpriteHeight=SpriteHeight(Sprite)
Repeat
ExamineKeyboard()
ClearScreen(RGB(0,0,0))
If Grad >0
Grad = Grad - 1
Else
Grad = 360
EndIf
Rota_x = (Abstand_x * Cos(Grad * (2*#PI/360)))
Pos_x = Mittelpunkt_x + Rota_x
Rota_y = (Abstand_y * Sin(Grad * (2*#PI/360)))
Pos_y = Mittelpunkt_y + Rota_y
;berechnung des faktors des zomms und der veränderung bei jeder schleife neu berehnet evtl musst du die werte anpassen...
faktor=((ScreenHeight()/2)-Pos_y)/2
Debug faktor
ZoomSprite(Sprite, o_SpriteWidth+(faktor), o_SpriteHeight+(faktor))
If facktor>0
Delay(facktor)
EndIf
DisplayTransparentSprite(Sprite, Pos_x - SpriteWidth(Sprite)/2 , Pos_y - SpriteHeight(Sprite)/2 )
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Re: Zoom
Verfasst: 09.12.2017 20:18
von #NULL
Code: Alles auswählen
InitSprite()
InitKeyboard()
;OpenScreen(640,480,32,"")
OpenWindow(0, 0, 0, 640, 480, "", #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480)
SetFrameRate(60)
Sprite=CreateSprite(#PB_Any,200,100)
StartDrawing(SpriteOutput(Sprite))
Box(0,0,SpriteWidth(Sprite),SpriteHeight(Sprite),RGB(255,0,0))
StopDrawing()
Grad = 0
Mittelpunkt_x = 640/2
Mittelpunkt_y = 480/2
Abstand_x = 170
Abstand_y = 170 * 0.5 ; ellipse movement
Repeat
ExamineKeyboard()
While WindowEvent() : Wend
ClearScreen(RGB(0,0,0))
If Grad > 0
Grad = Grad - 2
Else
Grad = 360
EndIf
Rota_x = (Abstand_x * Cos(Grad * (2*#PI/360)))
Pos_x = Mittelpunkt_x + Rota_x
Rota_y = (Abstand_y * Sin(Grad * (2*#PI/360)))
Pos_y = Mittelpunkt_y + Rota_y
Define GradRotated
GradRotated = Grad
GradRotated = GradRotated + 270 ; rotate 3/4, like rotate -90° and add 360 to keep number positive for the modulo operation
GradRotated = GradRotated % 360 ; clip, i.e. convert 380 to 20
Define f.f ; zoom factor, will be in range 0.0 .. 1.0
f = (GradRotated) - 180 ; convert from range 360..180..0 to range 180..0..-180
f * 2 ; convert to range 360..0..-360
f = Abs(f) ; convert to range 360..0..360
f = f / 360 ; normalize to 1..0..1
zoomW = 200 * f
zoomH = 100 * f
ZoomSprite(Sprite, zoomW, zoomH)
DisplayTransparentSprite(Sprite, Pos_x - SpriteWidth(Sprite)/2 , Pos_y - SpriteHeight(Sprite)/2, 55+200*f)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Re: Zoom
Verfasst: 09.12.2017 22:47
von juergenkulow
Hallo,
sieht das so nicht schöner aus?
Code: Alles auswählen
;Sprite Ellipse
;#Openscreend=#True
InitKeyboard() : InitSprite()
Bildschirm=ExamineDesktops()-1
CompilerIf Defined(Openscreend, #PB_Constant)
Bildschirm=0
OpenScreen(DesktopWidth(Bildschirm),DesktopHeight(Bildschirm),DesktopDepth(Bildschirm),"")
CompilerElse
OpenWindow(0, DesktopX(Bildschirm), DesktopY(Bildschirm),DesktopWidth(Bildschirm),
DesktopHeight(Bildschirm), "", #PB_Window_BorderLess)
OpenWindowedScreen(WindowID(0), 0, 0, DesktopWidth(Bildschirm), DesktopHeight(Bildschirm))
CompilerEndIf
SetFrameRate(DesktopFrequency(Bildschirm))
xSprite=Int(DesktopWidth(Bildschirm))/3.2
ySprite=Int(DesktopHeight(Bildschirm))/4.8
Sprite=CreateSprite(#PB_Any,xSprite,ySprite)
StartDrawing(SpriteOutput(Sprite))
Box(0,0,SpriteWidth(Sprite),SpriteHeight(Sprite),RGB(255,0,0))
StopDrawing()
Grad = 0
Mittelpunkt_x = DesktopWidth(Bildschirm)/2
Mittelpunkt_y = DesktopHeight(Bildschirm)/2
Abstand_x = DesktopWidth(Bildschirm)/3.5
Abstand_y = DesktopHeight(Bildschirm)/2 ; ellipse movement
fertig=#False
Repeat
ExamineKeyboard() : If KeyboardPushed(#PB_Key_Escape) : fertig=#True : EndIf
CompilerIf Not(Defined(Openscreend, #PB_Constant))
Event=WindowEvent():
While Event : If Event=#PB_Event_CloseWindow: fertig=#True: EndIf : Event=WindowEvent() : Wend
CompilerEndIf
ClearScreen(RGB(0,0,$30))
If Grad > 0
Grad = Grad - 2
Else
Grad = 360
EndIf
Rota_x = (Abstand_x * Cos(Grad * (2*#PI/360)))
Pos_x = Mittelpunkt_x + Rota_x
Rota_y = (Abstand_y * Sin(Grad * (2*#PI/360)))
Pos_y = Mittelpunkt_y + Rota_y
Define GradRotated
GradRotated = Grad
GradRotated = GradRotated + 270 ; rotate 3/4, like rotate -90° and add 360 to keep number positive for the modulo operation
GradRotated = GradRotated % 360 ; clip, i.e. convert 380 to 20
Define f.f ; zoom factor, will be in range 0.0 .. 1.0
f = (GradRotated) - 180 ; convert from range 360..180..0 to range 180..0..-180
f * 2 ; convert to range 360..0..-360
f = Abs(f) ; convert to range 360..0..360
f = f / 360 ; normalize to 1..0..1
zoomW = xSprite * f
zoomH = ySprite * f
ZoomSprite(Sprite, zoomW, zoomH)
DisplayTransparentSprite(Sprite, Pos_x - SpriteWidth(Sprite)/2 , Pos_y - SpriteHeight(Sprite)/2, 55+200*f)
FlipBuffers()
Until fertig
Re: Zoom
Verfasst: 18.12.2017 22:00
von Bobo220673
Danke, ihr habt mir sehr geholfen