トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ドラッグ中にブラーをかけたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
e271828
Åê¹ÆNo.41009
投稿日時: 2008-12-13 18:44
新米
居住地:
投稿: 11
使用環境:
MacOSX,FlashCS3,Flash8
ドラッグ中にブラーをかけたい
インスタンスをドラッグ中にブラーがかかるような処理を考えています。自分で考えて実装してみたのですが、ドラッグ中はブラーがかかっているように見えるのです。しかし、まれにドロップした時にブラーがかかりっぱなしといったことが生じます。

以下、ソースコードと実行結果のFlashが置いてあります。
http://d.hatena.ne.jp/dasign/20081213

ドロップした時にブラーがかかっていないようにするアイデア、または全然違う方法だけど題名の処理を実現するアイデアなどありましたらお力添えいただきたいです。よろしくお願いします。

joyko
Åê¹ÆNo.41011
投稿日時: 2008-12-13 22:51
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
Re: ドラッグ中にブラーをかけたい
以下で、要望の動きになるのではと思います。
(私も、AS3.0は勉強中です)

//import flash.events.Event;//これも含めて、以下の2つも無くてもいいです
//import flash.events.MouseEvent;
//import flash.filters.BlurFilter;

//初期設定領域
var filter:BlurFilter= new BlurFilter();
filter.blurX=16;//2のべき乗だと、レンダリングが速くなります
filter.blurY=16;
filter.quality=BitmapFilterQuality.HIGH;
var On:Boolean=false;//mcが、mousedownされた時の制御変数で、初期値は、false
//mcのドラッグ領域を、Rectangleで指定、ステージサイズを指定
var bounds:Rectangle=new Rectangle(0,0,mc.stage.stageWidth,mc.stage.stageHeight);
mc.buttonMode=true;//mcのボタン化

//メソッド定義領域
mc.addEventListener(MouseEvent.MOUSE_DOWN, Press);
mc.addEventListener(MouseEvent.MOUSE_UP, Release);
mc.addEventListener(Event.ENTER_FRAME, EnterFrame);

function Press(event:MouseEvent):void {
On=true;
mc.startDrag(true,bounds);//マウス位置に、mcの中心点を合わせ、ステージ内でドラッグ
}

function Release(event:MouseEvent):void {
On=false;
mc.stopDrag();
}

function EnterFrame(event:Event):void {
if (On) {//mcに、mousedown時は、Onがtrueとなり、
mc.filters=[filter];//filterを適用
} else {//mcから、mouseup時は、Onがfalseとなり、
mc.filters=null;//filterを無効とする
}
}
e271828
Åê¹ÆNo.41012
投稿日時: 2008-12-13 23:24
新米
居住地:
投稿: 11
使用環境:
MacOSX,FlashCS3,Flash8
Re: ドラッグ中にブラーをかけたい
お返事どうもありがとうございます!
なるほど、確かにドラッグ中ブラーがかかっていますね!

でもすみません、僕の説明不足だったのですがこんな仕様を目指しています。

・素早く遠くにドラッグするほど、その移動方向に強いブラーが。逆にゆっくりだとあまりブラーはかからないようにしたい(joykoさんの書いて下さったコードでは一定のブラー)

★ドラッグしている時、動きが止まったらもはや動いていないのでブラーはかけない(joykoさんの書いて下さったコードでは、ドロップした時にブラーがとれるのですが、ドロップしなくても動いていないときはブラーをかけないようにしたい)

・ドラッグする時、マウス位置にmcの中心点を合わせず、そのままつかんだところを持って移動。

と、こんな感じにしたいのです。
特に★の処理がどうにも思いつかないのです。
joyko
Åê¹ÆNo.41013
投稿日時: 2008-12-14 1:18
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
Re: ドラッグ中にブラーをかけたい
似て非なるものですが、動きの速さではなく、初期設定の中心から遠くドラッグすると、中心からの距離に応じて、強くBlurが効くようには、しました。ドラッグして、リリースする前に、停止した場合でも、[filter]を効かせなくするscriptをどう記載するかは、まだ、私も、分かってません。
AS3.0の識者から、回答があるといいですね。

//ここから
//import flash.events.Event;//これも含めて、以下の2つも無くてもいいです
//import flash.events.MouseEvent;
//import flash.filters.BlurFilter;

