SuperSprite3D

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
namenlos

Beitrag von namenlos »

For collision, you can code your procedure (Box collision, or Radius collision)

For The pivot of the simple sprite3d see this code :

Code: Alles auswählen

Structure vertex 
    sx.f 
    sy.f 
    sz.f 
    rhw.f 
    Color.l 
    specular.l 
    tu.f 
    tv.f 
EndStructure 

Structure PB_Sprite3D 
     Texture.l          
     Vertice.vertex[4] 
     Width.w 
     Height.w 
EndStructure 

Structure PB_Sprite3DEX 
      No.l 
      AA.f:AB.f:AC.f:AD.f 
      DA.f:DB.f:DC.f:dd.f 
      Pivot_x.f 
      Pivot_y.f 
EndStructure 





Procedure Distance(x1,y1,x2,y2) 
Protected Result.f 
Result = Sqr(  Pow(x1-x2,2) + Pow(y1-y2,2) + Pow(z1-z2,2) ) 
ProcedureReturn Result 
EndProcedure 


Procedure.f ReturnAngle(x1.f,y1.f,x2.f,y2.f) 
  A.f = x1-x2 
  b.f = y1-y2 
  c.f = -Sqr(A*A+b*b) 
  angle.f = ACos(A/c)*180/#PI 
  If y1 < y2 : angle=360-angle : EndIf 
  ProcedureReturn Abs(angle - 360) 
EndProcedure 


Procedure Sprite3DModifyPivot(*SpriteID.PB_Sprite3DEX,X.f,Y.f) 
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(*SpriteID\No) 

*SpriteID\AA = ReturnAngle(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,X,Y) 
*SpriteID\AB = ReturnAngle(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,X,Y) 
*SpriteID\AC = ReturnAngle(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,X,Y) 
*SpriteID\AD = ReturnAngle(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,X,Y) 

*SpriteID\DA = Distance(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,X,Y) 
*SpriteID\DB = Distance(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,X,Y) 
*SpriteID\DC = Distance(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,X,Y) 
*SpriteID\dd = Distance(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,X,Y) 

*SpriteID\Pivot_x=X 
*SpriteID\Pivot_y=Y 
EndProcedure 

Procedure CreateSprite3DEX(Sprite3D) 
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(Sprite3D) 
Protected *VertexSpriteEX.PB_Sprite3DEX = AllocateMemory(SizeOf(PB_Sprite3DEX)) 

*VertexSpriteEX\No = Sprite3D 



SizeW.f = *VertexSprite\Width/2 
SizeH.f = *VertexSprite\Height/2 

                
*VertexSpriteEX\AA = ReturnAngle(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH) 
*VertexSpriteEX\AB = ReturnAngle(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH) 
*VertexSpriteEX\AC = ReturnAngle(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH) 
*VertexSpriteEX\AD = ReturnAngle(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH) 

*VertexSpriteEX\DA = Distance(*VertexSprite\Vertice[0]\sx,*VertexSprite\Vertice[0]\sy,SizeW,SizeH) 
*VertexSpriteEX\DB = Distance(*VertexSprite\Vertice[1]\sx,*VertexSprite\Vertice[1]\sy,SizeW,SizeH) 
*VertexSpriteEX\DC = Distance(*VertexSprite\Vertice[2]\sx,*VertexSprite\Vertice[2]\sy,SizeW,SizeH) 
*VertexSpriteEX\dd = Distance(*VertexSprite\Vertice[3]\sx,*VertexSprite\Vertice[3]\sy,SizeW,SizeH) 

ProcedureReturn *VertexSpriteEX 
EndProcedure 


