仕事の知識を趣味に使ってみる
実務の経験を生かして実務では使用したことが無いFlashを使ってプログラミングをしてみます。プログラム言語は違っても、考え方は変わらない?
プログラミング言語は世に数多く存在しています。
それぞれ固有の言語仕様というものが存在し、それに対応するプログラミングツールも多種多様です。
そんな中運が良いのか悪いか、仕事に合わせて毎回別のプログラミング言語で書くという、まさに自分が言語を選ぶのではなく、仕事が言語を選ぶ状態になっていました。そんな生活をしていると、別の言語に変わることにすっかり慣れてしまいました。
そして思ったことがあります。
使用する言語が変わってもやれることは同じであると。
つまり、プログラミング言語はそれぞれ多かれ少なかれクセはあるものの、論理的に同じ考えの下でプログラムを組んでいけば結果同じものが作れると思いました。
という訳で今回は、実務の経験を生かして実務では使用したことが無いFlashを使ってプログラミングをしてみます。
ムービークリップがステージ上を移動するFlashムービーを作成する
作成するワークスペースは以下の画像になります。

1)1フレーム目のみを使用します
2)”background”のタイムラインに、黄緑色でステージを描いて奥行きを持たすため台形にします
3)ステージのタイプをボタンにします
4)”human”タイムラインに、humanムービークリップを作成しステージの上に配置します
5)”script”タイムラインに、ActionScriptの「stop();」を記述しておきます
ステージがクリックされた時の動作を設定する
ステージがクリックされたら、クリックされたマウスの位置を引数にhumanオブジェクトの関数を呼び出します。
更に、humanオブジェクトが歩く動作を設定します。
_root.human.moveHuman(_root._xmouse, _root._ymouse);
_root.human.human.setAnimation("walk");
}
配置したhumanオブジェクトに移動するActionScriptを追加する
ムービークリップの移動はx軸とy軸の増減で移動しているように見せます。
その為には、x軸とy軸に分けて個々に状態を変化させていかなければなりません。
_x_flg = 0;
}
onClipEvent(enterFrame) {
function setMoveHuman() {
xPos = _root._xmouse; // クリックしたx軸の値を保持する
yPos = _root._ymouse; // クリックしたy軸の値を保持する
_x_end_flg = 0; // x軸の移動距離がy軸より長い場合のフラグ
_y_end_flg = 0; // y軸の移動距離がx軸より長い場合のフラグ
xZouka = 2; // x軸方向の移動増加値
yZouka = 1; // y軸方向の移動増加値
// humanの位置とクリックした位置の距離の関係を定義し、x軸に関してはhumanの向きを変える
if (xPos >= this._x) {
if (_x_flg == 0) {
this.human.flipVertical();
}
_x_flg = 1;
}
if (xPos < this._x) {
if (_x_flg == 1) {
this.human.flipVertical();
}
_x_flg = 0;
}
if (yPos >= this._y) {
_y_flg = 1;
}
if (yPos < this._y) {
_y_flg = 0;
}
// 斜めに移動するためにxとyの増加の割合を計算する
_x_abs = Math.abs(xPos - this._x);
_y_abs = Math.abs(yPos - this._y);
if (_x_abs > _y_abs) {
yZouka = _y_abs / (_x_abs / xZouka);
} else {
xZouka = _x_abs / (_y_abs / yZouka);
}
} // moveHuman関数終了 --
// 移動処理(x,y軸両方の移動が終了するまで続ける)
if ((_x_end_flg != 1) and (_y_end_flg != 1)) {
if (_x_end_flg == 0) {
if (_x_flg == 1) {
if ((xPos - 3) > this._x) {
this._x += xZouka;
} else {
_x_end_flg = 1;
}
} else {
if (_x_flg == 0) {
if ((xPos + 3) < this._x) {
this._x -= xZouka;
} else {
_x_end_flg = 1;
}
}
}
}
if (_y_end_flg == 0) {
if (_y_flg == 1) {
if ((yPos - 2) > this._y) {
this._y += yZouka;
} else {
_y_end_flg = 1;
}
} else {
if (_y_flg == 0) {
if ((yPos + 2) < this._y) {
this._y -= yZouka;
} else {
_y_end_flg = 1;
}
}
}
}
_wait_flg = 1;
} else {
// x,y軸の移動が終了したらhumanの移動を停止する
if (_wait_flg == 1) {
this.human.setAnimation("wait");
_wait_flg = 0;
}
}
}
ここでのポイントはこれだけの処理を”if文”でしか使用していない点です。
そもそもActionScriptには難しい処理が出来ないので使えるものを工夫して使用するしかありません。
そしてもう一つ、”while”や”for”などの記述がありませんが実は”ループ処理”が入っています。
”enterFrame”とあるように、このフレームにきたら処理を行うという指示です。
これは冒頭で設定した「stop()を記述する」がポイントになっていて、常に同じフレームにいるので何度も処理を行おうとします。
ここにループ処理が潜んでいました。
この様に、ツールによっては同じ処理方法でも実現する方法が違ってきます。
動作確認
以上の設定を行うと、ステージを動き回るムービークリップが作成されます。
終わりに
同じ事を実現する時、言語の特性やそのツールの得意分野などを考慮して選択できるようになれれば、幅広く早く対応できるようになると思います。
機会があったら嫌がらず色々な言語に挑戦してみてはいかがでしょうか。
