Page 2 sur 2

Re: COSMOS THE SECRET MELODY

Publié : jeu. 07/mai/2020 17:38
par drfloyd
Conclusion : le mieux est encore de dupliquer les tiles...

Dommage, car je connais 2 ou 3 basic qui incluent le flip horizontal et vertical en commandes, c'est assez pratique et utile pour un jeu vidéo.

peut etre dans une future version ?

Re: COSMOS THE SECRET MELODY

Publié : jeu. 07/mai/2020 18:16
par Ar-S
C'est vrai que dupliquer les tiles est un peu relou.. Mais du moment qu'on le sait, ça va vite.
A l'ouverture de ta planche de tiles, tu fais une nouvelle image de celle ci que tu flip via la proce d'ollivier et hop.. c'est réglée.
Pour la creation de tes sprites, si tu as une image avec 5 tiles 1.2.3.4.5 et que tu les flip, c'est sur que ça va faire 5.4.3.2.1 donc faudra juste penser à les graber dans l'autre sens.

Re: COSMOS THE SECRET MELODY

Publié : sam. 09/mai/2020 11:43
par Zorro
pour le flip des sprites, j'avais fait ça il n'y a pas longtemps

https://www.purebasic.fr/french/viewtop ... te#p205505

c'est toujours le meme principe , on met l'image ou le sprite en tableau , puis on utilise ce tableau pour réafficher le sprite changé ...

:)

Re: COSMOS THE SECRET MELODY

Publié : lun. 11/mai/2020 0:33
par case
sinon on peux utiliser clipsprite pour faire un flip
mais par contre on peux pas le flipper dans les deux sens a la fois avec cette technique

Code : Tout sélectionner

