tu dois eviter de faire des start/stop a tout bout de champ tu dois penser en couches et surcouches
-> couche sol
affichage de tout les sprites du décor
-> couche objets
affichage de tout les sprites des objets (au sens large, mobs etc compris)
-> couche décor haut
affichage de tout les sprites du décor se trouvant plus haut que les objets au sol (feuillage)
-> couche objets haut
affichage de tout les sprites des objets (au sens large, mobs etc compris)se trouvant plus haut que le décor haut (oiseaux)
-> couche texte objets
affichage des noms des joueurs, etc
-> couche interface
affichage des fenêtres et autre morceaux de ton interface
un exemple je n'affiche pas vraiment le sol j'efface l'écran.
j'ai zappé les surcouches décor haut et objets haut...
Code : Tout sélectionner
InitSprite()
InitMouse()
InitKeyboard()
; pour l'exemple création d'une pseudo interface
Structure gui
;coordones
x.i
y.i
l.i
h.i
; ordre d'affichage le plus petit = au dessus
z.i
;couleur
col.i
;sprite
spr.i
EndStructure
Structure joueur
x.i
y.i
name.s
EndStructure
; liste chainée de l'interface
Global NewList gui.gui()
Global NewList player.joueur()
; fenetre pour une sortie...
Global main=OpenWindow(#PB_Any,0,0,640,480,"test",#PB_Window_BorderLess)
;procedures
Declare makegui(x,y,l,h,col)
Declare Pick()
OpenWindowedScreen(WindowID(main),0,0,640,480,0,0,0)
; couleur transparente par defaut
TransparentSpriteColor(#PB_Default,$ff00ff)
; crée le pointeur de la souris
StartDrawing(ScreenOutput())
Box(0,0,10,10,$ff00ff)
Circle(4,4,4,$ffffff)
Circle(4,4,2,$000000)
StopDrawing()
Global pointer=GrabSprite(#PB_Any,0,0,10,10)
StartDrawing(ScreenOutput())
Box(0,0,30,30,$ff00ff)
Circle(14,14,14,$0)
Circle(14,14,12,$8888ff)
StopDrawing()
FlipBuffers()
Global play=GrabSprite(#PB_Any,0,0,28,28)
; crée des morceau d'interface au hazard
For a=1 To 5
makegui(Random(400),Random(300),Random(200)+50,Random(100)+50,Random($ffffff))
Next
; cree des "joueurs" aleatoirement
For a = 1 To 30
AddElement(player())
player()\x=Random(600)
player()\y=Random(450)
For e= 1 To Random(12)+6
player()\name+Chr(Random(96)+32)
Next
Next
;
Repeat
ExamineMouse()
ExamineKeyboard()
; affichagfe du fond
ClearScreen(0)
; affichage mobs
ForEach player()
player()\x+Random(2)-1
player()\y+Random(2)-1
DisplayTransparentSprite(play,player()\x-14,player()\y-14)
Next
; affichage des textes
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
ForEach player()
xs=TextWidth(player()\name)/2
ys=TextHeight(player()\name)
DrawText((player()\x-xs),player()\y-14-ys,player()\name)
Next
StopDrawing()
hover=Pick()
If MouseButton(#PB_MouseButton_Left)
If hover<>0
If lastpick<>hover
lastpick=hover
gui()\z=$ffffffff ; passe au dessus
SortStructuredList(gui(),#PB_Sort_Descending,OffsetOf(gui\z),#PB_Sort_Integer)
Else
gui()\x+MouseDeltaX()
gui()\y+MouseDeltaY()
EndIf
EndIf
Else
lastpick=0
EndIf
ForEach gui()
DisplaySprite(gui()\spr,gui()\x,gui()\y)
Next
DisplayTransparentSprite(pointer,MouseX(),MouseY())
ev=WaitWindowEvent(0)
FlipBuffers()
Until ev=#PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
Procedure makegui(x,y,l,h,col)
AddElement(gui())
gui()\x=x
gui()\y=y
gui()\l=l
gui()\h=h
gui()\spr=CreateSprite(#PB_Any,l,h)
StartDrawing(SpriteOutput(gui()\spr))
Box(0,0,l,h,col)
StopDrawing()
gui()\z=ListIndex(gui())
EndProcedure
Procedure Pick()
;sort the interface list
; verifie si la souris est au dessus d'un element du gui
hover=0
For E=ListSize(gui())-1 To 0 Step -1
SelectElement(gui(),e)
gui()\z=ListSize(gui())-ListIndex(gui()) ;
If MouseX()>=gui()\x And MouseY()>=gui()\y And MouseX()=<gui()\x+gui()\l And MouseY()<=gui()\y+gui()\h And hover=0
hover=ListIndex(gui())+1
EndIf
Next
If hover=0
FirstElement(gui())
ProcedureReturn 0 ; au dessus de rien
Else
SelectElement(gui(),hover-1)
ProcedureReturn 1 ; au dessus d'un élément du gui
EndIf
EndProcedure