メイン コーダーズルーム【スクリプト系】 ドラッグ中にブラーをかけたい | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |