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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ドラッグアンドドロップについて教えてください
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sinketu
Åê¹ÆNo.12453
投稿日時: 2004-11-19 2:41
半人前
居住地: 東京都
投稿: 34
使用環境:
WinXP ,Flash CS3
ドラッグアンドドロップについて教えてください
お尋ねいたします。

ボックスの中に二つのムービークリップをいれ、
1つ目をドラッグして、はなした後、2つ目をドラッグする
といったものを作りたいのです。

構造としては、boxという親ムービークリップのなかに、piece1というムービークリップと、piece2という子のムービークリップを入れております。

そして、ルートタイムラインに以下のスクリプトを書いてます。

n = 1;
box["piece"+n].onPress = function() {
box["piece"+n].startDrag();
};
this.box["piece"+n].onRelease = function() {
box["piece"+n].stopDrag();
n += 1;
};

結果、1つ目のpiece1はドラッグアンドドロップできるのですが、
2つ目のpiece2をドラッグできません。
1つ目を話した後、再び1つ目ドラッグすると、離れたところで2つ目が動いてしまいます。

どうやったら2つ目をドラッグできるようになりますでしょうか。
よろしくお願いいたします。

空野大二郎
Åê¹ÆNo.12454
投稿日時: 2004-11-19 4:02
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: ドラッグアンドドロップについて教えてください
まいど。

類似した状況がありましたので、こうすればとりあえず動く程度の
サンプルを提示します。

ルートタイムラインに記述。
_global.buttonTarget = 1;  //有効ボタンナンバー、グローバル変数で保持
box.piece1.onPress = function() {  //box.piece1のドラッグ
	this.startDrag();
};
box.piece1.onRelease = function() {
	this.stopDrag();
	_global.buttonTarget += 1;
	_global.setBtn();
};
box.piece2.onPress = function() {  //box.piece2のドラッグ
	this.startDrag();
};
box.piece2.onRelease = function() {
	this.stopDrag();
	_global.buttonTarget += 1;
	_global.setBtn();
};
_global.setBtn = function() {  //有効ボタンの変移 関数
	//ボタンを無効化
	box.piece1.enabled = false;
	box.piece2.enabled = false;
	//条件分岐で有効化
	if (_global.buttonTarget == 1) {
		box.piece1.enabled = true;
	} else if (_global.buttonTarget == 2) {
		box.piece2.enabled = true;
	}
};
_global.setBtn();  //有効ボタンの変移 グローバル関数を実行
this.stop();


引用:
sinketuさんは書きました:

ボックスの中に二つのムービークリップをいれ、
1つ目をドラッグして、はなした後、2つ目をドラッグする
といったものを作りたいのです。


sinketuさんのスクリプトで注目したのは、下記で宣言された
MovieClip.onPressイベントハンドラメソッドが、リフレッシュ
(スクリプトの再読込)されていないために、_root.box.piece1へ
のイベントハンドラメソッドが残り、離れたところにある_root.box.piece2
ムービークリップが不自然にドラッグ可能になったことが
分かりました。
box["piece"+n].onPress = function() {
box["piece"+n].startDrag();
};


そんなふうに思ったのですが、たとえ上記のイベントハンドラメソッドが
リフレッシュされても、_root.box.piece1のイベントハンドラメソッドが
残る事が確認されて、こちらも悩んでおります。
 _rootのタイムラインに配置された変数を元にイベントハンドラ
メソッドの指定先を変更するのには「不安が残る」とするしか
ありませんでした。


----------------
空野 大二郎 アニメーター作家
桜の道

野中文雄
Åê¹ÆNo.12457
投稿日時: 2004-11-19 7:37
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ドラッグアンドドロップについて教えてください
functionには、(1)定義と(2)実行(呼出し)とがあります。1度定義を行えば、いつでも呼出しは可能です。しかし、定義を変更しなければ、実行される処理は変わりません。
引用:
sinketuさんは書きました:
ボックスの中に二つのムービークリップをいれ、
1つ目をドラッグして、はなした後、2つ目をドラッグする
といったものを作りたいのです。

以下のスクリプトは、変数nの値が1の状態で、1度だけ処理されるものと思われます。そのため、イベントハンドラメソッドの定義先(ターゲット)は、(box.piece1のまま)変更されません。

