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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     再びドラッグする
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kanakana
Åê¹ÆNo.38653
投稿日時: 2008-5-2 1:46
半人前
居住地: 宝塚
投稿: 51
使用環境:
(SP2)
pro7.2
:Flash8 pro
再びドラッグする
ステージにドラッグできるインスタンス名mc1を配置し
ボタンを押すと指定の場所に移動するようにフレームアクションを以下のように書きました。

mc1.onEnterFrame = function() {
	mc1._x = (mc1._x+mc1.position)/2;
};
btn.onRelease = function() {
	mc1.position = 100;
}; 


指定の場所(_x=100)に戻ったmc1をもう一度ドラッグして移動させたいのですが、ドラッグ中に_x100の位置に戻ってしまいます。

ボタンを押すたびに指定の位置に移動したmc1をドラッグして移動させるにはどうしたらいいでしょうか。

お手数ですが教えていただけると幸いです。


ひろゆき
Åê¹ÆNo.38654
投稿日時: 2008-5-2 2:05
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: 再びドラッグする
mc1.onEnterFrame = function():Void {
	this._x += (this.position - this._x)/2;
	if (Math.abs(this.position - this._x) < 0.5) {
		delete this.onEnterFrame;
	}
};
btn.onRelease = function():Void {
	mc1.position = 100;
};
などのように、onEnterFrameでの移動を止める必要があるように思います。

目的地に近づく (1)

移動を何度も行いたいのであれば、
function moveTarget(pos:Number):Void {
	var targetPos:Number = pos;
	mc1.onEnterFrame = function():Void {
		this._x += (targetPos - this._x)/2;
		if (Math.abs(targetPos - this._x) < 0.5) {
			delete this.onEnterFrame;
		}
	};
}
btn.onRelease = function():Void {
	moveTarget(100);
};
のようにする必要があると思いますが。


----------------
質問する際は、回答者に具体的な情報を与えてください。

永井勝則
Åê¹ÆNo.38660
投稿日時: 2008-5-2 17:04
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 再びドラッグする
論理的(コンピュータが得意とする方法)にいうと、"mc1"には
1)ドラッグできる状態
2)ドラッグできない状態
3)移動中の状態
という3つの状態が考えられ、
質問の場合では2)と3)はほぼ同じ状態かもしれませんが、
1)と2)は相反する状態、つまり同時には存在し得ない状態です。
これは、コードの記述とはまた別の、設計に関係してくる基本的な考え方です。

この考えを踏まえつつ、その状態を設定する方法を関数に置き換えてコードを記述すると、たとえば次のようなコードになります。
(一部、ひろゆきさんのコードを拝借しています)


//メインのタイムライン。ドラッグして移動させるtestMC、ボタンのbtnを配置
var testMC:MovieClip;
var btn:MovieClip;
//
testMC.status = "";

//mcをドラッグ可能状態に設定する関数
function dragMC(mc:MovieClip):Void {
	mc.status = "ドラッグできる";
	trace(mc.status);
	mc.onPress = function() {
		mc.startDrag(false);

	};
	mc.onRelease = function() {
		mc.stopDrag();
	};
}
//mcをドラッグできない状態に設定する関数
function dragDisableMC(mc:MovieClip):Void {
	mc.status = "ドラッグできない";
	trace(mc.status);
	mc.onPress = null;
	mc.onRelease = null;
}

//mcを指定した位置に移動させる関数
function moveMC(mc:MovieClip, pointX):Void {
	dragDisableMC(mc);
	mc.status = "移動中";
	trace(mc.status);
	mc.onEnterFrame = function() {
		mc._x += (pointX-mc._x)/2;
		if (Math.abs(pointX-mc._x)<0.5) {
			delete mc.onEnterFrame;
			dragMC(mc);
		}
	};
}
//btn用イベントハンドラメソッド
btn.onRelease = function() {
	moveMC(testMC,100);
};

dragMC(testMC);


とはいえいきなりこのコードにたどりつくわけではなく、
まずは、前述した”状態を分ける”方法を考えるところが入口になると、思います。


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

永井勝則
Åê¹ÆNo.38662
投稿日時: 2008-5-2 22:13
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 再びドラッグする
<追加>
"状態"を管理する場所として、ムービークリップのフレームを利用する方法があります。
前述の方法は、メインのタイムラインにいっさいのコードを記述しているため、状態の変化が直感的に分かりづらいと思うので、
以下にムービークリップのフレームを使ったコードを書きます。
testMCとbtnは前と同様、コードで行っている主な内容も変わりません。
ただtestMCに移動先のフレームラベルをつけて、その移動先フレームで、状態の設定を行っているだけです。

//メインのタイムライン

var testMC:MovieClip;
var btn:MovieClip;
testMC.status = "";

