問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:30 / 状態:解決済み / No:33 / ATOM
1 名前:似顔絵島の村長 PR: 夢の弾き語りマシン 出来ないとされていたアルペジオの弾き語りも速度指定でできるようになりました 日付:2010/07/05(月)13:14:16 ID:4mD3BLRr/3Ch
管理人様へ 数多くある解説ページの中でも初心者にとても親切でこのような
ページを開設いただき感謝いたします。
当方の使っているのはSUZUKAですが、フラッシュ同様ほぼやりたいことは
できました。
今取り組んでいるのは、初心者用弾き語りマシンとその専用楽譜ソフトです。
フリーで公開しています。
楽譜ソフトですが、簡単にはActionScriptはテキスト「保存・読み込み」という
ことが出来ないので、しょうがなく手動コピペでやり取りしようかと考えています
が、ユーザーになるべく負担をかけないためにも
●あるフィールドにクリップボードのTEXTをペーストすること
●フィールドの内容をクリップボードに転送すること
を質問させていただきます。

そのほかできた楽譜データ(スプライトの座標や状態を記録・読み込み)するのに
XMLがいい様でしたら、わかり易く解説しているURLなどおしえていただいたら
幸いです
2 名前:似顔絵島の村長 日付:2010/07/05(月)13:28:14 ID:4mD3BLRr/3Ch
質問の2つ目は 管理人様のサイトで解決しました
>●フィールドの内容をクリップボードに転送すること
これはそっくりそのままでした 見落とし失礼いたしました
3 日付:2010/07/05(月)23:31:21 ID:yDl4tzgDJCHR
SUZUKAという事は、AS2.0相当 でしょうか。

AS2.0では、クリップボードからデータの取得は
セキュリティの都合上できません。

余談ですが、ActionScript3.0 でしたら、
Flash 10以降、 Clipboard クラスを使用してアクセスできます。
ただし、ペーストイベント内でのみ動作します。
4 日付:2010/07/05(月)23:48:49 ID:yDl4tzgDJCHR
XML へのアクセスは、
木構造になった XMLNode オブジェクト内をめぐる必要があり少々めんどうです。

XML オブジェクトから Object 型に変換できれば、手軽にアクセスできると思います。
XML オブジェクトから Object に変換する例です。

var str = "<XML>"+
"<DATA1>データ1</DATA1>"+
"<DATA2>データ2</DATA2>"+
"<DATA3>"+
"<CHILD1>123</CHILD1>"+
"<CHILD2>456</CHILD2>"+
"<CHILD3>789</CHILD3>"+
"</DATA3>"+
"</XML>";

var xml = new XML(str);
var obj = XmlToObject(xml);

trace(obj.XML.DATA1);
trace(obj.XML.DATA3.CHILD2);


// ------------------------------------------
function XmlToObject(xml){
return _XmlToObject(xml).value;
}

function _XmlToObject(node){
var i;
var obj = new Object()
var child = node.childNodes;
var l = child.length;
for(i=0;i < l;i++){
var cld = child[i];
if(cld.nodeType == 1){
var c = _XmlToObject(cld);
obj[c.name] = c.value;
}else if(cld.nodeType == 3){
return {name : node.nodeName,value: cld.nodeValue};
}
}
return {name : node.nodeName,value: obj};
}
5 名前:似顔絵島の村長 PR: ハーモニープレーヤ専用譜面作成ソフト 只今 制作中ですが・・・とても斬新なUI 日付:2010/07/07(水)05:10:35 ID:4mD3BLRr/3Ch
まず、クリップボードの件 残念ですが お金をためてFlashの購入も検討します

