Probleme mit Transformsprite

Für allgemeine Fragen zur Programmierung mit PureBasic.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Probleme mit Transformsprite

Beitrag 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 )
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Probleme mit Transformsprite

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: Probleme mit Transformsprite

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Probleme mit Transformsprite

Beitrag 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 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: Probleme mit Transformsprite

Beitrag von SilverSurfer »

Ich wollte mich noch bei dir bedanken Stargate.... :)
Antworten