// mcの状態変数を設定して、各状態に応じた命令をmcに送る関数
function setMCStatus(mc:MovieClip, status:String):Void {
	switch (status) {
		case "draggable" :
			// ドラッグ可能状態
			mc.status = "draggable";
			mc.gotoAndStop("draggable");
			break;
		case "dragdisable" :
			// ドラッグ不可状態
			mc.status = "dragdisable";
			mc.moving(100);
			break;
		default :
			trace("例外");
		}
}

btn.onRelease = function() {
	setMCStatus(testMC,"dragdisable");
};

setMCStatus(testMC,"draggable");



//testMC1フレームめ
stop();
//testNCのタイムライン上で通用する変数の定義
var pointX:Number = 0;

//メインのタイムラインからtestMCを”ドラッグ不可”状態にする関数の定義
function moving(pX:Number):Void {
	pointX = pX;
	this.gotoAndPlay("dragdisable");
}


//testMCの"draggable"フレーム
//testMCをドラッグ可能にする
this.onPress = function() {
	this.startDrag(false);

};
this.onRelease = function() {
	this.stopDrag();
};


//testMCの"dragdisable"フレーム
//testMCをドラッグ機能を削除して、次のフレームに進む
this.onPress = null;
this.onRelease = null;


//testMCの"dragdisable"フレームの次のフレーム
//testMCをpointXで指定された場所分、移動
// 移動を終えたと判断したら、自分のonEnterFrameハンドラを削除して、
// 自発的に”draggable”状態へ移動
stop();

this.onEnterFrame = function() {
	this._x += (pointX-this._x)/2;
	if (Math.abs(pointX-this._x)<0.5) {
		delete this.onEnterFrame;
		this.status="draggable"
		this.gotoAndStop("draggable")
	}
};



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

kanakana
Åê¹ÆNo.38663
投稿日時: 2008-5-2 23:19
半人前
居住地: 宝塚
投稿: 51
使用環境:
(SP2)
pro7.2
:Flash8 pro
Re: 再びドラッグする
ひろゆき様
ありがとうございました。

考えていた動きになりました。

二つ目の
function moveTarget(pos:Number):Void {
    var targetPos:Number = pos;


これはボタンでの動きをはじめに設定しておくことだったのですね。
この設定の仕方の発想が出来ませんでした。
勉強になりました。



kanakana
Åê¹ÆNo.38664
投稿日時: 2008-5-2 23:26
半人前
居住地: 宝塚
投稿: 51
使用環境:
(SP2)
pro7.2
:Flash8 pro
Re: 再びドラッグする
永井様
ありがとうございました。

「設計に関する基本的な考え方」
とてもよくわかりました。

それを自分で構築していく力がまだまだです。
コードを一つ一つ見て勉強していきます。

私の力では「メインのタイムライン」にコードを書いている方が理解がしやすい(把握しやすい)のですが、MCのタイムラインに書く方が直感的にわかりやすいのですね。
そこの理解からしなければなりません。

永井勝則
Åê¹ÆNo.38665
投稿日時: 2008-5-3 0:21
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 再びドラッグする
理解しやすい方でまったく問題ないです。
ここで”論理”などど偉そうにいっていることは、何のことはないただの”場合分け”のことです。
つまり、
if(aが1なら){
//aが1のことを行う
} else if(aが2なら) {
// aが2のことを行う
} else if(aが3なら) {
// aが3のことを行う
}
という”場合分け”をまず思いつく必要があります。
"場合分け"は、コンピュータの身になって考えます。
コンピュータは難しいことは分からず、大体が、aとbの2つを比べることくらいしかできません。

で次に、その各場合ごとに、何をどうすれば自分の思っていることが実現できるかを考えます。
これはテクニックです。なので同じような結果を生み出せる方法はいくつもあります。

質問された内容は、このように2段階で分けて考え、思いつく必要があるのです。

”場合分け”をうまく思いつくことができたら、後の各場合で行うことはどうやったら実現できるかを考えます。

この場合でいうと、
・ドラッグを可能にすること
・ドラッグを不可能にすること
は等価で並列的です。
なので、逆に入れ替えることもできます。
移動中のドラッグは可能にも不可にもできます。

ただしそれも適切な場合分けがあって初めて、どちらにするかを選べるようになります。


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

野中文雄
Åê¹ÆNo.38666
投稿日時: 2008-5-3 0:51
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 再びドラッグする
スクリプトをどこに書くかは、設計やプロジェクトの内容によって変わってきます。

参考:「ActionScriptどこに書く? ? MXスタイルからAS2.0まで
引用:
kanakanaさんは書きました:
私の力では「メインのタイムライン」にコードを書いている方が理解がしやすい(把握しやすい)のですが、MCのタイムラインに書く方が直感的にわかりやすいのですね。


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

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

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