Profondeur d'un sprite ("axe Z") + Playfield/Layer
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Profondeur d'un sprite ("axe Z") + Playfield/Layer
Salut
En modifiant le code du drapeau japonais de JB13 (cf post correspondant dans ce forum), je me suis demandé comment on pouvait faire pour que le scrolltext passe une fois devant/une fois derrière le drapeau ?
J'ai vu une question de Dobro à ce sujet (Ordre affichage sprite) qui date de Janvier 2007 (putain 2 ans !!!).
Donc je renouvelle un peu la question : comment simplement changer la "profondeur" d'affichage d'un sprite ?
Deuxième question, y a t'il une gestion de calque sous PB, comme les playfields/layers sur Amiga ou les calques PhotoShop/PaintShop Pro ?
Je sent déjà la réponse négative (j'ai cherché un peu avant de poster), mais savez-vous si c'est prévu dans une future version (4.4) ?
Dois-je faire une demande d'évolution sur le forum Anglais ?
merci pour toutes les infos que vous pourrez me donner
En modifiant le code du drapeau japonais de JB13 (cf post correspondant dans ce forum), je me suis demandé comment on pouvait faire pour que le scrolltext passe une fois devant/une fois derrière le drapeau ?
J'ai vu une question de Dobro à ce sujet (Ordre affichage sprite) qui date de Janvier 2007 (putain 2 ans !!!).
Donc je renouvelle un peu la question : comment simplement changer la "profondeur" d'affichage d'un sprite ?
Deuxième question, y a t'il une gestion de calque sous PB, comme les playfields/layers sur Amiga ou les calques PhotoShop/PaintShop Pro ?
Je sent déjà la réponse négative (j'ai cherché un peu avant de poster), mais savez-vous si c'est prévu dans une future version (4.4) ?
Dois-je faire une demande d'évolution sur le forum Anglais ?
merci pour toutes les infos que vous pourrez me donner
les sprites dans pure basic s'affiche par couche
du premier affiché (le plus au fond de l'ecran)
au dernier affiché (le plus pres de l'utilisateur)
le dernier affiché passe donc devant les autres !!
pour changer l'ordre , il suffit en fait
de mettre des conditions au moment de l'affichage
je te fait un code vite fait ..
du premier affiché (le plus au fond de l'ecran)
au dernier affiché (le plus pres de l'utilisateur)
le dernier affiché passe donc devant les autres !!

pour changer l'ordre , il suffit en fait
de mettre des conditions au moment de l'affichage
je te fait un code vite fait ..
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
OK, j'ai compris.
j'ai modifié le code du drapeau pour que le scroll passe alternativement devant puis derrière.
ça marche nickel, mais bonjour la prise de tête si il y a plus de 2 sprites.
J'ai bien compris qu'il fallait utiliser l'astuce de Comtois (tableaux), mais c'est vrai qu'un paramètre dans la commande DisplaySprite (et assimilées) serait un plus.
j'ai modifié le code du drapeau pour que le scroll passe alternativement devant puis derrière.
Code : Tout sélectionner
;** ScrollText , par Jbernard**
#sprite_text=1
; On iniallise tout
InitSprite()
InitKeyboard()
; Creation de l'ecran
largeur_ecran=1024 ; GetSystemMetrics_(#SM_CXSCREEN):; largeur de l'ecran
hauteur_ecran=768 ; GetSystemMetrics_(#SM_CYSCREEN) ; hauteur de l'ecran
OpenScreen(largeur_ecran,hauteur_ecran,32,"Scrolltext")
; on charge la police d'ecriture et on crée un sprite
LoadFont(1,"impact", 50)
CreateSprite(#sprite_text,250+largeur_ecran,60)
;Debug 0 ! 0
;Debug 0 ! 1
;Debug 1 ! 0
;Debug 1 ! 1
; on dessine et affiche le texte
text$="Le drapeau du JAPON "
StartDrawing(SpriteOutput(#sprite_text))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(1))
DrawText(0,0-14,text$,RGB($FF,$0,$0))
Longueur_text = TextWidth(text$)
StopDrawing()
CreateSprite(2,600,450)
StartDrawing(SpriteOutput(2))
Box(0,0,600,450,RGB($FF,$FF,$FF))
Circle(300,205,130,RGB($FF,$0,$0))
StopDrawing()
; Boucle du programme
vague.d=0
ordre.b=1
x=1025
Repeat
ClearScreen(0)
; animation du texte
x=x-3
If x<0-Longueur_text
x=largeur_ecran
ordre =ordre ! 1
EndIf
y=hauteur_ecran -100
If ordre=0
DisplaySprite(#sprite_text,x,y)
EndIf
For sprx=0 To 300
spry.d = Sin( (50*vague+sprx) / 30 )
ClipSprite(2,sprx*2,0,2,400)
DisplaySprite(2,250+2*sprx,300+16*spry)
Next
vague=vague+0.05
If vague>100
vague=0
EndIf
If ordre=1
DisplayTransparentSprite(#sprite_text,x,y)
EndIf
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
J'ai bien compris qu'il fallait utiliser l'astuce de Comtois (tableaux), mais c'est vrai qu'un paramètre dans la commande DisplaySprite (et assimilées) serait un plus.
ben non il n'y aurai aucun problem !!
imagine un truc genre
DisplaySprite(#effaceur,0,0, [flag],[profondeur])
si flag= 1 , alors le parametre profondeur donne le Z d'affichage
style :
DisplaySprite(#effaceur,0,0,1,0)
DisplaySprite(#ball,0,0,1,2)
effaceur se trouve derriere ball !!!
n'ayons pas peur des changements !!
comme ce serai optionel on pourrai garder le system actuel
avec
DisplaySprite(#effaceur,0,0)
mais bon , comme toute les idées proposées, elle ne sont jamais discuté entre Fred et nous , de toute façon, rien ne changera !!
heu ! si !! moi , je finirai par allez voir ailleurs !!
imagine un truc genre
DisplaySprite(#effaceur,0,0, [flag],[profondeur])
si flag= 1 , alors le parametre profondeur donne le Z d'affichage
style :
DisplaySprite(#effaceur,0,0,1,0)
DisplaySprite(#ball,0,0,1,2)
effaceur se trouve derriere ball !!!
n'ayons pas peur des changements !!

comme ce serai optionel on pourrai garder le system actuel
avec
DisplaySprite(#effaceur,0,0)
mais bon , comme toute les idées proposées, elle ne sont jamais discuté entre Fred et nous , de toute façon, rien ne changera !!
heu ! si !! moi , je finirai par allez voir ailleurs !!

- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
peut-être pourrais-tu poster ton message dans le forum anglais ?
Je ne sais pas s'il le consulte plus que le français.
Néanmoins, c'est clair que ça simplifierai grandement les choses ; je suis en train de me coller au tuto sur les listes chaînées pour essayer d'exploiter ça en attendant une éventuelle amélioration de PB
Totalement Hors-Sujet : Djes, que représente ton avatar ?
Je ne sais pas s'il le consulte plus que le français.
Néanmoins, c'est clair que ça simplifierai grandement les choses ; je suis en train de me coller au tuto sur les listes chaînées pour essayer d'exploiter ça en attendant une éventuelle amélioration de PB

Totalement Hors-Sujet : Djes, que représente ton avatar ?
je viens d'en parler avec mon anglais a 2 balles ici :
http://www.purebasic.fr/english/viewtop ... 178#287178
on verra bien
http://www.purebasic.fr/english/viewtop ... 178#287178
on verra bien

Franchement, il faut deux pages pour expliquer que ce chiffre sert à spécifier la position des sprites les uns par rapport aux autres, comme si c'étaient des entités "volantes" ou des calques. Un sprite est dessiné sur l'écran quand on fait drawsprite, c'est tout ; si tu en dessines un autre, il est dessiné par dessus : ça au moins c'est clair! Comme je l'ai déjà dit, les sprites "hard" n'existent pas sur windows. Entretenir cette confusion est néfaste.
Quant aux listes chaînées, tu devras t'y coller à un moment ou un autre, et après, c'est du bonheur et des prises de tête en moins! Je n'utilise presque plus les tableaux, tout est géré dynamiquement grâce aux listes!
Mon avatar est un vieux graph de démo
Quant aux listes chaînées, tu devras t'y coller à un moment ou un autre, et après, c'est du bonheur et des prises de tête en moins! Je n'utilise presque plus les tableaux, tout est géré dynamiquement grâce aux listes!
Mon avatar est un vieux graph de démo

-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
Avec un scrolling, le sujet devient encore plus épineux, car il faut se creuser la tête: "mmh, alors, où vais-je placer cette commande d'affichage moi ?..."
Certes, ce n'est pas super compliqué, hum, mais cela prend du temps, on se creuse la tête... et çà fait usine à gaz, et ceux malgré tout nos efforts de faire propre.
Je ne sais pas, mais Fred devra peut être totalement réorganiser son langage, ou pas.
Certes, ce n'est pas super compliqué, hum, mais cela prend du temps, on se creuse la tête... et çà fait usine à gaz, et ceux malgré tout nos efforts de faire propre.
bonne idée.Dobro a écrit :je viens d'en parler avec mon anglais a 2 balles ici :
http://www.purebasic.fr/english/viewtop ... 178#287178
on verra bien

config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
les listes chainées, je connais, mais je n'ai jamais eu cette lumineuse idée d'en utiliser une pour l'ordre d'affichage( c'est là que l'on reconnait les esprits les plus éclairés d'entre nousdjes a écrit :Franchement, il faut deux pages pour expliquer que ce chiffre sert à spécifier la position des sprites les uns par rapport aux autres, comme si c'étaient des entités "volantes" ou des calques. Un sprite est dessiné sur l'écran quand on fait drawsprite, c'est tout ; si tu en dessines un autre, il est dessiné par dessus : ça au moins c'est clair! Comme je l'ai déjà dit, les sprites "hard" n'existent pas sur windows. Entretenir cette confusion est néfaste.
Quant aux listes chaînées, tu devras t'y coller à un moment ou un autre, et après, c'est du bonheur et des prises de tête en moins! Je n'utilise presque plus les tableaux, tout est géré dynamiquement grâce aux listes!
Mon avatar est un vieux graph de démo

config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Oui, PB est au plus près de la machine 
Mais d'une façon que les mêmes commandes peuvent être utilisées sur des machines différentes. Les spécificités hard sont gérées par l'OS sous-jacent ou par des commandes spéciales.
Le dual playfield sur amiga ou les sprites "hard" n'existent pas sur Windows. On a l'équivalent des BOBs (blitter-objects) qui nécessitent la gestion d'un ordre d'affichage comme sur Windows. Les langages comme Amos faisaient tout pour le programmeur; en interne, ils utilisaient une liste, voire plus, car ils géraient des objets très différents (BOBs, sprites, v-sprites). Avec PB, pas de surcharge, c'est le programmeur qui gère tout, comme ça, si un programmeur n'en veut pas, le programme ne contient pas de choses inutiles.
Si vous voulez faire un bon exercice, faites des vectors-balls 3D; si vous arrivez à vous en sortir sans faire un tri, je vous tire mon chapeau

Mais d'une façon que les mêmes commandes peuvent être utilisées sur des machines différentes. Les spécificités hard sont gérées par l'OS sous-jacent ou par des commandes spéciales.
Le dual playfield sur amiga ou les sprites "hard" n'existent pas sur Windows. On a l'équivalent des BOBs (blitter-objects) qui nécessitent la gestion d'un ordre d'affichage comme sur Windows. Les langages comme Amos faisaient tout pour le programmeur; en interne, ils utilisaient une liste, voire plus, car ils géraient des objets très différents (BOBs, sprites, v-sprites). Avec PB, pas de surcharge, c'est le programmeur qui gère tout, comme ça, si un programmeur n'en veut pas, le programme ne contient pas de choses inutiles.
Si vous voulez faire un bon exercice, faites des vectors-balls 3D; si vous arrivez à vous en sortir sans faire un tri, je vous tire mon chapeau

- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Bon, je me suis penché sur le tuto des listes chainées, mais mon code me donne une erreur "Stars() n'est pas une fonction", stars() étant le nom de la 1ere liste chainée.
SOS, pourquoi ça marche pô ?
SOS, pourquoi ça marche pô ?
Code : Tout sélectionner
;Tutorial Listes Chaînées
;Initialisation des composants
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
Structure Etoile
posx.f
posy.f
vitesse.f
EndStructure
NewList Stars.Etoile()
NewList Stars2.Etoile()
;Constantes
#Star = 1
#Star2 = 2
;Création de la fenêtre principale
SetRefreshRate(60)
MaFenetre = OpenScreen(800,600,32,"Test")
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
Procedure DisplayEtoile()
ResetList(Stars())
While NextElement(Stars())
If Stars()\posy > 600
Stars()\posy = -5
EndIf
DisplayTransparentSprite(#Star, Stars()\posx, Stars()\posy)
Stars()\posy + Stars()\vitesse
Wend
ResetList(Stars2())
While NextElement(Stars2())
If Stars2()\posy > 600
Stars2()\posy = -5
EndIf
DisplayTransparentSprite(#Star2, Stars2()\posx, Stars2()\posy)
Stars2()\posy + Stars2()\vitesse
Wend
EndProcedure
;Chargement des sprites
CreateSprite(#star,1,1)
StartDrawing(SpriteOutput(#star))
Plot(0,0,RGB(255,255,255))
StopDrawing()
CreateSprite(#star2,1,1)
StartDrawing(SpriteOutput(#star2))
Plot(0,0,RGB(120,120,120))
StopDrawing()
For i = 1 To 150
AddElement(Stars())
AddElement(Stars2())
Stars()\posx = Random(800)
Stars()\posy = Random(600)
Stars()\vitesse = 2
Stars2()\posx = Random(800)
Stars2()\posy = Random(600)
Stars2()\vitesse = 1
Next
Repeat
ClearScreen(RGB(0,0,0))
DisplayEtoile()
ExamineKeyboard()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End