2番目丁寧で、わかりやすいコーディング有難うございます。
コメントがないのにとても理解しやすいソースに感激です。
そこで おおむねの流れはつかみつつあるのですが
if(cld.nodeType == 1){ のTypeが1や3というのが何を指すのか
教えていただけませんでしょうか?
また、ツリー構造を操作・分解するのは可能性が見えましたが
コレは保存したり読み込んだり出来るのでしょうか?

それと普通のテキストファイルも、loadVariables を使い、
管理人様の解説の中で出来ましたが
そこに
「テキストファイルをそのまま読み込みたい場合は、onData イベントを
使用します。ただしこのイベントを使用すると onLoad イベントが
使用できなくなるので注意して下さい。」とありました。
これはどういうことなのでしょうか?

課題は山済みですが、譜面エディタずいぶんよくなって来ました。
印刷もいい感じになり、保存・読み込み以外ほぼ大筋は完成してきました
コレで 自由なところに文字を置けるワープロのようなものも出来そうな
可能性も見えてきました ご関心あれば見てみてください。
(コードのGIFがなぜか出ませんが・・・・)

みなさんのように高度なことが早くできるようになりたいと願うこのごろです

6 名前:似顔絵島の村長 PR: 楽器の出来ないひとが楽器が出来るツール ちょっとづつファンが増えてきました 日付:2010/07/07(水)10:48:16 ID:4mD3BLRr/3Ch
>if(cld.nodeType == 1){ のTypeが1や3というのが何を指すのか
>教えていただけませんでしょうか?

この件は1は<>で囲まれた部分=エレメントノード
3は実際のデータの部分であるということが なんとなくわかりましたが

まあ なかで ぐりぐり回って大変ということがわかり 
自分ではこんな分解が頭がこんがらがってできないということだけが
明確に解かりましたww
人の書いてくれたのを 見るからなんとなくわかるけど...
そうはいえども、若いときにかじってたから、
こういう初めての言語でも ぼんやりと解かると考えれば
少しは 役立つ人生だったか・・・・

これで 楽器の出来ない人が少しづつですが、毎日感動感謝のコメントを
いただきかけたので 社会貢献になるかな?ww
7 名前:似顔絵島の村長 日付:2010/07/07(水)12:23:30 ID:4mD3BLRr/3Ch
今 管理人様のサイト参考にして XMLの生成と取り出しを研究中です

サンプルから
"<DATA3>"+
"<CHILD1>123</CHILD1>"+
"<CHILD2>456</CHILD2>"+
"<CHILD3>789</CHILD3>"+
"</DATA3>"+

このように子ノードが複数n個が存在するとき 書き込み=生成するときは
いいとしても「読み込む」ときn個あるのかが不確定ですが
このようなとき どうすれば知ることが可能でしょうか?

trace(obj.XML.DATA1);
trace(obj.XML.DATA3.CHILD2);
親は書き込んだときにわかるとしても
子が未確定のn個存在した場合、どうやって知ればいいのでしょうか?
書き込むときにnレコードあることを

var str = "<XML>"+
"<DATA1>データ1</DATA1>"+
"<DATA2>データ2</DATA2>"+
"<NUM>3</NUM>"+
"<DATA3>"+
"<CHILD1>123</CHILD1>"+
"<CHILD2>456</CHILD2>"+
"<CHILD3>789</CHILD3>"+
"</DATA3>"+
"</XML>";
のようにしてLOOP書き込むのはあまりスマートでないような・・・

8 日付:2010/07/07(水)20:27:00 ID:qPr0YUEfJmUW
>>5

>クリップボードの件 残念ですが お金をためてFlashの購入も検討します

試してないので詳しくは不明ですが、ペーストイベント中のみ動作するという事で
 TextField のコンテキストメニューの「ペースト」選択時に取得できると思います。
つまり、普通にペースト作業をやってるのとかわらないのではないでしょうか。



>if(cld.nodeType == 1){ のTypeが1や3というのが何を指すのか
>教えていただけませんでしょうか?

http://www.adobe.com/livedocs/flex/2_jp/langref/flash/xml/XMLNode.html#nodeType
ノードタイプの種類です。

1 であれば、childNodes 配列に XMLNode が子として複数格納されています。
3 であれば、nodeValue にデータが格納されています。



>「テキストファイルをそのまま読み込みたい場合は、onData イベントを
>使用します。ただしこのイベントを使用すると onLoad イベントが
>使用できなくなるので注意して下さい。」とありました。
>これはどういうことなのでしょうか?

onData と onLoad イベントの両方に関数を登録すると
onData のみが動作します。

onLoad イベントの方がエラーチェックが充実してますので
こちらを使用するといいのではないでしょうか。
9 日付:2010/07/07(水)20:47:53 ID:qPr0YUEfJmUW


>このように子ノードが複数n個が存在するとき 書き込み=生成するときは
>いいとしても「読み込む」ときn個あるのかが不確定ですが
>このようなとき どうすれば知ることが可能でしょうか?

Object の中をすべて取得するのであれば
for(in) 文が便利です。

var obj = {
child1:123,
child2:456,
child3:789
};

var count = 0;
for(var p in obj){
trace("プロパティ名:" + p);
trace("データ:" + obj[p]);

count ++;
}

trace("総数:" + count);



>テキスト「保存・読み込み」

共有オブジェクトを使用すると、cookie のようにデータを保存する事ができます。
http://hakuhin.jp/as/save.html

どうしてもテキストファイルとして保存したい場合は、
CGIと連動させてダウンロードを行えばできるみたいです。
10 名前:似顔絵島の村長 日付:2010/07/09(金)11:18:45 ID:4mD3BLRr/3Ch
有難うございます 

いろいろXMLについても考えてみましたが
「書き込む」となると他言語などをしらない僕には難しいようです
VBScriptの知識だけはすこしありますが

この関連最後の質問にさせていただきたく思いますが
VBSや他のEXEをアクションスクリプト1.0から呼ぶことって可能なのでしょうか?

ということで 保存については 当面共有オブジェクト保存でローカルに
保存したく思います

いつもご指導ありがとうございます
11 名前:似顔絵島の村長 日付:2010/07/09(金)13:47:58 ID:4mD3BLRr/3Ch
最後といいながら 保存で疑問が出てきました
管理人さんのページで オブジェクト型で共有ファイルを保存すると
まとめられていいということで とても有効だと思いやってみました
私のやりたいことは、createTextField()、duplicateMovieClip()などで
作った1つにまとめられたスプライトを保存し(仮にインスタンス名 TEST)

共有ファイルから取り出すときに一旦TESTをremoveMovieClip()で消去し
共有ファイルに収められたobj.objを obj.obj.duplicateMovieClip("TEST",10);
とやりたいなと考えました

TESTには多くのオブジェクトがあり それを分けたりして再現することは
再現と書き込みをするときXY座標など気の遠くなる再現をしないといけません

管理人様のを引用させていただき
on(release){
var so = SharedObject.getLocal("my_data");//共有オブジェクト
if(so){
var obj = so.data;
obj.obj =_root[test]; ////////////スプライト全体を保存する

obj.tex= "aaaaaaaaaaaaa";/////////適当な文字を保存;
var ret = so.flush(getBytesTotal(so)+100);
}
}
として書き込みは成功しました

on(release){
var so = SharedObject.getLocal("my_data");//共有オブジェクト
if(so){
var obj = so.data;
trace(obj);      //object Objectが返る
trace("---"+obj.obj);//_level0 になる=何かは書かれている

trace(obj.tex);//正常に読み込めた結果になる=書き出し・読み込みとしては間違ってない
obj.obj.duplicateMovieClip("aaa",10);
_root["aaa"]._y=80;//解かるようにずらす
}
}
上記の結果から
●ちゃんと書き込まれてることは間違いない
●何かが返ってることは間違いない
●obj.obj.duplicateMovieClip("aaa",10); では再現できない
という結果です。基本的にこんなインスタンスごと共有オブジェクトに保存なんて
できないのでしょうか?
12 日付:2010/07/09(金)23:42:24 ID:yDl4tzgDJCHR
>>10
>VBSや他のEXEをアクションスクリプト1.0から呼ぶことって可能なのでしょうか?

exe をブラウザ版 FlashPlayer から実行するのは無理です。
Flash プロジェクタ版は可能です。(サブディレクトリ限定)

VBSはよくわかりませんが何かできるようですね。
13 日付:2010/07/09(金)23:51:21 ID:yDl4tzgDJCHR
>>11
何らかのインスタンスを
保存するのは無理ではないでしょうか。

Boolean、Number、String、Array、Object を駆使する事になります。
14 名前:似顔絵島の村長 日付:2010/07/10(土)04:31:08 ID:4mD3BLRr/3Ch
サウンドの件が解決ついたので もう人がんばり研究してみます
15 名前:似顔絵島の村長 日付:2010/07/11(日)19:50:03 ID:4mD3BLRr/3Ch
管理人様のアドバイスで
xmlの形成はできました
XMLファイルの頭によくある
まじないみたいなものは
つけないとフラッシュは読めない場合があったりしますか?

また管理人様のサンプルでは改行なしにデータが形成されますが
改行をしても問題ないのでしょうか?XMLの知識がなくまったく失礼します
・・・
おかげさまで管理人さんのご協力で最強のコード譜作成ソフトに
なりつつあります。
コードをキャンバスに配置して音を鳴らすにチェックして
 コードをクリックしていくと音のなるところまできました
http://www.stickom.jp/hp/hp_score.swf
16 名前:似顔絵島の村長 日付:2010/07/11(日)19:57:32 ID:4mD3BLRr/3Ch
ココを見られている方のために 既出かも知れませんが
情報を上げておきます

外部 GIFファイルをloadMovieでロードするとき SWF8の環境ですが
ローカルでは問題なく動作するのに
ファイル名に#があったときには、読み込めません
コレはURL表記の約束上なのかも知れませんが・・・
皆様の既知のことかもしれませんが報告しておきます。
winやmacのファイル名約束では問題なかったと思うのですが・・・
17 日付:2010/07/12(月)00:53:01 ID:yDl4tzgDJCHR
>>15
>まじないみたいなものは
>つけないとフラッシュは読めない場合があったりしますか?

<?xml version="1.0" encoding="SHIFT_JIS"?>
こういうのですか?
どうでしょう。特に読み込めなかった事はないですね。


>改行をしても問題ないのでしょうか?

XML クラスの ignoreWhite プロパティを true にしておくと
XMLファイル中の空白と改行が無視されるようになります。

18 名前:似顔絵島の村長 日付:2010/07/12(月)19:41:29 ID:4mD3BLRr/3Ch
理解しました 有難うございます

別スレッドで 正規表記について させていただきます
19 名前:似顔絵島の村長 日付:2010/07/14(水)20:28:48 ID:4mD3BLRr/3Ch
管理人様のアドバイスにより XMLデータ生成がうまくいきました
はじめは何百もの配置オブジェクトと思うと気が遠くなりましたが
LOOPさせると短いものでうまくいきました

子のあるノードを別にしました

songTEMP =New Array;
for(i=0;i<_global.TT;i++){
var T=new textFormat();
T=_root["main"]["song"+i].song_box.song_txt.getTextFormat();
trace(T.color);
//ライン深度は800から
songTEMP[i]={
x:  _root["main"]["song"+i]._x,
y:  _root["main"]["song"+i]._y,

no:   _root["main"]["song"+i].no_OP.text,
song: _root["main"]["song"+i].song_box.song_txt.text,
size: T.size,
col:T.color
};
}
//trace(lineIn);

var writeData={
title:_root.main.title.text,
level:_root.main.level.level_text.text,
song_writer1:_root.main.song_writer1.text,
song_writer2:_root.main.song_writer2.text,
swap:_root.main.swap.text,
key_change:_root.main.key_chenge.text,
songDATA:_root.song.song_data.song_txt.text,
line:lineTEMP,
code:codeTEMP,
song:songTEMP

};

本当に感謝です
20 名前:似顔絵島の村長 日付:2010/07/14(水)20:35:21 ID:4mD3BLRr/3Ch
そして、最終課題の保存ですが
ぷラットフォームをFLASHではなく
ファイルメーカーデータベースにしました。
ファイルメーカーのインラインWebみたいな中にSWFを表示し
XMLデータ生成からクリップボードに収めるまでをFLASHでやらせ

それをファイルメーカー側でペーストさせデータベースに収めます

戻すときはそのデータを今度は手動でフラッシュフィールドににペーストさせ
そのXY座標やグラフィックファイル名でデータを再現させる手法で準備
しております
21 名前:似顔絵島の村長 日付:2010/07/14(水)22:01:06 ID:4mD3BLRr/3Ch
先ほど申し上げたように オブジェクトよりXMLテキストは取り出せました
それを今度は逆にして 管理人様の参考どおり

var xml_obj2 = new XML();
xml_obj2.ignoreWhite = true;
xml_obj2=_root.xml_obj.text;//これがテキストが入ったスプライト
//テキストフィールドです
trace(_root.xml_obj.text);  //これでちゃんとXMLのテキストは表示されます

var obj = _root.XmlToObject(xml_obj2);//管理人様の関数
trace(obj);

var count = 0;
for(var p in obj){
trace("プロパティ名:" + p);
trace("データ:" + obj[p]);

count ++;
}
trace("総数:" + count);

とするのにトレースの結果は
[object Object]
総数:0
となります。

どこがおかしいのか解かりません
ファイルにしないと出来ないのでしょうか?
テキストフィールドからでは無理だというなら、理屈がわかりません
よろしく願います
22 名前:似顔絵島の村長 日付:2010/07/14(水)22:18:23 ID:4mD3BLRr/3Ch
私のXMLに関する 基本が間違っているようですね
このデータをファイルとして保存して
読み込んで管理人様のページを参考に

var xml_obj = new XML();
xml_obj.ignoreWhite = true;
xml_obj.load("test.xml");

xml_obj.onLoad = function(check){
trace(xml_obj.toString());
};

toStoringにすると出てきます
元がテキストなのにテキストにする理由がわかりません
わたしのやっていることが間違っているのかもしれませんが
どうしてもテキストフィールドのXML風にタグがあるものを
オブジェクト型に分割することは難しいのでしょうか?
23 日付:2010/07/14(水)22:41:22 ID:yDl4tzgDJCHR
XMLの文字列があるのでしたら
parseXML() メソッドを使用すると解析されます。

var str = "<XML>"+
"<DATA1>データ1</DATA1>\n\n\n"+
"<DATA2>データ2</DATA2>   "+
"<DATA3>"+
"<CHILD1>123</CHILD1>\t\t\t"+
"     <CHILD2>456</CHILD2>"+
"\t\t\t<CHILD3>789</CHILD3>"+
"</DATA3>"+
"</XML>";

var xml_obj2 = new XML();
xml_obj2.ignoreWhite = true;
xml_obj2.parseXML(str);

trace(xml_obj2);
24 名前:似顔絵島の村長 日付:2010/07/15(木)04:37:09 ID:4mD3BLRr/3Ch
上記の件 parseXML で解析できました 有難うございます

しかし、更なる問題がでました

for(var p in obj2){
trace("プロパティ名:" + p);
trace("データ:" + obj2[p]);

count ++;
}
trace("総数:" + count);

結果
プロパティ名:line
データ:[object Object]
プロパティ名:code
データ:[object Object]
プロパティ名:test
データ:文字列1
プロパティ名:test2
データ:文字列2

と1次ノードはデータが表示されますが 以下がオブジェクトのまま返ります

そこで

for(var p in obj2.line){
trace("プロパティ名:" + p);
trace("データ:" + obj2.line[p]);
count ++;
}
trace("総数:" + count);

とするのですが中身は出ません。

でも確かめるために
trace(obj2.line[0].x);
とすると
452
などとちゃんとしたデータが入っています

じぶんなりに調べましたが for(in)文はオブジェクト配列の名前と内容を
取り出せるとなっているので、いけそうに思うのですが
子や孫の取り出し方は違うのでしょうか?


25 名前:似顔絵島の村長 日付:2010/07/15(木)04:57:12 ID:4mD3BLRr/3Ch
自己解決しましたが 納得があまりいきません
for(var p in obj2.line){
trace("プロパティ名:" + p);
trace("データ:" + obj2.line[p]);
count ++;
}
trace("総数:" + count);

これがだめだったのに

obj3=New array();
obj3=obj2.line;
と新しい箱に入れなおしてあげると
for( var p in obj3) が働きます
なのに
for( var p in obj2.line) 
が動かない これまた不思議なことですが 言語仕様ということなのでしょうか?

なにはともあれ 報告しておきます
26 日付:2010/07/15(木)21:15:06 ID:yDl4tzgDJCHR
>>24
>子や孫の取り出し方は違うのでしょうか?

子や孫を取り出すには、さらに for(in) で調べる必要があります。
配列型やオブジェクト型であるか調べたい場合は typeof(値) 関数で調べることができます。



>trace(obj2.line[0].x);

 obj2.line は配列ですよね。
この配列の中にさらにオブジェクトが入っている状態ですので…


>for(var p in obj2.line){
>}

ここで取得できるのは、配列に格納されたオブジェクトです。
27 日付:2010/07/15(木)21:24:35 ID:yDl4tzgDJCHR
>>25
>for(var p in obj2.line){}



>obj3 = obj2.line;
>for(var p in obj3){}

は同じ動作になると思いますが obj3 の方のソースが気になりますね
28 日付:2010/07/15(木)21:32:33 ID:yDl4tzgDJCHR
配列とオブジェクトが混在するデータを再帰的に
調べるとこんな感じになります。

var test_obj = {
aaa:[
  {x:0, y:1}, 
  {x:3, y:4}
],
bbb:"テスト",
ccc:[
"a",
"b",
"c",
"d",

eee:[0,1,2,3,4,5],
fff:{
ggg:"あいう"
}
}
]
};


ObjectGetProperty(test_obj, "");

// --------------------------------

function ObjectGetProperty(obj, parent_path) {
for (var p in obj) {
// パス名
var path = parent_path+"."+p;
// データ
var data = obj[p];
// 型
var type = typeof (data);

trace("---");
trace("パス : "+path);
trace("プロパティ名 : "+p);
trace("データ : "+data);
trace("型 : "+type);

// データがオブジェクト型であれば再帰検索
if (type == "object") {
ObjectGetProperty(data, path);
}
}
}
29 名前:似顔絵島の村長 日付:2010/07/16(金)19:45:46 ID:4mD3BLRr/3Ch
これまた むずかしいですね
とりあえず
New Object()に格納して出来ました
とても長くレスを付き合っていただき有難うございました

このXML関連はなんとか解決ということで
またひとつ課題ができました。
それは2つ以上のムービークリップインスタンスのグループ化です
別スレにします
30 名前:状態変更 日付:2010/07/16(金)19:46:07 ID:4mD3BLRr/3Ch
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 :
解決済み
投稿開始日 :
2010/07/05(月)13:14:16
投稿終了日 :
2010/07/16(金)19:46:07
投稿者 :
似顔絵島の村長
レス総数 :
30
スレッド番号 :
33
MondoCollectionSystem ver.0x00020000 by Hakuhin