Seite 1 von 1

3 Probleme mit Sprites

Verfasst: 19.10.2004 13:42
von Deeem2031
So erstmal der Code:

Code: Alles auswählen

Procedure DrawSprite(SpriteBuffer,SpriteBufferPitch,SpriteWidth,SpriteHeight,TBuffer,TBufferPitch,TWidth,THeight,tx,ty,rot.f,trans)
  Protected *source.LONG, x,y, tmp_x, tmp_y, tmp_yr, SpriteWidth2, SpriteHeight2, SinR.f, CosR.f, yr_SinR.f, yr_CosR.f, Buffer
  SinR = Sin(rot)
  CosR = Cos(rot)
  SpriteWidth2 = SpriteWidth/2
  SpriteHeight2 = SpriteWidth/2
  For y = 0 To SpriteHeight-1 
    *source = SpriteBuffer+SpriteBufferPitch*y
    tmp_yr = (y-SpriteHeight2)
    yr_SinR = tmp_yr * SinR
    yr_CosR = tmp_yr * CosR
    For x = -SpriteWidth2 To SpriteWidth2
      If *source\l <> trans
        tmp_x = tx + SpriteWidth2 + x * CosR - yr_SinR
        tmp_y = ty + SpriteHeight2 + x * SinR + yr_CosR
        If tmp_x >= 0 And tmp_y >= 0 And tmp_x < TWidth And tmp_y < THeight
          PokeL(TBuffer+tmp_y*TBufferPitch+tmp_x*4,*source\l)
        EndIf
      EndIf
      *source + 4 
    Next 
  Next 
EndProcedure

InitKeyboard()
InitSprite()
InitSprite3D()

OpenScreen(1024,768,32,"Sprite3D-Test")
SetFrameRate(60)

CreateSprite(0,64,64,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
SpriteBuffer = DrawingBuffer()
SpriteBufferPitch = DrawingBufferPitch()
Box(2,2,60,60,255|255<<16)
LineXY(0,0,63,63,255)
LineXY(30,0,20,63,255<<8)
LineXY(63,0,0,63,255<<16)
StopDrawing()

CreateSprite3D(0,0)

Repeat
  angle + 1
  ClearScreen(100,0,0)
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Space):angle = 0:EndIf
  DisplaySprite(0,100,20)
  RotateSprite3D(0,angle,0)
  Start3D()
    DisplaySprite3D(0,100,100)
  Stop3D()
  StartDrawing(ScreenOutput())
  DrawingBuffer = DrawingBuffer()
  DrawingBufferPitch = DrawingBufferPitch()
  StopDrawing()
  DrawSprite(SpriteBuffer,SpriteBufferPitch,64,64,DrawingBuffer,DrawingBufferPitch,1024,768,0,0,angle*3.141593/180,0)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
Schick nich? Aber darum gehts ja nich ^^
1. Prob:
Bei mir flackert das Sprite von DisplaySprite (das rechts oben). Wenn ich das Sprite in den Ram lade ist das nicht so, nur mit #PB_Sprite_Texture geladen wird es nicht richtig angezeigt. Kann das jemand bestätigen? Wenn ja, warum ist das so?
2. Prob:
Wenn man Space drück wird der Winkel auf 0 zurückgesetzt, aber das Sprite das mit DisplaySprite3D angezeigt wird (rechts unten) wird um irgendeinen anderen Winkel gedreht. Why?
3. Prob:
Links oben ist das Sprite das mit DrawSprite angezeigt wird. Dort wird aber die pinke Fläche nicht ausgefüllt. Warum das so ist weiß ich, ich will nur wissen ob ihr eine Idee habt wie man das am besten ändern kann.

Verfasst: 19.10.2004 16:44
von Ynnus
Ich hab die Erfahrung gemacht, dass RotateSprite3D() nicht korrekt dreht. Wie auch immer es dreht, der Ausgangswinkel ist nicht die X-Achse und gegen den Urzeigersinn wie es in der Mathematik ist und auch hier sein sollte, wodurch ein Winkel von 0 das Sprite nicht korrekt wieder ohne Drehung anzeigt. In meinen Codes schriebe ich jeweils bei solchen Drehungen immer (270 - Winkel) was dann den nahezu korrekten Winkel bei der 0 Grad Drehung ergibt.

Änder mal deinen Code so ab:

Code: Alles auswählen

RotateSprite3D(0,270-angle,0)
Dann sollte das Sprite bei "Space" fast korrekt nicht-gedreht sein.
Was deine anderen Fragen betreffen kann ich dir da nicht helfen, sieht komplex aus, deine Winkelberechnungen. ^^