//初期設定領域
var theX:Number=mc.x=stage.stageWidth/2;//最初は中央に配置
var theY:Number=mc.y=stage.stageHeight/2;//同様
var filter:BlurFilter= new BlurFilter();
filter.blurX;//定義だけ、Defaultが4なので、何もしなければ、4.0となる
filter.blurY;
filter.quality=BitmapFilterQuality.HIGH;
var On:Boolean=false;//mcが、mousedownされた時の制御変数で、初期値は、false
var Move:Boolean=false;//マウスが動いたら、trueとなる制御変数→これを、trueやfalseにするタイミングが見つかってません
var xDistance:Number;//中央から、ドラッグされたX軸方向の距離
var yDistance:Number;//中央から、ドラッグされたY軸方向の距離
//以下、mcのドラッグ領域を、Rectangleで指定、今回は、ステージサイズを指定
var bounds:Rectangle=new Rectangle(0,0,mc.stage.stageWidth,mc.stage.stageHeight);//ドラッグ範囲
mc.buttonMode=true;//mcのボタン化

//メソッド定義領域
mc.addEventListener(MouseEvent.MOUSE_DOWN, Press);
mc.addEventListener(MouseEvent.MOUSE_UP, Release);
mc.addEventListener(Event.ENTER_FRAME, EnterFrame);

function Press(event:MouseEvent):void {
On=true;
mc.startDrag(false,bounds);//どこか接触したなら、ステージ内でドラッグ
mc.addEventListener(MouseEvent.MOUSE_MOVE,MouseMove);//updateAfterEvent();の設置用
}

function MouseMove(event:MouseEvent):void {
Move=true;//取り合えず、置いてみただけです。falseにするタイミングが、見つからずです。
event.updateAfterEvent();
}

function Release(event:MouseEvent):void {
On=false;
mc.stopDrag();
mc.removeEventListener(MouseEvent.MOUSE_MOVE,MouseMove);
}

function EnterFrame(event:Event):void {
if (On) {
xDistance=Math.abs(mc.x-theX);//X軸方向の初期値からの、(blurXは、0?255.0の浮動少数点なので、)差分の絶対値
yDistance=Math.abs(mc.y-theY);//Y軸方向の初期値からの、差分の絶対値
//trace(xDistance+" / "+yDistance);
filter.blurX=xDistance/2;//大きくなりすぎるので、1/2としました
filter.blurY=yDistance/2;
mc.filters=[filter];//filterを適用
} else if (On==false || Move==false) {//このMove==falseにするタイミングが、見つかってません。
mc.filters=null;
}
}
//ここまで
nabe_1234
Åê¹ÆNo.41014
投稿日時: 2008-12-14 1:51
新米
居住地:
投稿: 21
使用環境:
Windows Vista Home Premium SP1,Flash CS3
Re: ドラッグ中にブラーをかけたい
こんな感じで「ドラッグ終了の際、ブレ=0をセット」とするイメージ?

//前回の座標を記憶しておく。
var lastX;
var lastY;

var flag = false;

function update (deltaX, deltaY) {
移動量に応じてブラーを掛ける。
}

function Press () {
//ドラッグ開始時の処理。
//初期値を現在の位置とする。
lastX = this.x;
lastX = this.y;
//処理開始。
this.startDrag();
flag = true;
}

function Release () {
//ドラッグ終了時の処理。
//処理終了。
flag = false;
this.stopDrag();
//ブラーの後始末。カーソルを動かし続けた状態でボタンだけ離した場合にブレが残らないようにする。
update(0, 0);
}

function EnterFrame () {
if (!flag) return;
//ドラッグ中の処理。
//現在の位置を拾う。
newX = this.x;
newY = this.y;
//差を適用する。カーソルの動きが小さければブレも小さい。
update(newX - lastX, newY - lastY);
//現在の位置を次回処理用に残しておく。
lastX = newX;
lastY = newY;
}
TJFORD
Åê¹ÆNo.41015
投稿日時: 2008-12-14 13:00
半人前
居住地: Tokyo
投稿: 42
使用環境:
:Flash CS3
Re: ドラッグ中にブラーをかけたい
こんにちは。
私も少しいじってみました。
これが良い方法か自信はありませんが…

var sa:int=0;
var before_p=new Point(mc.x,mc.y);
var after_p=new Point(mc.x,mc.y);
var blur=new BlurFilter();
var sa_x:int=0;
var sa_y:int=0;

var flg:Boolean = false;

mc.addEventListener(MouseEvent.MOUSE_DOWN,startMove);
mc.addEventListener(MouseEvent.MOUSE_UP, stopMove);

function startMove(event:MouseEvent):void {
flg = true;
mc.startDrag();
addEventListener(Event.ENTER_FRAME, EnterFrame);
}

