8

ステージ上のインスタンスの塗りつぶしの色だけを変更する方法をお聞きしたいです - ColorTransform オブジェクトを使用してそれを行うことができますが、塗りつぶしだけでなくインスタンス全体の色を変更します。線の色ではなく、塗りの色だけを変更したい。誰でも私を助けることができますか?

これは私のコードです:

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

    myColorTransform.color = someColorNumber;

    coloredObject.transform.colorTransform = myColorTransform;

}
4

3 に答える 3

6

アクション スクリプトには、何がストロークで何が塗りつぶしであるかを判断する方法がないため、シェイプを描画した後は、これを行うことはできません。

いくつかのオプションがあります。

塗りと線を個別のムービー クリップに分割し、色の変換を塗りにのみ適用するように設定します。

また

単純な形状の場合は、塗りつぶしの色と線の色を指定できる Graphics オブジェクトを使用して描画します。

形状が複雑である可能性が高く、フラットのままにしておくと、開発者ではなくデザイナーが変更できるため、フードが最初の選択肢になる可能性が高く、私の好みの方法です。ただし、もう少し作業が必要で、少し複雑です。

于 2009-04-28T07:59:37.177 に答える
5

私はこれがゲームに少し遅れていることを知っていますが、私はこれと同じ問題を抱えていて、少し違った方法で修正しました. 限られた状況でしか機能しないので役に立たないかもしれません*が、私は自分の形を白く塗りつぶし、黒く塗りつぶすことから始めました. そうすれば、RGB 乗数を使用して色変換を適用し、黒の境界線をそのままにして、白を目的の色にフェードダウンできます。したがって、オブジェクトを赤 (黒の境界線付き) にするには、次を使用します。

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

またはスタック オーバーフロー オレンジ (まだ黒い境界線) の場合:

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

*黒の縁取りのある単一の色が必要な場合にのみ機能します。

于 2009-10-01T11:56:15.157 に答える
2

FP10をターゲットにしていて、ColorTransformで試したような単純なフィルターが必要な場合は、PixelBlenderカーネルを作成して、2つの色の引数(1つはソース用、もう1つは宛先用)を取り、ピクセルをソースカラーと一致させることができます。そしてそれらを目的地と交換します。このようなもの:

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

彼がPixelBlenderIDEを嫌う理由を覚えています

編集:これはアンチエイリアシングではうまく機能しないことを覚えておいてください。ただし、stage.quality = "low"を使用している場合は、問題ありません。

as3での使用を追加するには、これを試してください(http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/から盗まれたため、数行のコードを変更する必要があります)。

コードの最初の部分は、後で使用するいくつかの変数を定義しています。新しく見える可能性があるのは、ShaderとShaderFilterの2つだけです。これらはFlashPlayer10の新機能であり、ピクセルベンダーフィルターデータの処理を担当するクラスです。

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

コードの次のステップは、前のステップで追加した画像をステージにロードすることです。

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

addChild(image);

作成される最初の2つの方法は、pbjファイルをロードし、フィルター作成プロセスを初期化するためのものです。

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

initFilter()pbjファイルが正常にロードされると次の関数が呼び出されるため、フィルターを作成できます。このフィルターは、画像のr、g、bカラー値を設定します。これにより、基本的に画像の細部が吹き飛ばされます。たとえば、「shader.data.red.value」は、コードに赤のレベルを設定するためのfloat変数である「parameterfloat red」があることに気付いた場合、最初に記述されたピクセルベンダーコードを参照しています。この場合、値は20に設定されています。このプロセスは他の2色に対して繰り返され、その後、画像インスタンスに渡されます。

この関数の最後の部分は、画像が通常の外観に戻るまでこのフィルターを適用するために実行されるタイマーを設定します

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

最後の関数は、フィルターを適用するプロセスを繰り返しますが、最初に現在のフィルター値を取得し、各パスの値から0.1を減算します。このプロセスは、画像が完全になくなるまで、画像からフィルター強度をゆっくりと取り除きます。このtimerHit() 関数は、関数で作成されたタイマーから呼び出され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]; 
}

コードの最後のステップは、プロセスを開始することです。このアプリケーションでは、startEffect() 関数を呼び出すことによって実行されます。これを実行します。

startEffect();

目を出血させてすみません!それが私の最長の答えだと思います!

于 2009-07-02T18:50:19.233 に答える