しかし、イベントハンドラメソッドが実行されると、変数値は変わります。したがって、ドラッグのターゲットのみが変更されます。
引用:
そして、ルートタイムラインに以下のスクリプトを書いてます。
n = 1;
box["piece"+n].onPress = function() {
	box["piece"+n].startDrag();
};
this.box["piece"+n].onRelease = function() {
	box["piece"+n].stopDrag();
	n += 1;
};

結果、1つ目のpiece1はドラッグアンドドロップできるのですが、
2つ目のpiece2をドラッグできません。
1つ目を話した後、再び1つ目ドラッグすると、離れたところで2つ目が動いてしまいます。

functionの定義自体を、必要に応じてやり直さなければなりません。
// タイムライン: _root
// 第1フレームアクション( ActionScript 2.0形式)
// _root.piece1、_root.piece2を配置
var n:Number = 1;
xNextDrag();
function xNextDrag():Void {
    box["piece"+n].onPress = function():Void {
        this.startDrag();
    };
    this.box["piece"+n].onRelease = function():Void {
        this.stopDrag();
        ++n;
        xClearDrag(this);
        xNextDrag();
    };
}
function xClearDrag(_mc:MovieClip):Void {
    delete _mc.onPress;
    delete _mc.onRelease;
}


----------------
 

空野大二郎
Åê¹ÆNo.12461
投稿日時: 2004-11-19 10:32
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: ドラッグアンドドロップについて教えてください
まいど。

現象の原因は、そんなわけだったのですか。
的確なご説明、ありがとうございます。
説明不足、申し訳ありませんでした。
引用:

野中文雄さんは書きました:
functionには、(1)定義と(2)実行(呼出し)とがあります。1度定義を行えば、いつでも呼出しは可能です。しかし、定義を変更しなければ、実行される処理は変わりません。


また一つ、勉強になりました。


----------------
空野 大二郎 アニメーター作家
桜の道

sinketu
Åê¹ÆNo.12505
投稿日時: 2004-11-20 7:23
半人前
居住地: 東京都
投稿: 34
使用環境:
WinXP ,Flash CS3
Re: ドラッグアンドドロップについて教えてください
野中さん、空野さん、ありがとうございました。
おかげさまで動かすことが出来ました。
再定義が必要なんですね。
永井勝則
Åê¹ÆNo.12517
投稿日時: 2004-11-20 19:42
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: ドラッグアンドドロップについて教えてください
永井勝則(=勝手に人様のスクリプトを作りかえて修行中)です。
異なる方法(MX風クラス定義手法)で、同じようなものを作ってみました。
boxMC(親MC)の中にドラッグするMC(子MC)が複数ある構造です。
boxMCもドラッグするMCもインスタンス名は不要、ドラッグするMCは何個でも
追加でき(るはずでござい)ます。boxMCのリンケージで"DragSymbol"を入れます。子MCが重なった時のスワップ処理も入っています。

//boxMCのフレーム1
#initclip
function DragClass() {
	this.mcList = [];
}
Object.registerClass("DragSymbol", DragClass);
DragClass.prototype = new MovieClip();
//dragMC関数 ドラッグした子MCからそのthisと1か0が送られてくる
DragClass.prototype.dragMe = function(obj, is) {
	if (is) {
		obj.startDrag();
	} else {
		obj.stopDrag();
	}
};
//mcListにMCを入れる
DragClass.prototype.register = function(mc) {
	this.mcList.push(mc);
};
//重なりのチェック ドラッグした子MCからそのthisが送られてくる
DragClass.prototype.checkSwap = function(mc) {
	var myMC = mc;
	var mcCnt = this.mcList.length;
	for (var i = 0; i<mcCnt; i++) {
		if (myMC != this.mcList[i]) {
			var otherMC = this.mcList[i];
			var myMCDepth = myMC.getDepth();
			var otherMCDepth = otherMC.getDepth();
			if (myMCDepth<otherMCDepth) {
				myMC.swapDepths(otherMC);
			}
		}
	}
};
#endinitclip
----------
/子MCのフレーム1
//最初に自分を親のMCListに登録
_parent.register(this);
//ドラッグ時の動作
this.onPress = function() {
	_parent.dragMe(this, 1);
	_parent.checkSwap(this);
};
this.onRelease = function() {
	_parent.dragMe(this, 0);
	_parent.checkSwap(this);
};
this.onDragOver = function() {
	_parent.checkSwap(this);
};
this.onDragOut = function() {
	_parent.checkSwap(this);
};


----------------
永井勝則:
himco.jp :

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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