Procedure RotateSprite3DEX(*SpriteID.PB_Sprite3DEX,angle.f) 
Protected *VertexSprite.PB_Sprite3D = IsSprite3D(*SpriteID\No) 
Protected SizeW2.l,SizeH2.l 
    If angle = 0 Or angle = 180 
      *SpriteID\Pivot_x = *VertexSprite\Width/2 
      *SpriteID\Pivot_y = *VertexSprite\Height/2 
    Else 
      *SpriteID\Pivot_x = *VertexSprite\Height/2 
      *SpriteID\Pivot_y = *VertexSprite\Width/2 
    EndIf 
     *VertexSprite\Vertice[0]\sx = *SpriteID\Pivot_x  - *SpriteID\DA  * Cos((angle+*SpriteID\AA)*#PI/180) 
     *VertexSprite\Vertice[0]\sy = *SpriteID\Pivot_y  - *SpriteID\DA  * Sin((angle+*SpriteID\AA)*#PI/180) 
                                                                        
     *VertexSprite\Vertice[1]\sx = *SpriteID\Pivot_x  - *SpriteID\DB  * Cos((angle+*SpriteID\AB)*#PI/180) 
     *VertexSprite\Vertice[1]\sy = *SpriteID\Pivot_y  - *SpriteID\DB  * Sin((angle+*SpriteID\AB)*#PI/180) 
                           ; ;                                          
     *VertexSprite\Vertice[3]\sx = *SpriteID\Pivot_x  - *SpriteID\dd  * Cos((angle+*SpriteID\AD)*#PI/180) 
     *VertexSprite\Vertice[3]\sy = *SpriteID\Pivot_y  - *SpriteID\dd  * Sin((angle+*SpriteID\AD)*#PI/180) 
                                                                        
     *VertexSprite\Vertice[2]\sx = *SpriteID\Pivot_x  - *SpriteID\DC  * Cos((angle+*SpriteID\AC)*#PI/180)      
     *VertexSprite\Vertice[2]\sy = *SpriteID\Pivot_y  - *SpriteID\DC  * Sin((angle+*SpriteID\AC)*#PI/180) 
                                                                      
EndProcedure 



InitSprite() : InitSprite3D() : InitKeyboard() 
If OpenWindow(0, 0, 0, 800, 600, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0) 
    Else 
      MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0) 
      End 
    EndIf 
  EndIf 

;{ A 
CreateSprite(0,128,64,#PB_Sprite_Texture) 
 StartDrawing(SpriteOutput(0)) 
  Box(0,0,64,64,RGB(255,0,0)) 
  Box(64,0,64,64,RGB(255,255,0)) 
  Box(0,0,10,10, $FF0000) 
  StopDrawing() 
CreateSprite3D(0,0) 
A = CreateSprite3DEX(0) 
;} 
;{ B 
CreateSprite(1,128,64,#PB_Sprite_Texture) 
 StartDrawing(SpriteOutput(1)) 
  Box(0,0,64,64,RGB(255,0,0)) 
  Box(64,0,64,64,RGB(255,255,0)) 
  Box(0,54,10,10, $FF0000) 
  StopDrawing() 
CreateSprite3D(1,1) 
b = CreateSprite3DEX(1) 
;} 
;{ C 
CreateSprite(2,128,64,#PB_Sprite_Texture) 
 StartDrawing(SpriteOutput(2)) 
  Box(0,0,64,64,RGB(255,0,0)) 
  Box(64,0,64,64,RGB(255,255,0)) 
  Box(118,54,10,10, $FF0000) 
  StopDrawing() 
CreateSprite3D(2,2) 
c = CreateSprite3DEX(2) 
;} 
;{ D 
CreateSprite(3,128,64,#PB_Sprite_Texture) 
 StartDrawing(SpriteOutput(3)) 
  Box(0,0,64,64,RGB(255,0,0)) 
  Box(64,0,64,64,RGB(255,255,0)) 
  Box(118,0,10,10, $FF0000) 
  StopDrawing() 
CreateSprite3D(3,3) 
d = CreateSprite3DEX(3) 
;} 
e = CreateSprite3DEX(0) 
f = CreateSprite3DEX(0) 



Sprite3DModifyPivot(e,0,32) 
Sprite3DModifyPivot(f,64,0) 


Repeat 
  r.f = 90 + 45 * Cos(ElapsedMilliseconds()/500) 
  ExamineKeyboard() 
  ClearScreen(0) 
  Start3D() 
    RotateSprite3DEX(A,0) 
    DisplaySprite3D(0,100,100) 
    
    RotateSprite3DEX(b,90) 
    DisplaySprite3D(1,300,100) 
    
    RotateSprite3DEX(c,180) 
    DisplaySprite3D(2,100,300) 
    
    RotateSprite3DEX(d,270) 
    DisplaySprite3D(3,300,300) 
    
    RotateSprite3DEX(e,r) 
    DisplaySprite3D(0,500,200) 
    
    
    RotateSprite3DEX(f,-r) 
    DisplaySprite3D(0,500,400) 
  Stop3D() 

  StartDrawing(ScreenOutput()) 
    DrawText(100,100,"0 DEG") 
    DrawText(300,100,"90 DEG") 
    DrawText(100,300,"180 DEG") 
    DrawText(300,300,"270 DEG") 
    Circle(500,232,4,RGB(0,0,255)) 
    Circle(564,400,4,RGB(0,0,255)) 
    Box(100,100,10,10, $00FF00) 
    Box(300,100,10,10, $00FF00) 
    Box(100,300,10,10, $00FF00) 
    Box(300,300,10,10, $00FF00) 
  StopDrawing() 
 FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape) 
@+ bye.
wasser
Beiträge: 125
Registriert: 27.11.2006 21:16

Beitrag von wasser »

miss the fulcrum(drehpunkt) into the supersprite3d???

do not need the fulcrum into the normal sprite!


mfg
namenlos

Beitrag von namenlos »

miss the fulcrum(drehpunkt) into the supersprite3d???
Yes, you can't change fulcrum with SS3D.
for an supersprite3d with size of 100x100 the fulcrum is the middle of sprite (center)
Antworten