function stopMove(event:MouseEvent):void {
flg = false;
mc.stopDrag();
}

function EnterFrame(event:Event) {
if (flg) {
after_p.x=before_p.x;
after_p.y=before_p.y;
before_p.x=mouseX;
before_p.y=mouseY;
sa_x=Math.abs((after_p.x-before_p.x)/0.5);
sa_y=Math.abs((after_p.y-before_p.y)/0.5);
blur.blurX=sa_x;
blur.blurY=sa_y;
mc.filters=[blur];
} else {
sa_x += (0-sa_x)/2;
sa_y += (0-sa_y)/2;
blur.blurX=sa_x;
blur.blurY=sa_y;
mc.filters=[blur];
if (Math.abs(sa_x) <1) {
blur.blurX=0;
blur.blurY=0;
mc.filters=[blur];
removeEventListener(Event.ENTER_FRAME, EnterFrame);
}
}
}
joyko
Åê¹ÆNo.41016
投稿日時: 2008-12-14 14:34
常連
居住地: 埼玉県
投稿: 167
使用環境:
WinXP(SP3)
Flash8 Basic
FlashCS3
Flash CS4
Re: ドラッグ中にブラーをかけたい
TJFORDさん、
停止すると、リリースする前に、見事に、ブラー効果がなくなりました!
私も勉強になりました。
e271828
Åê¹ÆNo.41017
投稿日時: 2008-12-14 15:12
新米
居住地:
投稿: 11
使用環境:
MacOSX,FlashCS3,Flash8
Re: ドラッグ中にブラーをかけたい
>>TJFORD様

これです!
この動き。。
どうもありがとうございます…!

位置取得にmouseX,mouseYですか、なるほどー
クリックされたらenterFrameで位置取得とブラー処理。マウスダウン、マウスアップにフラグをつけてアップされたらブラーを弱める、差が1以下になったらブラー消す。という感じでしょうか。間違ってたらご指摘願います!


実は、僕自身もしばらく考えていてつい先ほどこれとは別の解決法を見出していました。基本的アイデアはよく似ていて、クリックされたら時間間隔ごとにブラーを掛けるというものです。
こちらにソースコードと解説を用意いたしましたので、興味の有る方はこちらも見てみてください

http://d.hatena.ne.jp/dasign/20081214

面白いですねぇ、プログラミングは面白いとつくづく思います。
どうもお世話になりました。今後ともよろしくお願い致します。



TJFORD
Åê¹ÆNo.41019
投稿日時: 2008-12-14 17:31
半人前
居住地: Tokyo
投稿: 42
使用環境:
:Flash CS3
Re: ドラッグ中にブラーをかけたい
こんにちは。

mouseXとかmouseYはたぶんmc.x、mc.yで問題ないかと思います。

私のスクリプト(e271828さんのスクリプトもそうですが)の問題点はマウスダウン中に画面外に出たときですね。
先ほど私が投稿したスクリプトに下記を追加すると外に出たときに変な動きになるのは避けられるのですが、今度はマウスを早く動かすとmcからマウスが外れるみたいでMOUSE_OUTが発生してしまします。

mc.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);

function mouseOutHandler(e:MouseEvent) {
flg = false;
mc.stopDrag();
}

課題は以下になるでしょうか。
1.マウスをはやく動かしてOK
2.画面外にマウスダウンしたまま出たときもOK


ちなみに私はflashはじめて1年ちょっとのペーペーなのでもっと他の賢者の方のスクリプトも見たいです。

どうぞよろしくお願いします。

e271828
Åê¹ÆNo.41020
投稿日時: 2008-12-14 18:16
新米
居住地:
投稿: 11
使用環境:
MacOSX,FlashCS3,Flash8
Re: ドラッグ中にブラーをかけたい
まだ問題は残っていたのですね、ウカウカしてました。

ポケットリファレンスを読んでいたら、FlashPlayerの領域外に出たとき送出されるイベントがあって、以下のコードを追加すると見事画面外までマウスが出ても変な挙動はしなくなりました!(プレビューでなく、パブリッシュしたswfでないとイベントが出ないようです)

stage.addEventListener(Event.MOUSE_LEAVE,onLeave);
function onLeave(e:Event):void{
//trace("onLeave");
mc.stopDrag();
}

また、僕の方では領域外にでない限りは、早く動かしてもマウスは外れない気がします。僕のできる限りの最高速で動かしてみた限りでは。すみませんが、こちらのswfを差し替えましたので触ってみていただけますか?

http://d.hatena.ne.jp/dasign/20081214
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops