Source     Discussion     Modifier     Historique     Forums     Salon IRC

Source:Remplissage.pb

Un article de Games Creators Network.

; Comtois
; 02/07/05
 
; La fonction FillArea() est un peu limitée , elle impose de connaitre à l'avance la couleur de bord.
; Dans ce programme , la couleur du tracé est aléatoire ,donc impossible d'utiliser FillArea ,du moins pas à ma connaissance .

; La fonction Remplissage() est lente pour des grandes zones à remplir
; Pour tester faites des petites formes fermées (cercles ou autres) avec la souris en maintenant le bouton gauche de la souris
; Et utilisez le bouton droit de la souris pour remplir une zone d'une couleur aléatoire.
; [F1] pour effacer l'écran

; Delta limite la zone de remplissage à partir de la position de la souris 
; Mettre 800 pour prendre en compte la totalité de l'écran
; ou changez les paramètres de remplissage() de cette façon remplissage(MouseX(), MouseY(), 0, 0, 800, 600, Random($FFFFFF))


InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(800,600,32,"Remplissage")

Enumeration
    #Fond
    #Souris
    #Temoin
EndEnumeration
   
CreateSprite(#Fond,800,600)
CreateSprite(#Souris,3,3)
StartDrawing(SpriteOutput(#Souris))
Box(0,0,3,3,RGB(255,255,255))
StopDrawing()

;Delta limite la zone de remplissage à partir de la position de la souris 
Delta = 100 

Procedure remplissage(xx, yy, MinX, MinY, MaxX, MaxY, c)
    ;Toutes les options de remplissage sont envisageables en modifiant légèrement ce code
    
    ;La version originale de ce code se trouve ici (ainsi que les explications)
    ;http://raphaello.univ-fcomte.fr/IG/Algorithme/Algorithmique.htm#remplissage
    
    ;Remarque : j'ai ajouté les paramètres Min et Max ,
    ;parce qu'une personne sur le forum anglais m'a demandé comment faire pour limiter la zone de remplissage.
    
    Psp = 1
    Dim Px(1000)
    Dim Py(1000)
    Px(0) = xx
    Py(0) = yy
    FrontColor(Red(c), Green(c), Blue(c))
    
    lim = Point(xx, yy)
    If MinX < 0 : MinX = 0 : EndIf
    If MinY < 0 : MinY = 0 : EndIf
    If MaxX > SpriteWidth(#Fond)  : MaxX = SpriteWidth(#Fond)  : EndIf
    If MaxY > SpriteHeight(#Fond) : MaxY = SpriteHeight(#Fond) : EndIf
    
    While Psp <> 0
        xi = Px(Psp - 1)
        xf = Px(Psp - 1)
        x  = Px(Psp - 1)
        y  = Py(Psp - 1)
        
        x + 1
        cp = Point(x, y)
        While cp = lim And x < MaxX
            xf = x
            x + 1
            cp = Point(x,y)
        Wend
        
        x = Px(Psp - 1) - 1
        cp = Point(x, y)
        
        While cp = lim And x > MinX
            xi = x
            x - 1
            cp = Point(x, y)
        Wend
        
        LineXY(xi, y, xf, y)
        Psp - 1
        
        ; Y + 1
        x = xf
        While x >= xi And y < MaxY
            cp = Point(x, y + 1)
            While (((cp <> lim) Or (cp = c)) And (x >= xi))
                x - 1
                cp = Point(x, y + 1)
            Wend
            If ((x >= xi) And (cp = lim) And (cp <> c))
                Px(Psp) = x
                Py(Psp) = y + 1
                Psp + 1
            EndIf
            cp = Point(x, y + 1)
            While (( cp = lim ) And ( x >= xi ))
                x - 1
                cp = Point(x,y+1)
            Wend
        Wend
        
        ; Y - 1
        x = xf
        While x >= xi And y > MinY
            cp = Point(x, y - 1)
            While (((cp <> lim) Or (cp = c)) And (x >= xi))
                x - 1
                cp = Point(x, y - 1)
            Wend
            If ((x >= xi) And (cp = lim) And (cp <> c))
                Px(Psp) = x
                Py(Psp) = y - 1
                Psp + 1
            EndIf
            cp = Point(x, y - 1)
            While (( cp = lim ) And ( x >= xi ))
                x - 1
                cp = Point(x, y - 1)
            Wend
        Wend
    Wend
EndProcedure


Repeat
    FlipBuffers()
    ExamineMouse()
    ExamineKeyboard()
    DisplaySprite(#Fond,0,0)
    DisplaySprite(#Souris, MouseX(), MouseY())
    
    ;Efface le fond
    If KeyboardPushed(#PB_Key_F1)
        StartDrawing(SpriteOutput(#Fond))
        Box(0,0,SpriteWidth(#Fond) ,SpriteHeight(#Fond) , 0)
        StopDrawing()
    EndIf    
    
    ;trace des formes 
    If MouseButton(1)
        StartDrawing(SpriteOutput(#Fond))
        Line(MouseX(),MouseY(),-MouseDeltaX(),-MouseDeltaY(), Couleur)
        StopDrawing()
    Else
        Couleur = Random($FFFFFF)
    EndIf 
    
    ;Remplissage
    If MouseButton(2)
        StartDrawing(SpriteOutput(#Fond))
        remplissage(MouseX(), MouseY(),MouseX() - Delta, MouseY() - Delta, MouseX() + Delta, MouseY() + Delta, Random($FFFFFF))
        StopDrawing()
    EndIf   
    
Until KeyboardPushed(#PB_Key_Escape) 

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.