Alterar cor de preenchimento de Clipe de filme ActionScript 3
-
18-09-2019 - |
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;
}
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 noinitFilter()
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!