問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
1 名前:似顔絵島の村長 日付:2010/07/16(金)20:06:24 ID:4mD3BLRr/3Ch
いつもお世話になります
duplicateMovieClip等で作ったオブジェクト(インスタンスがあります)

この中には
on(press)等のプログラムもあるので
自分がクリックされたことはわかり

たとえば配列に自分の名前 this._name等を埋めることは可能な状態です
やりたいことの骨子は「ドラッグで2つのクリップを同時に動かしたい」
のであります
グループ化とまでは、いかないほうがいいのです

素人考えでは選択されたインスタンスを 新しいインスタンスにコピーし
ドラッグがおわったら(release)、もとのところに戻すという発想ですが

やりたいクリップの子インスタンスにはloadMovie()で外部GIFを読み込んで
あるのでduplicateMovieClipなどがききません

管理人さんならどういう手法で2つのクリップを同時にうごかしますか?
本来ならドローツールのように引っかかったら同時選択みたいなのが
理想ですが、そんな難しいことは私には無理と思いますので
クリックしていったインスタンス名は解かるとしてでもいいので
何かいいアドバイスをいただけませんか?
2 名前:似顔絵島の村長 日付:2010/07/16(金)20:14:15 ID:4mD3BLRr/3Ch
探していたら こんなのもありましたが 自分ではうまく紐解けません


1.mc1,mc2というムービークリップを配置
2.mc1,mc2の各インスタンスに下記のscriptを記述
基本的にこのソースによって2つのムービークリップが動くようになりました
//-------source start
onClipEvent (mouseDown) {
//down_flag = 1;
dif_x = this._x-_root._xmouse; 
dif_y = this._y-_root._ymouse; 
}

onClipEvent (mouseUp) {
_global.down_flag = 0;
}

onClipEvent (mouseMove) {

if (_global.down_flag == 1) {
this._x = _root._xmouse+dif_x; 
this._y = _root._ymouse+dif_y; 
}
}
3 日付:2010/07/17(土)13:39:55 ID:yDl4tzgDJCHR
ドラッグしたいクリップというのは、
プログラム側で2つと決定してるのですか?

それともユーザーがマウスでクリップを1つ1つ選択すれば
複数可能になったり解除できたりしますか?
4 名前:似顔絵島の村長 日付:2010/07/17(土)14:14:15 ID:4mD3BLRr/3Ch
>それともユーザーがマウスでクリップを1つ1つ選択すれば
>複数可能になったり解除できたりしますか?

そのとおりです ユーザー選択です
5 日付:2010/07/17(土)14:39:06 ID:yDl4tzgDJCHR
単体選択となる条件と
複数選択となる条件と
複数選択を解除する条件は何ですか?
6 日付:2010/07/18(日)15:15:30 ID:4mD3BLRr/3Ch
全て任意のマウスクリックです
そして、Gのキーをおしながら・・・とか押していきます
その解除はそのインスタンス以外の場所でマウスクリックしたときです

よろしく願います
実際のソフトは
http://www.stickom.jp/hp/hp_score.swf
ここにあります

右中央の[OK]ボタンをクリックするとデュプリケートクリップムービーで
複数個左のキャンバスに出てきます
今は1個1個はドラッグが可能です
7 日付:2010/07/18(日)15:39:59 ID:yDl4tzgDJCHR

>どういう手法で2つのクリップを同時にうごかしますか?

グローバルな配列を用意します。
この配列には「現在選択中」のクリップのインスタンスオブジェクトを格納します。


>全て任意のマウスクリックです
>そして、Gのキーをおしながら・・・とか押していきます
>その解除はそのインスタンス以外の場所でマウスクリックしたときです

これらの条件によりクリップを選択した場合は、クリップのインスタンスオブジェクトを配列に格納し
解除した場合は、配列から除外します。

またマウスカーソルの「現在の座標」と「1フレーム前の座標」を常に監視します。
マウスカーソルの「1フレーム前の座標」から「現在の座標」までの差分を調べます。

クリップのドラッグ中は、
配列に格納されたクリップすべてに対して、「マウスカーソルの差分値」をクリップの「座標」に加算すれば
同時に動くように見えるかと思います。
8 名前:似顔絵島の村長 日付:2010/07/18(日)19:57:14 ID:4mD3BLRr/3Ch
上記の「意味」は解かりました 私も配列にでも入れるのかなぁと
漠然と思っていましたしかし・・・・・
どこに記述するのか? からしてがまったく持ってわかりません
一応自分なりに管理人さんに頼ってばかりでは・・・と思い書きました
クリックされるスプライトの中に書くと それどれにこのプログラムがあることになります
on(press){
var MC= New Object();  //自分自身のオブジェクト
MC=_root["main"][this._name];

if(_global.keyG){//Gが押されていたら
_global.X2=_global.X1;
_global.Y2=_global.Y1;
if(_global.G == -1){   //初めてかの判断
_global.GP= New Array();
_global.GP[0]=MC;
_global.G = 1; //ポインタ配列用
}else{
_global.GP[_global.G]=MC;
_global.G++     //一つ増やす
}

if(_global.X1 !=_global.X2 || _global.Y1 != _global.Y2){
_global.XXXXX=X1-X2;
_global.YYYYY=Y1-Y2;
for(ii=0;ii<_global.GP.length;ii++){
_global.GP[ii]._X=_global.GP[ii]._X+_global.XXXXX;
_global.GP[ii]._Y=_global.GP[ii]._Y+_global.YYYYY;
}
}

this.startDrag(false, 10,10,560,790);

}
}
on (release, releaseOutside) {

this.stopDrag();
_global.keyG=false;
_global.G = -1;
}
onClipEvent(enterFrame){
if (Key.isDown(71)){
_global.X1=this._xmouse;//座標を取得
_global.Y1=this._ymouse;
_global.keyG=true;//グループ選択モード
_root.status_.text="グループ中";
}
}
ぜんぜん意味を成さないようなプログラムです「意味をなさない」ことはわかるんですが、どうも難しいです
書く場所すらわからないと・・・情けないはなしですが・・・
9 名前:似顔絵島の村長 日付:2010/07/19(月)09:55:50 ID:4mD3BLRr/3Ch
ちょっと解かりかけてきました がんばります
10 日付:2010/07/19(月)10:31:45 ID:yDl4tzgDJCHR
配列とオブジェクトの使い方で気になる点があります。

