Ci dessous une mise en situation de la zone de sélection.


C’est le genre d’outils qu’il est bon d’avoir à disposition : Télécharger

Explications d’utilisation :
.La zone de sélection est un Sprite, c’est donc a vous de gérer sa position dans la displaylist
.La zone de sélection dispatch un évènement dans les cas suivant :
Event.INIT sur le mouseDown
Event.RESIZE sur le mouseMove
Event.COMPLETE sur le mouseUp
.la zone de sélection possède un accesseur rect() qui renvoi un rectangle dont l’origine est le coin haut-gauche.
Note : Dans photoshop la zone de sélection est toujours bien visible, vous pouvez obtenir le même effet en passant le Sprite en BlendMode.DIFFERENCE sur le Event.INIT puis le rétablir en BlendMode.NORMAL sur le Event.COMPLETE.

Explications de code :
L’idée générale est de dessiner un contour (ici celui d’un rectangle) en utilisant un dégradé linéaire incliné de 45° (2.356195 radian)
L’effet de défilement est obtenu en manipulant la matrice de transformation du dégradé dans la boucle d’affichage (voir le _onEnterFrame)

Voie d’amélioration :
En l’état cet outil est suffisant mais si on avait a créer un outil de sélection plus polyvalent ( qui assure la prise en charge d’autres formes de sélection par exemple) il faudrait gagner en abstraction, avec une méthode draw() overridable.

package fr.yopsolo.utils
{
import flash.display.GradientType;
import flash.display.Graphics;
import flash.display.InterpolationMethod;
import flash.display.SpreadMethod;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;

/**
* ...
* @author YopSolo
*
*
*
*
*
*/
public class SelectZone extends Sprite
{
//  const
private const COLORS: Array = [0x0000000, 0x00CC00];
private const ALPHAS: Array = [0, 255];
private const SIZE: int = 5;
// le rectangle
private var startX: Number;
private var startY: Number;
private var zoneWidth: Number;
private var zoneHeight: Number;

private var colors: Array;
private var alphas: Array;
private var matrix: Matrix;
private var ratios: Array;

public function SelectZone()
{
matrix = new Matrix();
ratios = [];
colors = [];
alphas = [];
var j: int;
var n: int = COLORS.length;
for (var i: int = 0; i < n; i++)
{
ratios.push(int(0xFF / n * i));
ratios.push(int((0xFF / n * (i + 1)) - 1));
colors.push(COLORS[i]);
colors.push(COLORS[i]);
alphas.push(ALPHAS[i]);
alphas.push(ALPHAS[i]);
}

this.addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}

private function onAddedToStage(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

stage.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
}

// -- Getter

public function get rect():Rectangle {
var sx:Number = startX;
var sy:Number = startY;

if (zoneWidth < 0) {
sx += zoneWidth;
}
if (zoneHeight < 0) {
sy += zoneHeight;
}

return new Rectangle(sx , sy, Math.abs(zoneWidth), Math.abs(zoneHeight) )
}

// -- Events
private function _onMouseMove(e:MouseEvent ): void
{
with (graphics) {
clear();
lineStyle(1);
lineGradientStyle(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.REPEAT, InterpolationMethod.LINEAR_RGB);
drawRect(startX, startY, (zoneWidth = stage.mouseX - startX), (zoneHeight = stage.mouseY - startY));
endFill();
}

// warning CPU-intensive
//e.updateAfterEvent();
// --
dispatchEvent( new Event(Event.RESIZE,false, false) );
}

private function _onMouseDown(e: MouseEvent ): void
{
startX = stage.mouseX;
startY = stage.mouseY;
zoneWidth = zoneHeight = 0;
matrix.createGradientBox(SIZE, SIZE, 2.356195 , startX, startY);
stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_MOVE, _onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_UP, _onMouseUp);
removeEventListener(Event.ENTER_FRAME, _onEnterFrame);
// --
dispatchEvent( new Event(Event.INIT,false, false) );
}

private function _onMouseUp(e: MouseEvent): void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, _onMouseUp);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, _onMouseMove);
stage.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseDown);
addEventListener(Event.ENTER_FRAME, _onEnterFrame);
// --
dispatchEvent( new Event(Event.COMPLETE,false, false) );
}

// update loop
private function _onEnterFrame(e: Event ): void
{
with (graphics)	{
clear();
lineStyle(1);
lineGradientStyle(GradientType.LINEAR, colors, alphas, ratios, matrix, SpreadMethod.REPEAT, InterpolationMethod.LINEAR_RGB);
drawRect(startX, startY, zoneWidth, zoneHeight);
endFill();
}
matrix.tx -= 0.5;
}

}

}

Son et graphismes et viennent du mythique Warcraft 2


Vote in HexoSearch