« iWeb 1.1 アップデータ | メイン | Flash Gun Shooting Alpha 2 »

2006年05月24日

Flash Gun Shooting Alpha Version

初めてFlashで簡単なガンシューティングゲームの練習作品を作ってみた。
45秒間に出来るだけ賞金首を倒し、ライフが残っていれば勝ちというルール。
弾を5発撃つと空になり、シリンダーをクリックしてリロードしなければ撃つことができない。
敵の出現はMath.random、タイマーはsetIntervalを使っている。
ActionScriptは最初の段階よりもgotoAndPlayを出来るだけ減らし、
onEnterFrame = function() {...}やonMouseMove = function() {...}を使用した。
まだアルファ版なのでちゃんとしたTitle、Gameover、Clearの画面は付けていないし、ゲームバランスもグダグタな点はご了承下さい。
後で色々要素を追加、改良する予定。

Gunman Alpha Version

投稿者 Sousuke : 2006年05月24日 17:13

トラックバック

このエントリーのトラックバックURL:
http://www.sousuke.net/blog/mt-tb.cgi/650

コメント

いいね、安定してるね。
あとは、撃つたびにシリンダーが回るとか、一般人も出てきて、彼らを撃つとポイントかライフが減るとかですね。

色々追加していくごとに不具合が出てきたりスクリプトに悩まされたりするので、簡単なところで終わらせずに、出来るところまで作り込んでいくと勉強になると思います。

投稿者 Hiroo : 2006年05月25日 01:47

>Hiroo氏
ありがとうございます。
ActionScriptって書く場所がちょっと違うだけでも予想外の不具合が出る事があるみたいですね。
mainラベルのところにsetIntervalとclearInterval両方書いたら45秒より短時間でゲームが終了したので、gameoverラベルとclearラベルにclearIntervalを書いたらうまく行ったりとか。
更に色々要素を追加していこうと思います。

投稿者 Sousuke : 2006年05月25日 06:23

Flashの次期バージョンは来年春に出るそうです。
ユニバーサルバイナリー化はそのときまでなさそうだとか。

Adobe CS3にバンドルされるそうなんだけど、元Macromedia製品からCSへのアップグレードはないのかなあ。

clearIntervalは実行された時点でsetIntervalをクリアしてしまうので、getTimer()でゲームの時間を計測して、制限時間になったらclearInterval()と、delete this.onEnterFrame、gotoAndPlay("gameover")とか。

スクリプトは大体1つのフレームにまとめて書いちゃってます。

投稿者 Hiroo : 2006年05月25日 12:32

>Hiroo氏
なるほど、勉強になります。
getTimer()はswfが動き出してからの時間なので、ゲーム内の時間を計測するにはPlayボタン付近とゲーム本編の2カ所に設置して差を出すんでしょうか。
最近はフレームにまとめて表記が主流みたいですね。

Mac版のユニバーサル化は思いのほか時間がかかってるみたいですね。
Adobe Creative SuiteやPhotoShopの利益はMac版とWindows版がトントンらしいで、もうちょっと力を入れてくれてもいいのに。

投稿者 Sousuke : 2006年05月25日 16:24

例えば1フレーム目にPlayボタンがあったとして、
start_btn.onRelease=function(){
 play()
};

2フレーム目にゲーム画面。
timerMax=45;
startTime=getTimer();
this.createEmptyMovieClip("timer_mc", 100);
timer_mc.onEnterFrame=frunction(){
 var nowTime=getTimer();
 var gameSec=Math.floor((nowTime-startTime)/1000);
 if(gameSec>=timerMax) {
  stopAllSounds();
  gotoAndPlay("gameover");
  timer_mc.removeMovieClip();
 }
};
stop();

みたいな。
3行目は「timer_mc」というタイマー用の空のムービークリップを、深度100に作成。それにOnEnterFrameをかけてタイマー代わりにし、時間が来たらゲームオーバーのフレームへ、ついでに不要になったtimer_mcも削除。
深度はいくつでもいいです。this.getNextHighestDepth()だとremoveMovieClip()が正しくできないバグがあるので注意。AS2.0で直ったんだったかな?

タイマー部分もfunctionにしてしまえば、1フレーム目に書けます。

投稿者 Hiroo : 2006年05月25日 17:54

あ、getTimer()は別にswfが動き出してからの時間ではないよ。
getTimer()を実行した瞬間のローカル時間を取得します。

setInterval()を使った方が楽か。
でも上の方法だと「var gameSec=」の下に時計の針MCを1秒ごとに_rotationさせるスクリプトを書くと、ゲーム時間を表示する「西部にありがちな時計台」なんかも作れるね。

投稿者 Hiroo : 2006年05月25日 18:04

んーやっぱり、タイマーも時計もsetInterval()の方がいいね。
実時間を表示させるのでなければgetTimer()は使わなくていいや。

投稿者 Hiroo : 2006年05月25日 18:30

