Pergunta

eu quero perguntar, como alterar apenas a cor de preenchimento de uma instância no palco - eu posso fazê-lo usando objeto ColorTransform, mas ele muda de cor de toda a instância, não apenas o preenchimento. Eu quero alterar apenas a cor de preenchimento, não a cor do traço. Alguém pode me ajudar?

Este é meu código:

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

    myColorTransform.color = someColorNumber;

    coloredObject.transform.colorTransform = myColorTransform;

}
Foi útil?

Solução

Este não pode ser feito uma vez que você tenha desenhado uma forma como script de ação não tem nenhuma maneira de determinar o que é um golpe e que é um preenchimento.

Você tem um par de opções.

Separar o seu preenchimento e acidente vascular cerebral em clipes de filme separado e defina a transformação de cor para aplicar apenas para o preenchimento.

ou

Se é uma forma simples, desenhá-lo usando o objeto Graphics, onde você pode especificar cores de preenchimento e cores de curso.

capa provável é, e meu método preferido, seriam as primeiras opções como a forma é provável que seja complexo e deixando-o no fla dá maior controle para um designer ser capaz de mudá-lo em vez de um desenvolvedor. É um pouco mais de trabalho embora e um pouco mais complexo.

Outras dicas

Eu sei que isto é um pouco tarde para o jogo, mas eu estava tendo esse mesmo problema e fixa-lo um pouco diferente. Não pode ser de alguma ajuda, uma vez que só irá funcionar em circunstâncias limitadas *, mas eu comecei com a minha forma de ser preenchido branco e acariciou preto. Dessa forma, você pode aplicar uma transformação de cor com multiplicadores RGB, a desvanecer-se o baixo branco a sua cor desejada deixando a borda preta intacta. Então, para fazer o seu objeto vermelho (com beira preta) use:

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

Ou para Stack Overflow laranja (ainda com beira preta):

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

* Ele só vai funcionar se você quiser apenas uma única cor com uma borda preta.

Se você está direcionando FP10, e você quer um filtro simples como o que você tentou com ColorTransform, você poderia escrever um PixelBlender Kernel para tomar um 2 argumentos de cores (uma para fonte, um para destino), coincide com o pixel com o cor de origem, e trocá-los para o destino; algo como isto:

//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;
        }
    }
}

se lembra por que ele odeia o PixelBlender IDE

EDIT:. Lembre-se que isso não vai jogar bem com anti-aliasing, mas se você estiver usando Stage.quality = "baixa", ele não importará

Para adicionar usá-lo em AS3, tente este (roubado de http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/ , assim você terá que mudar algumas linhas de código):

A primeira parte do código é definir algumas variáveis ??para ser usado mais tarde. A apenas dois que pode parecer novo são Shader e ShaderFilter. Estes são novos para o Flash Player 10 e são as classes responsável pelo tratamento do Pixel filtrar dados Bender.

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

O próximo passo no código é a carga a imagem para o palco, que você adicionou nas etapas anteriores.

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

addChild(image);

Os dois primeiros métodos a serem criados são para carregar o arquivo PBJ e inicializar a criação de filtros processo

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(); }

O próximo initFilter() função é chamado uma vez o arquivo PBJ é carregado com sucesso, de modo que o filtro pode Ser criado. Este filtro define o r, g, b Os valores de cor da imagem, as quais essencialmente sopra o detalhe do imagem. O "shader.data.red.value" para exemplo está referenciando o pixel código bender que foi escrito no começando, se você notar que o código tem um "parâmetro flutuador Vermelho", que é uma flutuar variável para ajustar o nível de vermelho. Neste caso, o valor está sendo conjunto para 20. Este processo é repetido para os outros 2 cores, e depois é passado para a instância de imagem.

A última parte desta função configura o temporizador que será executado para aplicar esta filtro até que a imagem retorna à sua parece normal

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(); }

A última função repete o processo de aplicação do filtro, mas em primeiro lugar agarra os valores actuais e filtros subtrai o valor de 0,1 em cada passar. Este processo remove lentamente a intensidade de filtro a partir da imagem até ele é completamente desaparecido. este timerHit() função é chamada a partir do temporizador que foi criado no initFilter() função.

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]; 
}

O último passo no código é começar o processo, o que nesta aplicação é feito chamando o startEffect() função, de modo que é o que vamos fazer

startEffect();

Desculpe por fazer seus olhos sangrar! Eu acho que é a minha resposta mais longa ainda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top