Zoom

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Bobo220673
Beiträge: 21
Registriert: 29.04.2010 22:50

Zoom

Beitrag 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) 
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: Zoom

Beitrag 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) 
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Zoom

Beitrag 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) 
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Zoom

Beitrag 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
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Bobo220673
Beiträge: 21
Registriert: 29.04.2010 22:50

Re: Zoom

Beitrag von Bobo220673 »

Danke, ihr habt mir sehr geholfen :)
Antworten