Seite 1 von 1

Probleme mit Transformsprite

Verfasst: 07.08.2015 01:08
von SilverSurfer
Bei folgendem Code ( pB 5.31 \ X86 ) kann ich das Sprite nicht komplett über den rechten Rand heraus schieben. Wenn es rechts bis zur Hälfte über den Rand raus ist, verschwindet es komplett.
Wobei es von dem Linken Rand perfekt wieder in den Bildschirm kommt.
Habe das in Pb 4.51 x86 und 5.11 x86 getestet, dort funktioniert das einwand frei.
Wenn das nun ein Bug ist, bitte ich diejenigen von euch, welche der englischen Sprache mächtig sind, es eventuell weiter zu leiten.

Schaut selbst....

Code: Alles auswählen

EnableExplicit

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

OpenScreen( 1024, 768,32, "Test", 0 )

Define x.i = 800, w.i = 0

ClearScreen(0)

StartDrawing( ScreenOutput() )

Box( 0, 0, 127, 127, $FFFFFF )

StopDrawing()

GrabSprite( 1, 0, 0, 127, 127, #PB_Sprite_AlphaBlending )

Procedure DisplayTransformSprite(Sprite.i, X.f, Y.f, Width.f, Height.f, Angle.f, CenterX.f=0, CenterY.f=0, Transparency=255)
  
   Protected Sin.f = Sin(Radian(Angle)), Cos.f = Cos(Radian(Angle))
   TransformSprite(Sprite, Cos*(-Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Sin*(-Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), Cos*( Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Sin*( Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), Cos*( Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Sin*( Width*0.5-CenterX) + Cos*( Height*0.5-CenterY), Cos*(-Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Sin*(-Width*0.5-CenterX) + Cos*( Height*0.5-CenterY))
   DisplayTransparentSprite(Sprite, X, Y, Transparency)
   
EndProcedure 



SetFrameRate(60)

Repeat
  
  ExamineKeyboard()
  
  ClearScreen(0)
  
  DisplayTransformSprite( 1, x, 384, 128, 128, w, 0, 0, 255 )
 
  x+1: w+1
  
  If w > 359: w-360: EndIf
  
  If x > 1023 + SpriteWidth( 1 )/2: x = 0 - 128/2: EndIf
  
  StartDrawing( ScreenOutput() )
  
  Circle( x, 384, 4, $00FF00 );SpriteCenter anzeigen lassen
  
  StopDrawing()
  
FlipBuffers()  
  Until KeyboardPushed( #PB_Key_Escape )

Re: Probleme mit Transformsprite

Verfasst: 07.08.2015 03:37
von STARGÅTE
Ich weiß nicht ob man das als Bug bezeichnen kann, aber ich vermute das DisplayTransparantSprite eine interne Prüfung hat, ob die Koordinaten innerhalb des Screens liegen.
Du kannst das Problem in dem Sinne umgehen, indem du immer DisplayTransparentSprite(..., 0, 0, ...) machst, also Anzeige bei 0,0 aber bei TransformSprite für die X- und Y- Koordinaten jeweils +X bzw. +Y addierst.

Re: Probleme mit Transformsprite

Verfasst: 07.08.2015 05:20
von SilverSurfer
PB Hilfe sagt:

Dieser Befehl ist ge'clipped' (wird automatisch auf den Bildschirm zugeschnitten), daher ist es völlig in Ordnung, das Sprite außerhalb des Bildschirms anzuzeigen.


Außerdem verstehe ich im Moment nicht wie du das mit dem umgehen meinst. Ich brauche das Transformen ja, weil ich eine Spriterotation um das Zentrum haben möchte.
Zudem hat es ja in den Vogängerversionen geklappt, also ist es doch auch ein BUG, oder nicht? ( Für meiner einer wohle... :-) )
UND zum guten Schluss, wenn ich nur DisplayTransparentSprite nutze funktioniert es ja auch.

Re: Probleme mit Transformsprite

Verfasst: 07.08.2015 06:33
von STARGÅTE
SilverSurfer hat geschrieben:Dieser Befehl ist ge'clipped' (wird automatisch auf den Bildschirm zugeschnitten), daher ist es völlig in Ordnung, das Sprite außerhalb des Bildschirms anzuzeigen.
Richtig, deswegen wird das Sprite nicht angezeigt, wenn dein X,Y Wert größer ist als dein Bildschirm (was es ja in einem Fall wird).
SilverSurfer hat geschrieben:Außerdem verstehe ich im Moment nicht wie du das mit dem umgehen meinst. Ich brauche das Transformen ja, weil ich eine Spriterotation um das Zentrum haben möchte.
Du sollst ja auch TransformSprite weiter nutzen, aber halt dein X und Y auch mit ins Transform nehmen, damit du bei Display X und Y = 0 machen kannst, damit es immer angezeigt wird.
SilverSurfer hat geschrieben:Zudem hat es ja in den Vogängerversionen geklappt, also ist es doch auch ein BUG, oder nicht?
Nein, nicht unbedingt. Wenn etwas früher gekappt hat, dann war es entweder früher ein Bug, oder in diesem Fall "uneffizient".
SilverSurfer hat geschrieben:UND zum guten Schluss, wenn ich nur DisplayTransparentSprite nutze funktioniert es ja auch.
Das ist richtig, dann ist dein X,Y aber auch immer die obere linke Ecke des Sprites, somit ist das Nicht-Anzeigen bei Werten größer als der Bildschirm korrekt.

Hier deine neue Prozedur:

Code: Alles auswählen

Procedure DisplayTransformSprite(Sprite.i, X.f, Y.f, Width.f, Height.f, Angle.f, CenterX.f=0, CenterY.f=0, Transparency=255)
  
   Protected Sin.f = Sin(Radian(Angle)), Cos.f = Cos(Radian(Angle))
   TransformSprite(Sprite, X + Cos*(-Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Y + Sin*(-Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), X + Cos*( Width*0.5-CenterX) - Sin*(-Height*0.5-CenterY), Y + Sin*( Width*0.5-CenterX) + Cos*(-Height*0.5-CenterY), X + Cos*( Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Y + Sin*( Width*0.5-CenterX) + Cos*( Height*0.5-CenterY), X + Cos*(-Width*0.5-CenterX) - Sin*( Height*0.5-CenterY), Y + Sin*(-Width*0.5-CenterX) + Cos*( Height*0.5-CenterY))
   DisplayTransparentSprite(Sprite, 0, 0, Transparency)
   
EndProcedure 

Re: Probleme mit Transformsprite

Verfasst: 12.08.2015 14:58
von SilverSurfer
Ich wollte mich noch bei dir bedanken Stargate.... :)