Comment créer clone de MS Paint avec Python et pygame
Comme je le vois, il y a deux façons de gérer les événements de la souris pour dessiner une image.
La première consiste à détecter lors des déplacements de la souris et tracez une ligne à la souris, montre ici. Toutefois, le problème c'est qu'avec une grande taille de la brosse, de nombreux écarts apparaissent entre chaque "ligne" qui n'est pas droit, puisque c'est à l'aide de la ligne de contour de la taille pour créer des lignes épaisses.
L'autre façon est de dessiner des cercles lorsque la souris se déplace comme le montre ici. Le problème, c'est que des écarts apparaissent entre chaque cercle si la souris se déplace plus vite que l'ordinateur détecte l'entrée de la souris.
Voici une capture d'écran avec mes questions à la fois:
Quelle est la meilleure façon de mettre en œuvre un pinceau comme MS Paint, avec un décemment grande taille du pinceau avec pas de lacunes dans le tracé de la ligne ou pas d'espace entre chaque cercle?
- Je ne comprends pas votre problème avec des lignes. Tu parles du manque de capuchons d'extrémité, ou...?
- Il vous suffit de combiner les deux. Lignes épaisses + de cercles.
- Voici une capture d'écran de mes problèmes à la fois: imgur.com/32DXN en Utilisant à la fois des lignes épaisses et des cercles semblent comme il pourrait résoudre le problème, mais le son n'est pas très élégant, donc je vais y réfléchir un peu plus et utiliser que comme un dernier recours.
- +1, j'étais à mettre en œuvre une... gah!
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas faire les deux?
Dessiner un cercle à chaque extrémité et une ligne entre les deux.
MODIFIER mdr, juste ne pouvais pas m'en empêcher.
En fait, vous ne voulez pas utiliser
pygame.draw.line
parce qu'il triche. Il remplit de 1 pixel de large de ligne ou de colonne (en fonction de l'angle d'attaque) de pixels. Si vous allez à peu près perpendiculaire à l'angle de 0 ° ou 90°, ce n'est pas un problème, mais à 45 ans, vous remarquerez une sorte de haricots effet.La seule solution est de dessiner un cercle à chaque pixel la distance. Ici...
Pas blitting à chaque tour de boucle étape peut améliorer la vitesse du dessin (à l'aide de ce code adapté à partir de la précédente permet de supprimer gal problème sur ma machine)
Pour le premier problème, vous avez besoin d'avoir un arrière-plan, même si c'est juste une couleur. J'ai eu le même problème avec une réplique d'un jeu de pong que j'ai fait. Voici un exemple d'une réplique d'un programme de peinture que j'ai faite, clic gauche pour tirer, cliquez à droite pour effacer, cliquez sur l'image couleur pour choisir une couleur, et le bouton d'effacement de l'écran:
Voici une version simplifiée de celle de Matthieu exemple qui n'est malheureusement pas praticable.
Lorsque la souris est déplacée,
pygame.MOUSEMOTION
événements sont ajoutés à la file d'attente des événements qui contiennent la position et le mouvement relatif. Vous pouvez les utiliser pour calculer la position précédente et passer ensuite les deux points depygame.draw.line
.pygame.MOUSEMOTION
événements ont également unbuttons
attribut que vous pouvez utiliser pour vérifier quel bouton de la souris est actuellement en panne.