Declare vflipsprite(spr,xx,yy)
Declare hflipsprite(spr,xx,yy)
InitSprite()
main=OpenWindow(#PB_Any,0,0,800,600,"")
scr=OpenWindowedScreen(WindowID(main),0,0,800,600)
StartDrawing(ScreenOutput())
Box(0,0,32,32,$ff00ff)
Box(0,0,32,4,$ffffff)
Box(0,0,4,32,$ffffff)
StopDrawing()
spr1=GrabSprite(#PB_Any,0,0,32,32)
ClearScreen(0)
t=ElapsedMilliseconds()
Repeat
  ev=WaitWindowEvent(0)
  DisplaySprite(spr1,0,0)
  vflipsprite(spr1,64,0)
  hflipsprite(spr1,128,0)
  FlipBuffers()    
Until ev=#PB_Event_CloseWindow
Procedure vflipsprite(spr,xx,yy)
  sh= SpriteHeight(spr)
  shh=sh-1
  sw=SpriteWidth(spr)
  For yf=0 To shh
    ClipSprite(spr,0,yf,sw,1)
    DisplaySprite(spr,xx,yy+shh-yf)
  Next
    ClipSprite(spr,0,0,sw,sh)
EndProcedure
Procedure hflipsprite(spr,xx,yy)
  sh= SpriteHeight(spr)
  sw=SpriteWidth(spr) 
  sww=sw -1
  For xf=0 To sww
    ClipSprite(spr,xf,0,1,sh)
    DisplaySprite(spr,xx+sww-xf,yy)
  Next
  ClipSprite(spr,0,0,sw,sh)
EndProcedure
plutot que de le faire en temps réel voici un moyen de le faire au moment du grabsprite()

Code : Tout sélectionner

Declare vflipsprite(spr,xx,yy)
Declare hflipsprite(spr,xx,yy)
Declare GrabSp(x,y,l,h)
InitSprite()
main=OpenWindow(#PB_Any,0,0,800,600,"")
scr=OpenWindowedScreen(WindowID(main),0,0,800,600)
; crée un sprite
StartDrawing(ScreenOutput())
Box(0,0,32,32,$ff00ff)
Box(0,0,32,4,$ffffff)
Box(0,0,4,32,$ffffff)
StopDrawing()
; structure utilise pour la demonstration 
Structure sprite
  orientation.i[4]  
EndStructure
; liste des sprites
Global NewList sprite.sprite()
;
GrabSp(0,0,32,32)
ClearScreen(0)
t=ElapsedMilliseconds()
Repeat
  ev=WaitWindowEvent(0)
  DisplaySprite(sprite()\orientation[0],0,0)
  DisplaySprite(sprite()\orientation[1],40,0)
  DisplaySprite(sprite()\orientation[2],80,0)
  DisplaySprite(sprite()\orientation[3],120,0)
  FlipBuffers()    
Until ev=#PB_Event_CloseWindow
Procedure vflipsprite(spr,xx,yy)
  sh= SpriteHeight(spr)
  shh=sh-1
  sw=SpriteWidth(spr)
  For yf=0 To shh
    ClipSprite(spr,0,yf,sw,1)
    DisplaySprite(spr,xx,yy+shh-yf)
  Next
    ClipSprite(spr,0,0,sw,sh)
EndProcedure
Procedure hflipsprite(spr,xx,yy)
  sh= SpriteHeight(spr)
  sw=SpriteWidth(spr) 
  sww=sw -1
  For xf=0 To sww
    ClipSprite(spr,xf,0,1,sh)
    DisplaySprite(spr,xx+sww-xf,yy)
  Next
  ClipSprite(spr,0,0,sw,sh)
EndProcedure
Procedure GrabSp(x,y,l,h)
  AddElement(sprite())
  sprite()\orientation[0]=GrabSprite(#PB_Any,x,y,l,h)  ; sprite original
  hflipsprite(sprite()\orientation[0],x,y)
  sprite()\orientation[1]=GrabSprite(#PB_Any,x,y,l,h)
  vflipsprite(sprite()\orientation[0],x,y)
  sprite()\orientation[2]=GrabSprite(#PB_Any,x,y,l,h)
  vflipsprite(sprite()\orientation[1],x,y)
  sprite()\orientation[3]=GrabSprite(#PB_Any,x,y,l,h)
EndProcedure


Re: COSMOS THE SECRET MELODY

Publié : dim. 17/mai/2020 14:35
par drfloyd
merci pour votre aide

En tout cas : pour une prochaine version de PUREBASIC, intégrer une commande FLIPSPRITE ;)

(présente sur de nombreux basic)

j'ai une question existentielle sur les fontes mais je je vais créer un topic....

Re: COSMOS THE SECRET MELODY

Publié : dim. 17/mai/2020 17:15
par Fig
Oui, la commande n'existe pas en Pb.
Une autre solution possible (je ne crois pas qu'elle ait été cité précédemment) c'est de permettre de voir l'envers du sprite quand il est retourné avec transformsprite().

Cherche "disable backface culling" sur le forum anglais...
C'est aussi rapide qu'un TransformSprite() et pas prise de tête.

Code adapté pour x64 et x86 par Djes...

Code : Tout sélectionner

InitSprite()
InitKeyboard()
OpenWindow(0, 0, 0, 800, 600, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0),WindowHeight(0))


;Disable Backface Culling
;from : http://www.forums.purebasic.com/english/viewtopic.php?f=16&t=43718
Define pd3d.IDirect3DDevice9

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  EnableASM
  !extrn _PB_Screen_Direct3DDevice
  !MOV dword EAX, [_PB_Screen_Direct3DDevice]
  !MOV dword [v_pd3d],EAX
  DisableASM
CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
  EnableASM
  !extrn PB_Screen_Direct3DDevice
  !MOV dword EAX, [PB_Screen_Direct3DDevice]
  !MOV dword [v_pd3d],EAX
  DisableASM
CompilerElse
  Debug "Unsupported processor"
  End
CompilerEndIf
pd3d\SetRenderState(22,1)
pd3d\SetRenderState(7,0)
Procedure FlipSprite(sprite.i,flip.i)
  If flip
    TransformSprite(0,SpriteWidth(0),0,0,0,0,SpriteHeight(0),SpriteWidth(0),SpriteHeight(0))
  Else
    TransformSprite(0,0,0,SpriteWidth(0),0,SpriteWidth(0),SpriteHeight(0),0,SpriteHeight(0))
  EndIf
EndProcedure
;-create sprite
CreateSprite(0,128,128)
StartDrawing(SpriteOutput(0))
Circle(32,32,64,#Red)
Box(64,32,64,32,#Green)
StopDrawing()
Repeat
  Repeat
    Event = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End       
    EndSelect
  Until Event=0
  ExamineKeyboard()
  ClearScreen(#Black)
  If KeyboardPushed(#PB_Key_Space)
    FlipSprite(0,1)
  Else
    FlipSprite(0,0)
  EndIf
  DisplaySprite(0,32,32)
  FlipBuffers()
  Delay(1)
ForEver