-------------------------------------------------------------
var MC= New Object();  //自分自身のオブジェクト
MC=_root["main"][this._name];

この場合、
1行目で Object クラスをインスタンス化して変数 MC に格納しています。
2行目でムービークリップのインスタンスオブジェクトを変数 MC に格納しています。
変数 MC を書き換えてるため、1行目で作成したオブジェクトへのアクセスができなくなり
1行目の処理に意味がありません。


-------------------------------------------------------------
obj3=new Array();
obj3=obj2.line;

この場合、
1行目で Array クラスをインスタンス化して変数 obj3 に格納しています。
2行目で obj2.line に格納された Array のインスタンスオブジェクトの参照を変数 MC に格納しています。
変数 obj3 を書き換えてるため、1行目で作成した Array オブジェクトへのアクセスができなくなり
1行目の処理に意味がありません。
11 日付:2010/07/19(月)10:44:26 ID:yDl4tzgDJCHR
選択されたムービークリップオブジェクトの「登録」と「登録外し」は、
タイムラインに書いてみてはどうでしょうか。単体のシステムとして作り
関数を供給すれば簡潔になります。


// 初期化
_global.GP = new Array();

// 登録をすべてクリア
function ClipSelectClear(){
}

// クリップの登録
function ClipSelectAdd(mc){
}

// クリップの登録外し
function ClipSelectRemove(mc){
}

// クリップ全体を移動
function ClipSelectMove(x,y){
}
12 名前:似顔絵島の村長 日付:2010/07/19(月)15:31:59 ID:4mD3BLRr/3Ch
上記のように書くとすっきりしますね

基本できました
●配列にオブジェクトを収めること
●それをループし移動距離分を動かせるとこまでは・・・・
ただし、マウスクリックしたときにはじめのXYを記憶し、離した時に
移動させるという「途中が見えない状態」すなわちONCLIPEVENTやonEnterFrame
を使わないときです。
そこで・・・・・
はじめにクリップをon(press)したときに_global.X1 と Y1は取得したとして

onClipEvent(enterFrame){

if (_global.mo){//グループモードのとき

_global.X2 = _root._xmouse;  // マウスのx座標を取得
_global.Y2 = _root._ymouse;  // 
if(_global.X1 != _global.X2 || _global.Y1 != _global.Y2){//動きがあったら
XM=X2-X1;
YM=Y2-Y1;//移動距離
for(i=0;i<_global.G;i++){
if(_parent._name != _global.GP[i]._name){
_global.GP[i]._x=_global.GP[i]._x+XM;
_global.GP[i]._y=_global.GP[i]._y+YM;
}

}
_global.X1=_root._xmouse;//また最初の位置とする
_global.Y1=_root._ymouse;
}

updateAfterEvent();  // 強制的に再描画

}
}
このようにしましたが 一瞬だけ全体が動こうとしますがドラッグ中
描画しませんどうしてでしょうか
ドラッグ中はentarFrameが効かないのかトレースしましたが動いています
よろしくアドバイスください
13 名前:似顔絵島の村長 日付:2010/07/19(月)20:55:01 ID:4mD3BLRr/3Ch
管理人様 有難うございます
出来ました

僕はonClipEvent()
の意味が理解できてませんでした
動いてるというか監視されているムービー
(僕の場合独自に止めているクリップは無いので全て)
はどこからでもアクセスというか出来るので
ひとつ書けばいいのですね

Gのキーを押しながら配列にクリップオブジェクトを押してゆき
_root._xmouse root_.ymouse
の動きの差分を全ての配列のクリップを移動させるとできました
それとはじめはthis.startDrag(false, 10,10,560,790);
でドラッグをスタートさせてましたが
if(_parent._name != _global.GP[i]._name){
_global.GP[i]._x=_global.GP[i]._x+XM;
_global.GP[i]._y=_global.GP[i]._y+YM;
}
ドラックを書かなければ
上記のように自分かどうかの判断をする必要も無くなり
うまくいきました
有難うございます 20時間以上かかりましたwww
14 名前:状態変更 日付:2010/07/19(月)20:55:19 ID:4mD3BLRr/3Ch
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2010/07/16(金)20:06:24
投稿終了日 :
2010/07/19(月)20:55:19
投稿者 :
似顔絵島の村長
レス総数 :
14
スレッド番号 :
37
MondoCollectionSystem ver.0x00020000 by Hakuhin