Page 1 sur 2

Profondeur d'un sprite ("axe Z") + Playfield/Layer

Publié : mar. 26/mai/2009 12:11
par TazNormand
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

Publié : mar. 26/mai/2009 12:28
par Backup
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 ..

Publié : mar. 26/mai/2009 13:20
par TazNormand
OK, j'ai compris.

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) 
ç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.

Publié : mar. 26/mai/2009 13:33
par djes
Si tu fais des listes chaînées ça devient automatique... Perso, je préfère que ça reste comme ça, car c'est une source de confusion pour les débutants quand le langage gère l'ordre d'affichage.

Publié : mar. 26/mai/2009 14:21
par Backup
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 !! :?

Publié : mar. 26/mai/2009 14:29
par TazNormand
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 :roll:


Totalement Hors-Sujet : Djes, que représente ton avatar ?

Publié : mar. 26/mai/2009 14:30
par Backup
TazNormand a écrit :peut-être pourrais-tu poster ton message dans le forum anglais ?
oui il le consulte plus souvent, mais c'est pas pour ça qu'il réponds, ou meme
en parle avec nous !!

de plus, je ne me vois pas tenir une conversation en anglais !! :)

Publié : mar. 26/mai/2009 14:43
par Backup
je viens d'en parler avec mon anglais a 2 balles ici :
http://www.purebasic.fr/english/viewtop ... 178#287178

on verra bien :)

Publié : mar. 26/mai/2009 15:06
par djes
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 :)

Publié : mar. 26/mai/2009 15:08
par beauregard
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.
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 :)
bonne idée. :) Je ne sais pas, mais Fred devra peut être totalement réorganiser son langage, ou pas.

Publié : mar. 26/mai/2009 15:12
par beauregard
djes 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 :)
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 nous :) ).

Publié : mar. 26/mai/2009 15:20
par TazNormand
compte tenu de la réponse de Freak, je pense qu'on peut laisser tomber l'idée :cry:
Freak a écrit : There are no "layers" for sprites. Thats why it is called 2D :Wink:
Ce qui me désole, c'est que sur Amiga, il avait bien 2 playfields en 2D !!!

Publié : mar. 26/mai/2009 15:48
par Backup
..........

Publié : mar. 26/mai/2009 16:28
par djes
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 ;)

Publié : mar. 26/mai/2009 16:30
par TazNormand
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ô ?

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