パットゴルフ - Flash(ActionScript)で様々なゲームを作ろう
目次
実行画面
パットゴルフです。マウスで方向と強さを決めて、クリックするとボールを打つことができます。池やコース外に出ると最初からやり直しです。頑張れば2打でクリアすることができると思います。
.fla ファイルダウンロード
画面作成
まずステージ・ステージに乗せるシンボルなどを作ってゆきます。ステージのプロパティ
最初にステージのプロパティを適当に設定します。この解説で使っているムービーでは、サイズを「640×320」、背景色を「#ADFB84」、フレームレートを「30fps」としています。コースの作成
1フレーム目にコースを作成します。下図のように、グリーンを抜き、つまり背景色が見えるようにして作ってください。下図の例ではOB領域と池を描いていますが、木や観客などを描いても良いでしょう。完成したらムービークリップシンボルに変換し、ステージ上のインスタンスに「course_mc」と名前を付けます。
ボール・ホール・矢印の作成
ボールを作成してムービークリップに変換し、インスタンスに「ball_mc」と名前を付けます。中心点はボールの中央にしてください。次にホール(カップ)を作成してムービークリップに変換し、インスタンスに「hole_mc」と名前を付けます。
次にボールの方向と力を決める矢印を右向きで作成してムービークリップに変換し、インスタンスに「dir_mc」と名前を付けます。中心点は矢印の左端にしてください。
ステージ上への配置は以下のようにしてください。矢印の位置はどこでも構いません。
ゲーム終了画面の作成
次に2フレーム目にゲーム終了画面を作成します。まず2フレーム目に空白キーフレームを作成し、下図のように2行分ダイナミックテキストが入るエリアを作り、変数名を「msg」としてください。次にリトライ用のボタンシンボルを作り乗せてください。ActionScript の記述
続いて、フレームやムービークリップに ActionScript を記述して行きます。1フレーム目のアクション
1フレーム目をクリックして、以下のフレームアクションを記述してください。
var da = 0;
stop();
ボールのアクション
次に1フレーム目のボールをクリックして、以下のムービークリップアクションを記述してください。
onClipEvent(load) {
var pow = 0;
var deg = 0;
var start_x = _x;
var start_y = _y;
}
onClipEvent(enterFrame) {
if (pow > 0) {
_x += pow * Math.cos(Math.PI / 180 * deg);
_y += pow * Math.sin(Math.PI / 180 * deg);
pow--;
if (_root.hole_mc.hitTest(_x, _y, true)) {
_root.gotoAndStop(2);
}
if (_root.course_mc.hitTest(_x, _y, true)) {
_x = start_x;
_y = start_y;
_root.da = pow = 0;
}
} else {
_root.dir_mc._visible = true;
}
}
矢印のアクション
次に1フレーム目の矢印をクリックして、以下のムービークリップアクションを記述してください。
onClipEvent(load) {
var width = _width;
var pow = 0;
}
onClipEvent(enterFrame) {
_x = _root.ball_mc._x;
_y = _root.ball_mc._y;
var x = _root._xmouse - _x;
var y = _root._ymouse - _y;
_rotation = Math.atan2(y, x) * 180 / Math.PI;
pow = Math.sqrt(x * x + y * y);
if (pow > width * 4) pow = width * 4;
_xscale = pow * 100 / width;
}
onClipEvent(mouseDown) {
if (_visible) {
_root.ball_mc.deg = _rotation;
_root.ball_mc.pow = pow / 2;
_root.da++;
_visible = false;
}
}
2フレーム目のアクション
続いて2フレーム目をクリックして、以下のフレームアクションを記述してください。
var gstr = ["Hole in one", "Eagle", "Birdie", "Par", "Bogey", "Double Bogey"];
msg = da + "shots\n" + gstr[da - 1];
リトライボタンのアクション
続いて2フレーム目のリトライボタンをクリックして以下のアクションを記述します。
on(release) {
gotoAndPlay(1);
}
実行
以上が完成したら保存してゲームを実行してみてください。ActionScript 解説
1フレーム目のフレームアクション解説
var da = 0;
stop();
変数 da には、ホールに入るまでに打った打数が入ります。ボールのムービークリップアクション解説
onClipEvent(load) {
var pow = 0;
var deg = 0;
var start_x = _x;
var start_y = _y;
}
初期設定部分です。pow はボールの速度、deg はボールの転がる方向(度)、(start_x, start_y) にゲーム開始時のボール位置が入ります。
onClipEvent(enterFrame) {
毎フレーム処理です。
if (pow > 0) {
ボールの速度が0以上のとき、以下の移動処理を行います。
_x += pow * Math.cos(Math.PI / 180 * deg);
_y += pow * Math.sin(Math.PI / 180 * deg);
方向と速度から、x, y 方向への移動距離を求めています。ボールが1から2へ移動するとき、x, y それぞれの移動量は三角関数により上図のようになります。Math.cos 関数、Math.sin 関数は引数としてラジアンの角度を取るので、度数 deg に π/180 を掛けることによって変換しています。
pow--;
グリーンとの摩擦により、速度を下げています。ここを変更することで、ボールの止まり方を変えることができます。
if (_root.hole_mc.hitTest(_x, _y, true)) {
_root.gotoAndStop(2);
}
ホールにボールの中心が当たった場合、ホールに入ったとみなし、2フレーム目へ飛びます。
if (_root.course_mc.hitTest(_x, _y, true)) {
_x = start_x;
_y = start_y;
_root.da = pow = 0;
}
コース外の領域に当たった場合、ボールをゲーム開始位置に戻し、速度と打数とリセットします。
} else {
_root.dir_mc._visible = true;
}
ボールが止まっている場合は、矢印を表示します。矢印のムービークリップアクション解説
onClipEvent(load) {
var width = _width;
var pow = 0;
}
初期設定部分です。width には矢印の幅、pow にはショット力が入ります。
onClipEvent(enterFrame) {
毎フレーム処理です。
_x = _root.ball_mc._x;
_y = _root.ball_mc._y;
矢印の座標をボールと同じ位置にセットします。
var x = _root._xmouse - _x;
var y = _root._ymouse - _y;
(x, y) には、マウスの位置から矢印の位置を引いた差分が入ります。
_rotation = Math.atan2(y, x) * 180 / Math.PI;
ここで矢印の向きをマウスに向かうように回転しています。差分座標のアークタンジェントを求めることによって回転角が定まります。Math.atan2 は引数で指定した (y, x) 座標からアークタンジェントを求める関数です。戻り値はラジアンなので、180/π を掛けることによって度数に変換しています。
pow = Math.sqrt(x * x + y * y);
三平方の定理によって、矢印の長さを求めて、それをそのままショット力としています。
if (pow > width * 4) pow = width * 4;
矢印が元の長さの4倍以上長くならないようにここで制限をかけています。
_xscale = pow * 100 / width;
マウスの位置まで矢印を拡大して引き伸ばしています。
onClipEvent(mouseDown) {
マウスをクリックしたときの処理です。
if (_visible) {
マウスが表示されているとき、つまりボールが転がっていないときだけ、以下の処理を行います。
_root.ball_mc.deg = _rotation;
_root.ball_mc.pow = pow / 2;
ボールの角度を矢印の角度、ボールの速度をショット力÷2としています(ショット力そのままでは速過ぎるので)。
_root.da++;
_visible = false;
打数を+1し、ボールが転がっている間は矢印を消します。2フレーム目のフレームアクション解説
var gstr = ["Hole in one", "Eagle", "Birdie", "Par", "Bogey", "Double Bogey"];
msg = da + "shots\n" + gstr[da - 1];
打数と、それに応じたメッセージを表示しています。ここではパー4と仮定して各メッセージを配列に持たせています。ゴルフは余りよく知らないのでメッセージはでたらめかも知れません。
リトライボタンのボタンアクション解説
on(release) {
gotoAndPlay(1);
}
クリックされたら、ゲーム画面に戻ります。