compensation circulaire régions du HTML5 Canvas
Il semble que le seul moyen pour effacer une région à partir d'une toile est d'utiliser le clearRect() la commande - j'ai besoin de vider un cercle (je suis en masquant les zones à partir d'un rempli de toile, point lumières dans ce cas précis) et malgré toutes les tentatives, il ne semble pas possible.
J'ai essayé de dessiner un cercle avec une valeur alpha de 0, mais tout simplement rien ne semble, à moins que l'alpha était plus élevé (ce qui est contraire au point :P) - je supposer que, parce que un contex.fill() dessine comme un ajout plutôt que de les remplacer.
Des suggestions sur comment je pourrais être en mesure de (rapidement) claire des cercles pour masque fins?
- Il y a deux bonnes réponses ici, mais j'aimerais voir une capture d'écran de ce que vous voulez accomplir, juste au cas où il y a de plus performant et de façon intelligente d'aller accomplir la même tâche
- j'ai accepté le clip() réponse mais simplement pour satisfaire votre curiosité (et peut-être que vous avez une meilleure technique!) voici ce que j'ai fais: j'ai rendu 2D point des lumières à un tampon. J'ai rendu la mémoire tampon sur mon jeu en utilisant les Alléger le style, c'acheives grand effet! Mais je voulais aussi assombrir tout n'est pas allumé à l'ambiante à la valeur - cela ne tire pas à Éclaircir il se doit donc d'être un autre tirage. Toutefois rendu une autre ambiante tampon assombrit les lumières que je ne voulais pas, donc je veux "masque" les allumés régions dans ma ambiante de la mémoire tampon 🙂
- Merci. J'ai répondu avec un peu d'info qui pourrait être utile en fonction de ce que vous faites
Vous devez vous connecter pour publier un commentaire.
Utilisation
.arc
pour créer un contour circulaire et ensuite utiliser.clip()
pour faire que l'actuelle région de coupure.Ensuite, vous pouvez utiliser
.clearRect()
pour effacer l'ensemble de la toile, mais seulement l'coupées zone va changer.Si vous êtes de faire un jeu ou quelque chose où la compression de chaque bit de la performance est importante, regardez comment j'ai fait cette réponse: Toile - Remplir un rectangle dans tous les domaines qui sont entièrement transparent
Plus précisément, la modification de la réponse qui mène à ceci: http://jsfiddle.net/a2Age/2/
L'énorme plus ici:
(1) en fait je s'est plaint de ce et resetClip() a été mis en officiel spec cause de ça, mais il faudra un certain temps avant de mettre en œuvre les navigateurs il.
Code
JS:
CSS:
HTML:
Compte tenu des exigences, ces réponses sont beaux. Mais disons que vous êtes comme moi et que vous avez des exigences supplémentaires:
Pour la première exigence, la solution est d'utiliser
context.globalCompositeOperation = 'destination-out'
Le bleu est la première forme et le rouge est la deuxième forme. Comme vous pouvez le voir,destination-out
supprime la section de la première forme.Voici un exemple de code:
Voici le problème potentiel avec ceci: La deuxième
fill()
sera clair tout dessous, y compris l'arrière-plan. Parfois, vous aurez envie de vider uniquement la première forme, mais vous voulez toujours voir les couches qui sont en dessous.La solution qui consiste à dessiner sur une temporaire de la toile et ensuite
drawImage
pour dessiner le temporaire de la toile sur le principal de votre toile. Le code ressemblera à ceci:Vous avez quelques options.
Tout d'abord, voici une fonction que nous allons utiliser pour remplir un cercle.
clip()
Voir cela sur jsFiddle.
globalCompositeOperation
Voir cela sur jsFiddle.
Les deux ont donné le résultat souhaité sur l'écran, mais la performance n'était pas suffisant dans mon cas, comme je l'ai été de dessin et de compensation beaucoup de cercles de chaque image pour un effet. En fin de compte j'ai trouvé une autre méthode pour obtenir un effet similaire à ce que je voulais par simple tracé de lignes plus épaisses sur un arc, mais le ci-dessus peut toujours être utile à quelqu'un d'avoir différentes exigences de performance.
Utilisation
canvas.getContext("2d").arc(...)
pour dessiner un cercle sur la zone avec la couleur de fond?Où x = position de gauche, y = position de droite, r = rayon, et ctx = votre toile: