私が正しければ、このコードはあなたが見たかったものを表示します。
まず第一に、オブジェクトと情報の初期設定を無視して、例の状況自体に焦点を当てました。「モノリス」の偽投影シャドウ (以下の例では、任意のオブジェクトが可能であり、テクスチャも含まれています) 私の理由は、Matrix
学習する価値のある便利なツールである ActionScript のクラスを使用すると、非常に簡単だからです。
解決策: 組み込みMatrix
クラスを使用して、 で傾斜変換を行うことができますDisplayObject
。この例を試してください:
(「便利な」部分は _EF EnterFrame ハンドラにあります;))
import flash.display.MovieClip;
import flash.geom.Matrix;
import flash.events.Event;
import flash.display.BitmapData;
const PIP180:Number = Math.PI / 180;
const MAX_SHADOW_HEIGHT_MULTIPLIER:Number = 0.25; // you can also calculate this from an angle, like ... = Math.sin(angle * PIP180);
const ANIM_DEG_PER_FRAME:Number = 1.0 * PIP180; // the shadow creeps at a +1 degree per frame rate
var tx:BitmapData = new MonolithTexture(); // define this BitmapData in the library
var skew:Number = -10 * PIP180; // initial
var mono:MovieClip = new MovieClip();
mono.graphics.beginBitmapFill(tx);
// drawn that way the registration point is 0,0, so it's standing on the ground
mono.graphics.drawRect(0, -tx.height, tx.width, tx.height);
mono.graphics.endFill();
// align monolith to the "ground"
mono.x = stage.stageWidth / 2;
mono.y = stage.stageHeight - 100;
// make it be 100x300 pixel
mono.width = 100;
mono.height = 300;
var shad:MovieClip = new MovieClip();
// colored:
shad.graphics.beginFill(0x000000);
// or textured:
//shad.graphics.beginBitmapFill(tx);
shad.graphics.drawRect(0, -tx.height, tx.width, tx.height);
shad.graphics.endFill();
addChild(shad); // shadow first
addChild(mono); // then the caster object
addEventListener(Event.ENTER_FRAME, _EF);
function _EF(e:Event):void {
// animate skew on the positive half circle
skew = (skew + ANIM_DEG_PER_FRAME) % Math.PI;
// Matrix takes 6 parameters: a, b, c, d, x, y
// for this shadow trick, use them as follows:
// a = width scaling (as mono and shad are drawn in the same way, copy mono.scaleX for a perfect fit
// b = 0, because we don't want to project the vertical axis of transformation to the horizontal
// c = horizontal skew
// d = height scaling * skew * making it a bit flat using the constant
// x = mono.x, ...
// y = mono.y since originally mono and shad look alike, only the Matrix makes shad render differently
var mtx:Matrix = new Matrix(mono.scaleX, 0, Math.cos(skew), mono.scaleY * Math.sin(skew) * MAX_SHADOW_HEIGHT_MULTIPLIER, mono.x, mono.y);
shad.transform.matrix = mtx;
}
あなたのケースでこれを利用するために知っておくべきことは、次の N ファクターだけです。
Q1: どの角度から影を投影したいですか?
A1: 水平方向の係数はskew
変数そのものですが、垂直方向の角度は定数としてここに格納されます。MAX_SHADOW_HEIGHT_MULTIPLIER
Q2: 影を「上」だけに投影したいですか、それとも自由に投影したいですか? A2: 「上向き」でよい場合skew
は、正の範囲にとどめます。それ以外の場合は、「下向き」の影についても負の値を取ります。
PS: オブジェクトの内部を基点として 0 y にスナップしないようにレンダリングする場合は、フロート/シンクのように見せるか、両方のオブジェクトを定義済みの値で垂直方向にオフセットし、反対の符号を付けることができます。