Unstimmigkeiten (Bug?) in RotateSprite3D()

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Unstimmigkeiten (Bug?) in RotateSprite3D()

Beitrag von Lebostein »

Folgendes kleines Beispiel:

Code: Alles auswählen

InitSprite() 
InitSprite3D() 
InitKeyboard() 

OpenScreen(640,480,16,"3D") 

CreateSprite(0,128,128,#PB_Sprite_Texture) 

StartDrawing(SpriteOutput(0)) 
  DrawingMode(0) 
  Box(000,000,128,128,$00AA00) 
  DrawingMode(4) 
  Box(000,000,128,128,$0000FF) ; Aussenrand 
  Box(001,001,063,063,$FF0000) ; linke obere Ecke blau 
  Box(064,001,063,063,$0000FF) 
  Box(001,064,063,063,$0000FF) 
  Box(064,064,063,063,$0000FF) 
StopDrawing() 

CreateSprite3D(0,0) 

Repeat 

  ExamineKeyboard() 
  
  ClearScreen(0,0,0) 
  DisplaySprite(0,10,10) 
  
  Start3D() 
  DisplaySprite3D(0,010,200,255) 
  If KeyboardPushed(#PB_Key_Space): RotateSprite3D(0,0,0): EndIf 
  DisplaySprite3D(0,200,200,255) 
  Stop3D() 
  
  StartDrawing(ScreenOutput()) 
  DrawingMode(1) 
  FrontColor($FF,$FF,$FF) 
  Locate(140,10):DrawText("Originalbild") 
  StopDrawing() 
  
  FlipBuffers() 

Until KeyboardPushed(#PB_Key_Escape)
Nach dem Starten ist erst einmal alles ok. Oben links wird das Original-2D-Sprite gezeigt und unten zwei 3D-Sprites. Drückt man nun die Leertaste, so sollte eigentlich nicht passieren: Das erste 3DSprite dürfte sich überhaupt nicht verändern, dass zweite müsste um Null Grad gedreht werden und auch unverändert zu sehen sein. Pustekuchen! Beide Sprites scheinen sich um etwas mehr als 90 Grad zu drehen (beide!!) und auch nach dem loslassen der Leertaste bleiben sie so und gehen nicht in den 'Normalzustand' zurück!!! :o

RotateSprite3D wird mit dem Parameter '0' verwendet, der laut Handbuch das Sprite zurücksetzen müsste: 0: Alle Dimensionen werden auf ihre Original-Werte zurückgesetzt (damit werden alle vorherigen "Zoom" oder "Rotate" Operationen rückgängig gemacht). Dies ist sehr nützlich, wenn mehrere Sprites zur gleichen Zeit aus einem #Sprite3D generiert werden. Dadurch kann jedes Sprite korrekt, mit seinem eigenen Winkel, angezeigt werden.

... ich wundere mich, dass das bisher nicht aufgefallen ist.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Oh, tschuldigung :oops: . Mir ist gerade in den Sinn gekommen, dass man mit RotateSprite3D() praktisch den Winkel setzt, und der dann für das angegebene Sprite bis zum nächsten Aufruf von RotateSprite3d() beibehalten wird, also somit auch das erste Sprite gedreht wird. Das erklärt auch, warum das Sprite nach dem loslassen nicht zurückgesetzt wird..

Aber das erklärt noch nicht den zusätzlichen Winkel von 90° und die scheinbar geringe Abweichung beim Drehen...Die Winkel 0 und 360 Grad scheinen hier auch nicht gerade 'übereinzustimmen', tauchscht mal den 3d-Block gegen diesen aus:

Code: Alles auswählen

  Start3D()
  RotateSprite3D(0,000,0)
  DisplaySprite3D(0,010,200,255) 
  RotateSprite3D(0,360,0)
  DisplaySprite3D(0,200,200,255) 
  Stop3D() 
Antworten