2009-04-28 15 views
7

quiero preguntar, cómo cambiar solo el color de relleno de una instancia en el escenario - puedo hacerlo utilizando el objeto ColorTransform, pero cambia el color de toda la instancia, no solo el relleno . Quiero cambiar solo el color de relleno, no el color de trazo. ¿Alguien puede ayudarme?Cambiando el color de relleno de MovieClip Actionscript 3

este es mi código:

function paint(){ 
    var myColorTransform:ColorTransform = new ColorTransform(); 

    myColorTransform.color = someColorNumber; 

    coloredObject.transform.colorTransform = myColorTransform; 

} 

Respuesta

5

Esto no puede hacerse una vez que ha dibujado una forma como la escritura de la acción no tiene manera de determinar lo que es un golpe y lo que es un relleno.

Tienes un par de opciones.

Separe su relleno y trazo en clips de película por separado y configure la transformación de color para que solo se aplique al relleno.

o

Si se trata de una forma sencilla, dibujar utilizando el objeto Graphics, donde puede especificar los colores de relleno y los colores de trazo.

Probablemente la campana sea, y mi método preferido, las primeras opciones, ya que la forma probablemente sea compleja y dejarla en la fla le da un mayor control para que un diseñador pueda cambiarla en lugar de un desarrollador. Sin embargo, es un poco más trabajo y un poco más complejo.

+1

sí, ya he encontrado la primera solución, gracias;) – Dungeo

2

Si se dirige al FP10 y desea un filtro simple como el que probó con ColorTransform, podría escribir un Kernel de PixelBlender para tomar 2 argumentos de colores (uno para el origen, uno para el destino), unir el píxel con el color de la fuente, y cambiarlos por el destino; algo como esto:

//I release this under the MIT License. Use it to your heart's content. 

<languageVersion : 1.0;> 

kernel ReplaceColor 
< namespace : "PIPEEP"; 
    vendor : "PiPeep"; 
    version : 1; 
    description : "Replace color"; 
> 
{ 
    input image4 src; 
    output pixel4 dst; 

    parameter pixel4 sColor 
    < 
     minValue:pixel4(0.); 
     maxValue:pixel4(255.); 
    >; 
    parameter pixel4 dColor; 
    parameter float tolerance; 

    void 
    evaluatePixel() 
    { 
     dst = sampleNearest(src,outCoord()); 
     pixel4 sColorAdjusted = abs((sColor/pixel4(255.)) - dst); 
     if(sColorAdjusted.r < tolerance && sColorAdjusted.g < tolerance && sColorAdjusted.b < tolerance && sColorAdjusted.a < tolerance) { 
      dst = dColor; 
     } 
    } 
} 

recuerda por qué odia el IDE PixelBlender

EDIT: Recuerda que esto no va a jugar bien con anti-aliasing, pero si está utilizando Stage.quality = " bajo ", no importará.

Para añadir uso en AS3, intente esto (robado de http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/, por lo que tendrá que cambiar algunas líneas de código):

La primera parte del código se define algunas variables que se utilizará mas tarde. Los únicos dos que pueden parecer nuevos son Shader y ShaderFilter. Estos son los nuevos en Flash Player 10 y son las clases responsables del manejo de los datos del filtro Bender Pixel .

var loader:URLLoader; 
var shader:Shader; 
var shaderFilter:ShaderFilter; 
var image:MovieClip; 
var timer:Timer; 
var timerInt:uint = 40; 

El siguiente paso en el código es cargar la imagen en el escenario, que agregó en los pasos anteriores.

image = new SampleImage(); image.y = 
20; image.x = 25; 

addChild(image); 

Los primeros dos métodos para crear sirven para cargar el archivo PBJ y inicializar la creación de filtros proceso

function startEffect() { loader = new 
URLLoader(); loader.dataFormat = 
URLLoaderDataFormat.BINARY; 
    loader.addEventListener(Event.COMPLETE, 
loadComplete); loader.load(new 
URLRequest("sample.pbj")); } 



function loadComplete(e:Event):void { 
    shader = new Shader(loader.data); 
    initFilter(); } 

La siguiente función initFilter() se llama una vez que el archivo de PBJ es éxito cargado, para que se pueda crear el filtro . Este filtro establece los valores de color r, g, b de la imagen, que esencialmente muestra el detalle de la imagen . El "shader.data.red.value" para ejemplo hace referencia a un código de Pixel Bender que fue escrito en el principio, si se nota que tiene código un "parámetro de flotador rojo", que es una variable flotador para ajustar el nivel de rojo. En este caso, el valor es establecido en 20. Este proceso se repite para los otros 2 colores, y luego es pasado a la instancia de la imagen.

La última parte de esta función configura el temporizador que se ejecutará para aplicar este filtro hasta que la imagen vuelve a su aspecto normal de

function initFilter() { 
    shader.data.red.value = [20]; 
    shader.data.green.value = [20]; 
    shader.data.blue.value = [20]; 
    shaderFilter = new 
ShaderFilter(shader);  image.filters = 
[shaderFilter]; 



    timer = new Timer(timerInt, 0); 
    timer.addEventListener(TimerEvent.TIMER, 
timerHit); timer.start(); } 

La función final se repite el proceso de aplicar el filtro , pero primero toma los valores de filtro actuales y resta 0.1 del valor en cada pase . Este proceso elimina lentamente la intensidad del filtro de la imagen hasta que se haya ido por completo. Esta función timerHit() se invoca desde el temporizador que se creó en la función initFilter() .

function timerHit(e:TimerEvent):void 
{ 
    if(shader.data.red.value == 1) 
    { 
     timer.stop(); 
     return; 
    } 

    var r:uint = shader.data.red.value - 0.1; 
    var g:uint = shader.data.green.value - 0.1; 
    var b:uint = shader.data.blue.value - 0.1; 

    shader.data.red.value =  [r]; 
    shader.data.green.value = [g]; 
    shader.data.blue.value = [b]; 
    shaderFilter = new ShaderFilter(shader); 
    image.filters = [shaderFilter]; 
} 

El último paso en el código es comenzar el proceso, que en esta solicitud se hace llamando a la función startEffect() , así que es lo que vamos a hacer

startEffect();

¡Perdón por hacer sangrar tus ojos! ¡Creo que es mi respuesta más larga hasta ahora!

5

Sé que esto es un poco tarde para el juego, pero estaba teniendo el mismo problema y lo solucioné de forma diferente. Puede que no sirva de nada, ya que solo funcionará en circunstancias limitadas *, pero comencé con mi forma llena de blanco & con líneas negras. De esta forma, puede aplicar una transformación de color con multiplicadores RGB, para desvanecer el blanco hasta el color deseado, dejando intacto el borde negro. Así que para hacer su tarjeta roja objeto (con borde negro) usan:

function paint() { 
    shape.transform.colorTransform = new ColorTransform(1, 0, 0); 
} 

O para la naranja de desbordamiento de pila (aún con borde negro):

function paint() { 
    shape.transform.colorTransform = new ColorTransform(0.996, 0.478, 0.082); 
} 

* Sólo funcionará si sólo quiere una color único con un borde negro.

Cuestiones relacionadas