Tutoriel pour débutant purebasic

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Tutoriel pour débutant purebasic

Message par blendman »

Salut

Pour un ami, j'ai écrit un tutoriel de débutant pour purebasic.

Donc, je me suis dit que j'allais le poster sur le forum, ça peut toujours servir :).
Oui, j'ai mis plein de blagues dedans, oui, je suis comme ça.

Code : Tout sélectionner

; Tutoriel Purebasic pour les nuls (comme moi :))
; by Blendman, 3 juillet 2021.

; Tout d'abord, avant même de commencer, il faut savoir que les lignes qui commencent par ";" sont des commentaires 
; (elles sont souvent en couleur verte en purebasic), donc, le programme n'en tient pas compte.
; ces commentaires nous servent à comprendre le code, à nous rappeler ce qu'on a fait et pourquoi :)
; ou à noter des blagues, aussi.


; Cet un exemple de code est issu de la documentation, que j'ai un peu modifié pour le rendre un peu plus compréhensible par les débutants.
; cet exemple permet d'ouvrir un "gadget" de type "canvasgadget".
; les gadgets, ce sont les éléments de l'interface, comme : les boutons, les "sliders" ou "barre à tirette", 
; les listes déroulantes, les zones de saisies de textes, etc...


; Un canvasgadget() c'est une zone pour dessiner ET afficher ce qu'on dessine. Il y a plusieurs "gadgets" pour dessiner dans purebasic.
; Certains permettent de dessiner ET d'afficher. 
; D'autres ne servent qu'à dessiner dessus (comme les images), ou juste afficher le dessin (un gadget qui s'appelle ImageGadget()).

; voici quelques "gagdets" ou éléments qui permettent de dessiner dessus (et souvent d'afficher le résultat ou des images) : 

; ** DESSIN ET AFFICHAGE : 
; - le CanvasGadget() (qui gère le dessin bitmap (image) ou vectoriel) :
; - les sprites (oui, c'est ce qu'on utilise dans les jeux 2D, mais on peut dessiner dessus, c'est très rapide !)
; - le OpenGLGadget(), qui ouvre une sorte d'écran opengl, et ensuite on peut dessiner dessus, mais c'est très compliqué ^^. 
; - on peut aussi dessiner sur l'écran (screen) ou sur la fenêtre ET afficher, mais c'est pas terrible du tout ^^.

;** DESSIN UNIQUEMENT : 
; - les images : on dessine dessus, mais ensuite, il faut les afficher (par exemple, sur un CanvasGadget() ou sur un sprite). 

;** AFFICHAGE UNIQUEMENT : 
; - ImageGadget() : un gadget qui permet juste d'afficher une image dessus. On dessine sur l'image et on l'affiche sur ce gadget.



;**BIBLIOTHEQUE (library) : On peut dessiner sur un CanvasGadget, un sprite ou une image plusieurs éléments à la suite, en fonction de la bibliothèque choisie : 
; - lib 2Ddrawing : permet de dessiner des rectanlge (box()), des ellipses (circle), des points (plot()), des traits (line()), du text (drawtext()), ou encore des images (Drawalphaimage() ou drawImage()). Concernant les formes (box, circle line..), elles ne sont pas "anti-alisées". De plus, on dessine des pixels en réalité, donc si ensuite on zoome on finit par voir les pixels. Avec cette lib, on peut utiliser des modes de fusions différents. Un mode de fusion, c'est la façon dont deux images se superposent. Par exemple, on peut ajouter des effets de lumière si un élément du dessus est dans un mode spécial. On trouve les modes de fusion dans la plupart des logiciels 2D (photoshop, gimp, krita, etc...). Les modes de fusion les plus courants sont : "multiplier", "ajouter", etc. POur utiliser les mode de fusion, c'est avec la commande Drawingmode() (uniquement valable avec la lib 2Ddrawing).
; - lib VectorDrawing : c'est une bibliothèque qui permet d'utiliser des éléments "vectorisés", les formes sont zoomables à l'infini sans jamais être pixelisée, et elles sont anti-alisées. On peut superposer les éléments (dessiner des lignes, des courbes, des box, des images),mais on ne peut pas utiliser un mode de fusion différent du mode normal, hélas. par contre, on peut faire des rotations ou un zoom de la surface de dessin très facilement.


; Voici donc l'exemple tiré de la doc sur le canvasgadget(), un gadget pour dessiner ET afficher ce qu'on dessine dessus 
; (attention, ce n'est pas un "calque transparent", c'est un calque mais qui comporte un fond blanc (ou de la couleur qu'on veut). 
; Si on veut dessiner sur un calque transparent, il faut utiliser une image transparente pour dessiner dessus, c'est logique,
; et afficher cette image ensuite sur un CanvasGadget() ou sur un sprite. Donc, c'est plus long en terme de performance, hélas.

; pour afficher la documentation sur un "mot-clef" (une info sur l'utilisation d'une fonction par exemple) : 
; - il mettre le curseur de la souris sur le mot, cliquer dessus, puis faire F1. 
; Et paf, ça t'ouvre l'aide. C'est beau la technologie des années 2000.


; LANCER LA COMPILATION ET BAVER DEVANT NOTRE PROGRAMME : 
; pour lancer la compilation et donc tester le programme : 
; - clique sur le bouton (de la toolbar) en forme d'engrenage avec une flèche bleue dessus (comme un bouton play), l'info-bulle affiche d'ailleurs "compile/run".
; Donc, ça compile et ça lance le programme compilé (sil n'y a pas d'erreurs).

; Voici donc le code, issu de la documentation purebasic.
; ce code va lancer un petit programme qui permet de dessiner simplement sur un gadget canvas.


; ici, on ouvre une fenêtre qu'on appelle "Je dessine sur un CanvasGadget". La fenêtre fera 800x600 et sera centrée.
If OpenWindow(0, 0, 0, 800, 600, "Je dessine sur un CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  
  ; puis, on crée le gadget canvas (surface de dessin ET d'affichage)
  ; le gadget doit avoir un identifiant UNIQUE (ID). C'est un peu comme toi, tu as un identifiant (un nom) pour qu'on te reconnaisse.
  ; lui, c'est pareil, sauf que ça doit être un numéro.
  ; on met "0" comme identifiant. Ce gadget "s'appelle" donc "0".
  ; On aurait pu utiliser une "variable " (un truc qui varie) et l'appeler "toto", 
  ; et on aurait fait : toto=0 (puisque l'identifiant, c'est toujours un numéro), donc ça revenait au même en fait.
  ; Mais on va garder "0", c'est plus rapide.
  ; on définit sa position (en x=0 et y=0) et sa taille (800x600)
  CanvasGadget(0, 0, 0, 800, 600)
  
  
  
  ; Ensuite on créé une variable (c'est un truc qui peut varier de valeur) pour savoir si on peut dessiner ou non
  ; on départ, on ne peut pas. Ben non.
  ; ce n'est pas parce qu'on n'a pas été sage. 
  ; C'est parce qu'on ne peut dessiner que si certaines conditions sont remplies :
  ; - être sur la surface de dessin 'canvas)
  ; - cliquer dessus (bouton gauche enfoncé) en bougeant la souris.
  JepeuxDessiner = 0
  
  
  
  
  
  ; là, on lance une "boucle" (le code dans la boucle se repète, jusqu'à ce qu'on lui dise de s'arrêter)
  ; repeat : c'est pour dire au programme "dis, gros, tu répètes le code dans la boucle jusqu'à ce que je TE dise d'arrêter, car c'est moi qui commande."
  Repeat
    
    ; ici, on attend et on va vérifier si on fait un "évènement" sur la fenêtre, comme par exemple: 
    ; - a-t-on cliquer sur la croix rouge pour la fermer ? 
    ; - A-t-on cliquer sur le canvasgadget ?
    Event = WaitWindowEvent()
    ; on attend qu'il y ait un évenement, parce qu'on est sage. Mais surtout, pour économiser du CPU ;).
    
    ; event : c'est une variable (encore une !) qui stocke l'information de l'évenment en cours 
    ; (s'il y a eu un évenement, ou c'est = à 0 s,il n'y aucun évenement en cours).
    ; un evenement, ça peut être un clic sur la croix rouge, un clic sur le canvas, la souris qui bouge, etc.
    ; mais ça, je l'ai déjà dit juste en haut.
    
    
    
    ; maintenant, on vérifie donc l'évenement en cours
    If Event = #PB_Event_CloseWindow
      ; Si l'évenement en cours, c'est "je ferme la fenêtre" (#PB_Event_CloseWindow) (en cliquant sur le bouton "croix" rouge, en haut, à droite de la fenêtre)
      ; alors, on dit au programme qu'il peut tout fermer.
      ; on utilise le mot-clef "End", car c'est la fin du programme, il s'arrête direct, il ne continue même pas la suite.
      ; le gros fainéant, quoi...
      End 
      
      
      
      
      ; sinon, on vérifie si c'est un autre évènement.
      ; ici, on vérifie si l'évenement est un évènement sur un gadget (#PB_Event_Gadget)
    ElseIf Event = #PB_Event_Gadget 
      
      
      
      ; ici, on vérifie sir l'évenement gadget (eventgadget()) a été fait sur le gadget "0"
      ; on se rappelle que le gadget "0", c'est notre canvas ! youpi, on va vérifier si on a donc fait un truc sur notre canvas :).
      If EventGadget() = 0 
        
        
        
        ; ici, on vérifie le type d'évenement (eventType())
        ; si le type d'évenement est un clic gauche-enfoncé de la souris (LeftButtonDown), alors, on peut continuer : 
        If EventType() = #PB_EventType_LeftButtonDown 
          ; on dit au programme qu'on peut dessiner (change la variable JePeuxDessiner à 1)
          JePeuxDessiner = 1
          
          
          ; sinon, si le type d'évenement est "je relache la souris (clic gauche) (LeftButtonUp) : 
          ; elseif, ça veut dire "sinon, si", c'est une condition pour faire des trucs, comme dessiner sur le canvas.
        ElseIf EventType() = #PB_EventType_LeftButtonUp
          ; Donc, si le type d'évenement est un clic gauche relaché (LeftButtonUp), 
          ; alors, on dit au programme : "ben non, on ne peut plus dessiner, non, mais ho !"
          JepeuxDessiner = 0
        EndIf
        ; quand on a ouvert une condition, il faut dire au programme (en purebasic), qu'on termine les condition (endif)
        
        
        
        ; maintenant, on va vérifier si on peut dessiner.
        ; Pour ça, il faut que la "variable" JepeuxDessiner soit  = à 1. Ben oui, logique.
        If JepeuxDessiner = 1
          ; si la variable "JepeuxDessiner" est à 1, ça signifie ? ça signifie ?
          ; A) qu'on peut manger un sandanwich.
          ; B) qu'on peut regarder un film 
          ; C) qu'on peut faire un truc dans le programme, comme dessiner.
          ; C'est bien sur la réponse C, mais on peut faire ça en mangeant un sandwich devant la télé.
          
          
          ; ici, on vérifie qu'on bouge la souris (MouseMove)
          If EventType() = #PB_EventType_MouseMove 
            
            ; Puisque toutes les conditions sont réunies (ouf!!), autrement dit :
            ; - je suis sur le canvas
            ; - j'ai cliqué et mis la variable Jepeuxdessiner à 1 (je dois maintenir le bouton cliqué pour qu'elle reste à 1)ù
            ; - je bouge la souris
            ; alors, maitenant, on va dessiner
            
            ; donc, on démarre le dessin ( avec la fonction StartDrawing())
            ; on lui dit où on veut dessiner (ben oui) : sur la sortie "canvas (CanvasOutput)
            ; on doit lui préciser que le canvas s'appelle "0". Rapele-toi, c'est notre gadget canvas, on lui a donné comme identifiant "0".
            If StartDrawing(CanvasOutput(0))
              
              ; là, on doit choper les coordonnées de la souris, pour souris où on va dessiner :
              x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
              
              ; on les stocke dans des variables "X" et "y", car ces coordonnées vont varier à chaque mouvement qu'on va faire.
              
              ; maitenant, on va dessiner.
              ; Comme on est balèze, on va dessiner un cercle (par une ligne hein, juste un cercle)
              ; on lui met comme taile : 10
              ; et comme couleur le noir (RGB(), ça sert à définir une couleur avec les paramètre rouge/vert/bleu., si les 3 sont à zéro, ça fait du noir.
              ; j'ai pas le temps d'expliquer le RGB, ce sera une prochaine fois, peut être.
              Circle(X, Y, 10, RGB(0,0,0))
              
              ; voilà, on a dessiné notre cercle (youpi)
              ; on peut lui dire qu'on arrête 
              StopDrawing()
              ; précision: on lui dit qu'on arrête le dessin, mais c'est pour cette "frame" -ci. Mais je rappelle que le programme boucle
              ; donc, tant que tu restes avec ta souris appuyé (bouton gauche) et que tu la bouges sur le canvas, ben, tu crées des cercles noirs
              ; et oui, la classe :)
              
            EndIf
            ; je le rappelle : quand on a ouvert une condition, il faut dire au programme (en purebasic), qu'on termine les condition (endif)
            
            ; on doit mettre des endif partout, ben oui, pour finir chaque condition qu'on a lancé.
          EndIf
          
        EndIf
        
        
      EndIf
         ; ça en fait un paquet, car on a ouvert beaucoup de conditions, il faut tout fermer maintenant :)
    EndIf
    
    
    ; cette ligne, c'est lié au "repeat", plus haut.
    ; mais si, rappelle-toi, c'est pour dire qu'on fait une boucle et qu'on lit le code à l'intérieur.
    ; forever, ça veut dire "pour toujours", donc, on boucle "pour tojours"
    ; KUuuua ??
    ; non, mais ca va, on a dit au programme plus haut que pour fermer le programme, c'est si on clique sur le bouton fermer (la croix sur le bouton rouge.
    ; ouf, on est sauvé.
  ForEver
  
  
  ; et alors, cette fin de condition-là, ben punaise, faut la choper...
  ; c'est la fermeture de la 1ère condition "if openwindow(). 
  ; Ben oui, on lui a dit de lancer le programme si la fenêtre s'ouvre (car des fois, elle ne s'ouvre pas, ça arrive).
EndIf


; ici, le programme ne fait plus rien
; car il n'y plus de code.
; en fait, on ne le sait pas, mais en réalité, il pleure un peu car il s'ennuie maintenant.
; non, je rigole.
; un ordinateur, ça ne pleure pas.
A+
Dernière modification par blendman le ven. 20/août/2021 7:50, modifié 1 fois.
pasbel
Messages : 28
Inscription : mer. 10/avr./2019 17:36

Re: Tutoriel pour débutant purebasic

Message par pasbel »

Merci !
chikega
Messages : 4
Inscription : jeu. 19/août/2021 5:14

Re: Tutoriel pour débutant purebasic

Message par chikega »

Merci mille fois! :D
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Tutoriel pour débutant purebasic

Message par blendman »

content que ça vous serve ;)

J'ai ajouté quelques informations sur les "bibliothèques" pour dessiner (2Ddrawing et vectorDrawing), et aussi quelques infos rapides sur "les modes de fusions" ;).

A+
chikega
Messages : 4
Inscription : jeu. 19/août/2021 5:14

Re: Tutoriel pour débutant purebasic

Message par chikega »

Chouette! :D
Répondre