Hiroo氏が書いたScriptはゲームを作る前ならチンプンカンプンだったんですが、今はだいたい理解出来ます。
getTimer()でstartTimeを取得。createEmptyMovieClipで空のMCインスタンス名timer_mcを深度100(数字が大きいほど上)に作る。
timer_mcを設定したフレームレートで以下を実行。
ローカル時間nowTimeを取得して、nowTimeからstartTimeを引いたミリ秒を1000で割って秒にしてその整数値をgameSecに代入、
もしgameSecがtimeMax以上なら音を全てストップしてフレームラベルgameoverに移動。
インスタンス名timer_mcのMCを消去する。
という感じでしょうか。
ネットで調べた時はswfが動き出してから...なんて書いてた人がいたので、間違えて覚えてしまってました。

投稿者 Sousuke : 2006年05月25日 18:37

あはははは、ものすごい嘘教えちゃった。
getTimer()はswfが再生してからの時間でした。
DateオブジェクトのgetHours()とかgetMinutes()がローカル時間の取得です。
失敬、失敬。

リファレンスに全部目を通してもっと覚えないとなあ。
必要に迫られないとさっぱり覚えなくていけません。
setInterval()もやっとこないだ使い始めたばかりって感じです。

Flash8用の「ActionScriptリファレンス」が多分もう出てると思うけど、そこまで理解できていれば、あとはオンラインリファレンスを見るだけで大丈夫そうですね。

投稿者 Hiroo : 2006年05月26日 12:38

わはは。
setInterval()使う前は45秒の空MC作って、最後のフレームでclearラベルに行くスクリプトにしてました。
Flash 8用のActionScriptリファレンス出たら俺も即買いします。
今は英語と同じで、書いてる事は分かっても自分ではあまり話せない(書けない)状態です。
ので、さらに勉強します。

投稿者 Sousuke : 2006年05月26日 12:58

得点のところのダイナミックテキストは、数字だけフォントを埋め込んだ方がいいんじゃないかな。

ただいまの最高得点2,100点。

投稿者 Hiroo : 2006年05月29日 19:09

>Hiroo氏
ダイナミックフォントの得点の数字を埋め込みました。
埋め込まないとアメリカン・タイプライター・フォント入ってないマシンは、別のフォントに置き換わるんですね。
俺はまだ2000点突破してないですよ!!

投稿者 Sousuke : 2006年05月29日 19:29

話は変わりますが、MacBookを見に行ってきました。
キーボードがすごく良くていいのだけど、ビデオカードが極端に弱いので、例えばiDVDのプレビューとかカクカクでした。
ドックのアニメーションなどもG5より遅いようです。
Final Cut Studioも対応できないみたいだし、仕事用としてはちょっとツライですね。
MacBookのメモリを1GにするとMacBookProが買えてしまうという価格設定では、やはり後者に決まりって感じです。現状、Intel MacではMacBookProが最速ですしね。

ついでにiMacでBoot Campのデモをしていたので触ってみました。予想に反してとても快適で、これはまじイケル!
3Dゲームがどうなるのか分からないけど、相当イイですよ。

投稿者 Hiroo : 2006年06月02日 21:13

>Hiroo氏
ちょっと今仕事が入っててFlashは中断中です。
なるべく早く終わらせてFlash再開させます。
MacBookはビデオメモリがメインメモリと兼用らしいので、おそらくそれで弱いんでしょう。
Boot Campはまだビデオカード・ドライバ関係が最適化?されていないとかで、十分な機能を発揮できないようですがバリバリの3Dゲームでなければスムーズに動くらしいです。
俺はMac Proがこなれてきたら買いたいですが、MacBook Proもいいですね。

投稿者 Sousuke : 2006年06月02日 22:15

どうもこんにちは。

FLASHのガンシューティングゲームに興味があって「FLASH ガンシューティング 作り方」で検索して辿りつきました。

アーケードゲームのリロード方式に「画面外を撃ってリロード」というものがあって、最近ではトリガーを引かなくても「銃口を画面外に向けるだけでリロード」が出来るようになっていたりするのですが…。

それと同じような感じで「マウスカーソルをゲームのウインドウ外に移動させてリロード」といった方式は取れるのでしょうか?

カーソルの座標を常に認識して、「弾丸がフルでない状態」で、かつ、「カーソルをある一定の座標より外側に動いてるのを確認」したらリロード…みたいな。

投稿者 KRTさん(三十路) : 2011年01月25日 01:57

KRTさん、初めまして。
自分はあまりActionScriptが得意ではないので確実な回答は出来ませんが、
ポインタがウインドウから外れてリロードされる方法としては、
ポインタがウインドウの外かどうか判断するマウスイベントがあればそれを利用し、
なければゲーム画面の外側に余白を作ってそこにポインタが来たらリロードするという方法が考えられるかと思います。
お役に立てなくて申し訳ないです。

投稿者 Sousuke : 2011年01月25日 08:47

コメントしてください




保存しますか?