COSMOS THE SECRET MELODY

Programmation avancée de jeux en PureBasic
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Re: COSMOS THE SECRET MELODY

Message 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 ?
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: COSMOS THE SECRET MELODY

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: COSMOS THE SECRET MELODY

Message 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é ...

:)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: COSMOS THE SECRET MELODY

Message 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

ImageImage
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Re: COSMOS THE SECRET MELODY

Message 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....
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: COSMOS THE SECRET MELODY

Message 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
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre