ActionScript3.0で魅せる 鏡面の表現
タイトルでは確かに鏡面といっていますが、ただ半透明の逆さになった画像を下に表示しているだけです。
ただ、それをAS3で記述してみます!
ファイル構成
- flvファイル
- 外部asファイル
- 鏡面する画像ファイル
flvファイルの設定

- インスタンス[“btn”]を設定したムービークリップ
- 鏡面を際立たせるためのグラデーションのシェイプ
- 外部asの読み込み
後、この画面には表示されていませんが、真ん中に透明のラインがあります。
それにインスタンス「”line”」を設定しています。
ActionScriptソース
flvの設定ができれば、後は外部asファイルを作成するだけです。
package {
import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.geom.Point;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.net.URLRequest;
//クラスの宣言
public class FallDown extends MovieClip{
var obj:Array;
var mirror:Array;
var timer:Timer;
//コンストラクタ
function FallDown(){
obj = new Array();
mirror = new Array();
//ステージに表示する画像の初期設定
for(var i:Number = 0; i < 4; ++i) {
obj.push(new Sprite());
var num:Number = obj.length-1;
this.addChild(obj[num]);
obj[num].scaleX = 0.08;
obj[num].scaleY = 0.08;
obj[num].alpha = 0;
if(num == 0){
obj[num].x = 100;
obj[num].y = 0;
} else {
obj[num].x = obj[num-1].x + 80;
}
var imgLoader:Loader = new Loader();
obj[num].addChild(imgLoader);
var urlReq:URLRequest = new URLRequest("../img/img"+num+".jpg");
imgLoader.load(urlReq);
}
//ステージに表示する鏡面画像の初期設定
for(var j:Number = 0; j < 4; ++j) {
mirror.push(new Sprite());
var math:Number = mirror.length-1;
this.addChild(mirror[math]);
mirror[math].scaleX = 0.08;
mirror[math].scaleY = 0.08;
mirror[math].rotation = -180;
mirror[math].alpha = 0;
if(math == 0){
mirror[math].x = 164;
mirror[math].y = 380;
} else {
mirror[math].x = mirror[math-1].x + 80;
mirror[math].y = 380;
}
var onLoader:Loader = new Loader();
mirror[math].addChild(onLoader);
var urlLoad:URLRequest = new URLRequest("../img/img"+math+".jpg");
onLoader.load(urlLoad);
}
//クリックイベントの設定
this["btn"].buttonMode = true;
this["btn"].addEventListener(MouseEvent.CLICK, onClick);
}
//クリック後の設定
function onClick(event:MouseEvent):void{
timer = new Timer(33);
timer.addEventListener(TimerEvent.TIMER, loop);
timer.start();
this["btn"].buttonMode = false;
}
//タイマーイベントの設定
function loop(event:TimerEvent):void{
this["btn"].alpha -= 0.05;
//インスタンス["btn"]の透明度が0の場合
if(this["btn"].alpha < 0){
//画像の動作設定
for(var i:Number = 0; i < obj.length; i++){
var topPlace:Point = new Point();
if(i == 0){
topPlace.y = this["line"].y - 45;
} else {
topPlace.y = obj[i - 1].y;
}
obj[i].alpha += 0.06
obj[i].y += (topPlace.y - obj[i].y)/8;
}
//鏡面画像の動作設定
for(var j:Number = 0; j < mirror.length; j++){
var btmPlace:Point = new Point();
if(j == 0){
btmPlace.y = this["line"].y + 50;
} else {
btmPlace.y = mirror[j - 1].y;
}
mirror[j].y += (btmPlace.y - mirror[j].y)/8;
mirror[j].alpha += 0.01;
if(mirror[j].alpha > 0.2) {
mirror[j].alpha = 0.2;
}
}
}
}
}
}
簡単にソースの解説
- 33行目 – 38行目:if、else文
- このif文で画像の表示を「ずらす」設定をします。
if(num == 0)で1番目の画像の動作を設定します。
次のelse文で、1番目の画像以降をobj[num].x = obj[num-1].x + 80;の動作設定をします。
obj[num-1].x + 80にすることで、表示される画像の前の画像からx軸+80になります。
これで画像は重ならずに等間隔で表示されます。
- 56行目:rotation
- 鏡面する画像をrotation = -180で逆さまに表示させます。
- 99行目 – 109行目
- for文で変数iに数値を代入します。これでobj[i]を使用することが出来ます。
変数topPlaceにPointを指定して、topPlace.y = this[“line”].y – 45;で
インスタンス「”line”」からy軸-45まで移動させる設定します。
またこのif文は33行目 – 38行目のif文と同じ作用があります。
移動するスピードは108行目で指定しています。
- 121行目 – 125行目
- 鏡面する画像の透明度を指定しています。
121行目で透明から不透明に変化するスピード指定しています。
次にif文で鏡面する画像の透明度が0.2になると、透明度を0.2になる指定をします。
これをしないと、不透明になるまで進んでしまうからです。
サンプル
鏡面を表現するのに、別の方法があるはずです。
もっと色んな表現方法を追求していきます!
- Web-Parkのホーム >
- Flash >
- ActionScript3.0で魅せる 鏡面の表現
Warning: count(): Parameter must be an array or an object that implements Countable in /home/markcrest/web-park.org/public_html/wordpress/wp-includes/class-wp-comment-query.php on line 405
COMMENT PLEASE!!
トラックバック
- 「ActionScript3.0で魅せる 鏡面の表現」のトラックバックURL
Warning: Use of undefined constant display - assumed 'display' (this will throw an Error in a future version of PHP) in /home/markcrest/web-park.org/public_html/wordpress/wp-content/themes/default/single.php on line 105
https://web-park.org/flash/falldown091208.html/trackback
COMMENT!!
おぉー。