コンピュータにまつわる興味あるモノだけを扱う個人的なゆるいブログ。
by riye_tech_2004
ブログパーツ
検索
連絡先
pcnikki@gmail.com
※トラックバック送信元記事にこのブログhttp://pcnikki.exblog.jp/へのリンクが存在しない場合はトラックバックを受け付けません。ただし、エキサイトブログ同士のトラックバックには適用されません。



東京アメッシュ
GMAIL(SSL)
public: typedef Takel::Diary Observable;
スクイズ研究所
MobileBiz
Ken's Blog
眞鍋かをりのここだけの話


SonyEricsson
ノキア・ジャパン
NECわいわいモバイル
LGモバイル

TSUKUMOネットショップ
ASUS
EPSON Direct ショップ

ブログ口コミポータル話題のjp
八百万神社の杜
Windows Tipsホーム

ワールドビジネスサテライト
カテゴリ
以前の記事
カテゴリ:華麗なるFlash( 5 )
ActionScriptでCっぽく構造体を記述
例えばActionScriptに「CやJavaからのソースを移植したいかもー」と思った時や、「変数が増えて管理し辛い!」などと言う場合は構造体やクラスを作って作業の効率化を図りたいところです。

ActionSctipt(2.0)ではクラスを記述できます。
しかし構造体は記述できるのでしょうか。
クラスを作るほどでもないけど、変数を構造的に管理したい場合は構造体あったほうが便利です。

例えば、こんなCの構造体を活用したいとする場合、
typedef struct {
int vx,vy,vz;
} VECTOR;

ActionScriptではこう書きます。
function getVector() {
return {vx:0,vy:0,vz:0};
}
とこんな感じでVector型のオブジェクトを返す関数を書きます。
そして、
var vec = getVector();
と宣言します。
わざわざ関数にしたのは他の箇所で使いまわすために便利だからです。
利用は簡単です。
vec.vx = 1;
vec.vy = 2;
vec.vz = 3;
などのようにして構造体のメンバ変数にアクセスします。
また関数に構造体を渡したい場合は、
var vec = getVector();
kansuu( vec );

function kansuu( _vec ) {
_vec.vx = -1;
_vec.vy = -2;
_vec.vz = -3;
}
などのように書きます。
呼び出し側の"vec"のメンバ変数は"kansuu()"を通して更新されますので、returnで変数を返す必要はありません。

つづく。




[PR]
by riye_tech_2004 | 2007-02-05 01:27 | 華麗なるFlash
ActionScript仕様の注意点
ActionScriptで、ちょっと気をつけることがあります。
それは変数の命名についてです。

CやJavaなどでは変数の命名はほぼ思い通りの名前をつけることができます。
ライブラリ関数名やクラス名などを気をつければいいのです。

そんな感覚でActionScriptを書いていると、手痛い洗礼を受けました。
ActionScriptではグローバル変数とローカル変数について、"var"の宣言を記述しなくてもメモリ確保され変数として使用可能です。
ごっちゃになると危険なので、自分で作成した関数内のローカル変数名の頭に、"_"(アンダーバー)をつけていました。

そしてこんな関数を作り、思うような結果が返ってこずしばらく悩みました。
function kansuu( _val0, _val1 ) {
var _x = _val0+_val1;
return _x;
}
何気ない関数なのですが、結果は"0"しか返しません。
_val0と_val1は0以外の数値が渡されてもです。
ちなみに"_x"は”自分”ではグローバル変数として使っていません。
この関数内でしか”宣言”していないのです。

結論から言うと、”_x”はグローバル変数としてシステムが使用しているため、常に0が入っている状態でした。(←使用していないので0クリアされたままの状態)
"_x"はMC(ムービークリップ)内では使用されていることは頭にあったのですが、_rootにあることはすっかり忘れていました。(_rootもMC扱い)

_x以外では、
_y
_width
_height
・・・などがあるので取り扱いに注意が必要です。

わかってしまえば気をつければいいだけの話ですが、CやJavaだと"_x"はローカル宣言させたほうが優先されます。

と言うかエラーメッセージ出してくれよ。。。(←わがまま?)




[PR]
by riye_tech_2004 | 2007-02-03 03:44 | 華麗なるFlash
ActionScript変数のスコープ
ActionScriptはスクリプトと呼んでいる意味上、その言語仕様はいい加減です。
そのため変数の取り扱いのクセを知っておかないと、原因不明のバグと格闘しつづけることになります。(←自分)
オンラインヘルプが今ひとつ舌っ足らずなので、あらぬ勘違いをしてしまいました。
いい加減と言いつつもコードは書き易いです。だけど信頼のあるコードを書くには気を使わなければなりません。

その1つが変数のスコープです。
変数のスコープとはC言語などで使われる用語ですが、その意味は変数がメモリに確保されて、破棄されるまでの寿命、扱える範囲を意味します。
ActionScriptで気になったのは、変数の宣言位置によるスコープの違いです。
ネットで探っても明確な回答がなかったので、自分で確認した訳です。

1.グローバル変数
グローバル変数とは元となるswf内のどこからでも参照できる変数です。
宣言は、
var hensuu;
のようにスクリプト内にどこでも記述すればグローバルとしてメモリ確保されます。
「どこにでも」と書きましたが、関数やクラス内は例外です。

例)
var hensuu = 0;
function kansuu() {



}

2.ローカル変数
ローカル変数とは関数やクラス内でしか利用できない変数です。
関数やクラス内で、
var hensuu;
と宣言します。

例)
function kansuu() {
var hensuu = 0;
}
以上が変数宣言の基本です。

変数宣言がいい加減だと、思ったようにスクリプトが動かなくなります。(←自分)
例えば、、、
function kansuu() {
hensuu = 0;
}
関数内でvarをつけずに変数宣言すると、グローバル変数としてメモリ確保されてしまいます

うっかりこんなことをしてしまうと、思うようにスクリプトが動作しないので頭をかかえることになります。
function kansuu1() {
hensuu = 0;
}

function kansuu2() {
hensuu = 2;
kansuu1(); ←hensuuは0にされてしまう。
}
わかってしまえば気をつければいいだけの話ですが、せめて警告くらい出して欲しいと思います。
もしくは”var”はつけないと変数として使用できないとか、そういうルールがないとデバッグが大変なんですよね。



[PR]
by riye_tech_2004 | 2007-02-02 17:26 | 華麗なるFlash
ActionScriptの変数名
FlashMX2004を使っています。(←Windows版)

フレーム1で変数名を、
var tmpVec_vx=0;

とし、フレーム2で、
tmpVec_vx+=1;
trace(tmpVec_vx);

とすると、NaNと表示されます。

タイプミスでもありません。
変数名にアンダーバーが使えないとはヘルプに記載されていないし、使用しているソースも見たことがあるので使えないことは無いはずです。

試しに、
tmpVec_v_x
とやったところ正常にトレースに変数の中身が表示されました。

なんで??



[PR]
by riye_tech_2004 | 2007-01-27 16:41 | 華麗なるFlash
ActionScriptのデバッグ機能
これほど強力なスクリプト機能が搭載されているのに、デバッガが弱すぎます・・・。
ブレークポイントをかけて実行し、バグのために無限ループになるとFLASH MXごと落ちます。(無限ループさせる私が悪い?)

最新版では解消されているのでしょうか?



[PR]
by riye_tech_2004 | 2006-05-11 02:45 | 華麗なるFlash