[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
actionscriptを使ってFlashにXMLデータの読み込みを行ってみる。
用意するもの
Flash(xmlload.swf)
XML形式ファイル(test.xml)
jpgファイル(今回は画像表示を行ってみるので)名前はtest.jpg
【FLASH】xmlload.swf
まずムービークリップを作成(中身は何でもいい。適当に四角形でも書いてムービークリップ化するだけ)
それをステージに配置。インスタンス名をholder
ダイナミックテキストをステージに配置。インスタンス名をtitleText
以下のアクションスクリプトを記述
var xml:XML;
xmlLoad();
function xmlLoad():Void{
xml = new XML();
xml.onLoad = dataset;
xml.ignoreWhite = true; //空白を無視
xml.load("test.xml"); //text.xmlを読み込む
}
function dataset():Void{
var att:Array = this.firstChild.childNodes[0].attributes; //今回は1件しか表示しない為。0番目のデータ(先頭データ)のみ使用します。
holder.loadMovie(att.image); //xmlファイルのimageという項目のデータを抽出
titleText.text = att.title; //xmlファイルのtitleという項目のデータを抽出
}
【xmlファイル】 test.xml
<?xml version="1.0" encoding="UTF8" ?>
<datalist>
<data image="testxml.jpg" title="タイトル" />
</datalist>
※このXMLファイルの作成を注意して下さい。
私は1番上の
<?xml version="1.0" encoding="UTF8" ?>を
<? xml version="1.0" encoding="UTF8" ?>としていて、
<?の後ろにスペースを入力していた。
たったこれだけでフラッシュファイルを実行するとエラーが出てハマってしまった^^;
こういう凡ミスは避けたいですね~
一応XMLファイルをダブルクリックで開けは記述のエラーがあれば表示してくれたりするんで、
ら一回確かめた方が良いです。
エラーがなければ何も表示されません。
このFLASHは、XMLを読み込んでimage,titleという項目を抽出し
そこに入っている値をダイナミックテキストや、ムービークリップのloadMovie()に渡して、
画像を読み込んでいます。
actionscriptからテキストの書き換えが出来ないのでPHPと連携してアクセスカウンターを作成するテスト。
無理にflashでアクセスカウンタ作る必要もないけど、PHPとactionscriptの連携の経験にはなる。
コーディングのレベルとしては初歩的で勉強しやすいから自分的にもわかりやすかった。
PHPと連携出来るとまたいろいろ幅が広がるな~と思う。
PHPとMYSQLは連携させるコンテンツを作成した事もいくつかあるので、
データベースと連携したFlashコンテンツというのも出来るね!
用意するもの
・カウンタ用FLASHファイル(count.swf)
・カウンタ用PHPファイル(count.php)
・カウント用データファイル(count.dat)
カウント用データファイルの中身は0とか1とか適当に半角数字を入れておいてください。
また、これらの3つのファイルは同じフォルダの中か同じ階層にした方が理解はしやすいと思います。
【flash側 count.swf】
カウンタを表示する為のダイナミックテキストを配置。インスタンス名をcounterとしておく。
actionscriptを以下のように記述。
var LvObj:LoadVars = new LoadVars();
var SvObj:LoadVars = new LoadVars();
LvObj.load("count.dat");
LvObj.onData = function(src){
var count:Number = src;
count++;
SvObj.count = count;
SvObj.sendAndLoad("count.php",SvObj); //連携するPHPファイル名をcount.phpと設定した場合
counter.text =count;
};
SvObj.onData = function(){
stop();
}
【PHP count.php】
<?php
//カウント用のデータファイルの読み込み
$LogFile = "count.dat";
if(isset($_POST)){
$count = urldecode($_POST["count"]);
$fp = fopen($LogFile, "w+");
fputs($fp,$count);
fclose($fp);
}
?>
注意点
actionscript内の、
SvObj.sendAndLoad("count.php",SvObj); //連携するPHPファイル名をcount.phpと設定した場合
ここの部分でPHPファイルのパスを指定しているけど、
これ一応しっかりとしたURLを入れた方がいいっぽい。
私はこれで同じ階層に置いたから良しと思ったけど、動かなかった。
http://~.com/count.php みたいにしっかりPHPファイルのURL入れたら動きました。
文字の抽出はcharAtやsubstrを使用するが
これ文字以外、例えば数字には出来ないし、String型に日付とか入れると抽出するとundefinedが出る。
自分は日付の1文字ずつを抽出して個々のムービークリップとして使用したかったので、
これの対策として以下とした。
var date = new Date();
var moji:Number;
moji = date.getFullYear();
trace(String(moji).charAt(1));
charAt(1)は2009年の1番目を表示するので、これの表示は 0 となる。
先頭は0番目からだからね^^
String型で型キャストするって事だのん
いちいち型キャストせずにやればいいのに?って思うが、たとえば
最初から変数mojiをString型で定義した場合。
var date = new Date();
var moji:String;
moji = date.getFullYear();
trace(moji.charAt(1));
この結果はundefinedになる。
trace(moji.charAt(1)); を
trace(moji); とするときちんと2009が表示されるのだ。
型キャストに気付かないとハマるかも^^
タイムライン上でいくつかのラベルで動きを制御して、
ラベル1を実行、動作が終わったらラベル2実行…という感じでラベル7位まで連鎖するのだが、
個々のラベルの中でonEnterFrameを使って、次のラベルへ行く時はそのEnterFrameをdeleteする。
が、deleteしているはずなのにEnterFrameが止まらないのだ。
あれ?と悩んでいろいろいじってみたが、いつまでたってもなおらない。
なんだこれ…とソースを隅々まで見た所、プログラム中で呼び出していない自作関数があって、
その関数内でonEnterFrameを使っているラベルを実行していたのだ。
その関数を消したら直った。
うーん。疑問。
実際その自作した関数はプログラム内で一度も呼び出していなかったのに。
いや、呼び出さない関数を定義していたのもおかしい話だが、
呼び出していない関数が実行されているのもおかしいだろ…まあ、直ったからいいんだが。
しかし気付いてよかった。
まさかそこが原因だとは思わなかったし。
当たり判定のやり方。
初心者にもわかりやすいhitTest関数がactionscriptに用意されていますので、
これを使って簡単に当たり判定が出来ます。
ステージに
testMcというムービークリップを用意。
1フレーム目にスクリプトを書くレイヤーを用意して、以下のスクリプトを記述
onEnterFrame = hitHantei;
function hitHantei(){
if(testMc.hitTest(_xmouse,_ymouse,true)){
trace("hit");
}
}
【解説】
マウスのX座標とY座標との接触判定です。
この座標を対象のムービークリップの座標に変えれば色々ゲームなんかにも使えそうですね☆
| 05 | 2026/06 | 07 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
詳しくはコチラをご覧下さい。
また、ショップ様、特に個人店様を支援しております。
コチラをご覧下さい。
皆様の幸せを願っています。
皆笑顔で人生を過ごしたいですね!