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