• 締切済み

Lite1.0でのシューティングゲームですが

いつも大変参考にさせていただいております。 さて、本題ですが、Lite1.0でシューティングゲームを作成しているのですが 動きと当たり判定の連動がうまく行きません。 今現在設定している敵MCのあたり判定は以下の通りです。 //自機(攻撃側)とのあたり判定 if (../pc:_y >= _y - 10 and _y + 10 >= ../pc:_y) { if (../pc:_x == _x) { if (/game:hp <> 0) { if (/game:dmg <> 1) { tellTarget ("../pc") { gotoAndPlay("dmg"); } tellTarget ("../../hp") { nextFrame(); } } } } } //弾とのあたり判定 if (../tama:fire == 1) { if (../tama:_y >= _y - 10 and _y + 10 >= ../tama:_y) { if (../tama:_x >= _x -10 and _x + 10 >= ../tama:_x) { tellTarget ("../tama") { gotoAndStop(1); } gotoAndPlay("baku"); } } } インスタンス名の説明をします。 pcが自機、tamaは自機が発射する弾。 gameがシーン1に置かれている全体のMC。 hpが自機のパワー数、dmgはダメージ。 このASを敵MCの1フレーム目に記載しております。 そして、2フレーム目に gotoAndPlay(_currentframe - 1); 3フレーム目~7フレーム目には /game:score += 10; ラベルはbakuとしています。 そして、8フレーム目に stop(); ラベルをendとしています。 タイムラインは(全てMC) シーン1→game→ステージ(敵や弾・自機)→敵(あたり判定をしているMC) となっております。 そして、以前の質問にあった、こちらの動きを付けたいと考えております。 ↓ http://oshiete1.goo.ne.jp/qa2802247.html あたり判定は問題なく出来ているのですが、 これに動きをつけると動作しなくなってしまう・・・ と言いますか、どのように連動させるべきかうまいこと分かりません。 ゲームのイメージとしてはインベーダーゲームと思って下さい。 また違った方法で動きをつける様になるのでしょうか。 説明が長くなってしまって申し訳ございませんが 宜しくお願いいたします。

みんなの回答

noname#35109
noname#35109
回答No.2

#1です。 #1の補足に気づくのが遅れて回答がずいぶん遅れてしまいました。 すみません。 複数の敵ムービークリップの座標をまとめて動かすには, まとめて1つのムービークリップに入れて, そのムービークリップごと動かすのが簡単だと思います。 Flash Lite 1.x は, とにかく構造を複雑にしなければ色々なものがちゃんと動きませんし, 色んな場所に色んなスクリプトを書く必要がありますから, その説明を書くのも理解するのも大変です。 ですから, 簡単なものを実際に作ってみましたので, とりあえずその簡単なものを作成してみて, それを作り替えながら次の段階のものを作って行ってください。 実際に作成手順を説明する前に, まず,ムービー全体の階層構造を書いておきます。  _root   ├ tama(ムービークリップ:玉)   └ ムービークリップ(インスタンス名 無名)       ├ teki0 (ムービークリップ(敵))       ├ teki1 ( 〃 )       ├ teki2 ( 〃 )       ├ teki3 ( 〃 )        … 省略 …       ├ teki38 ( 〃 )       └ teki39 ( 〃 ) ステージは勝手に 240×240 を想定しています。 初期画面の見た感じ。  □□□□□□□□□□□□□□  □■■■■■■■■■■□□□  □■■■■■■■■■■□□□  □■■■■■■■■■■□□□  □■■■■■■■■■■□□□  □□□□□□□□□□□□□□  □□□□□□□□□□□□□□  □□□□□□□●□□□□□□  □□□□□□□□□□□□□□  □エリアをステージだと思ってください  ■が teki0 ~ teki39 です  ●が tama です。 まず, 敵になる■をステージ上に作成します。 私の場合は,15×15px の四角い塗りを描きました。 その■をムービークリップに変換します。 基準点はどこでも良いですが,私は中央にしました。 その■のムービークリップに 「teki0」 というインスタンス名を付けます。 そして, その teki0 内のタイムラインの編集に入ります。 私は, teki0 内のタイムライン フレーム1 が■で, フレーム2~5が敵が爆発するアニメ, フレーム6 を空白キーフレームにしました。 そして,スクリプト用にレイヤーを追加して, 最初のフレームと最後のフレームに stop(); を書きます↓。 teki0 のタイムライン ////////////////////////////////////////////              ↓stop();      ↓stop();  □ レイヤー 筆・・|○        []|○|  □ レイヤー 筆・・|●|●>---->|●|○|                ↑爆発    ↑消える //////////////////////////////////////////// teki0 内のタイムラインの編集は以上で, ドキュメント(_root)の編集に戻ります。 teki0 をさらにムービークリップに変換します。 基準点は中央にすると,スクリプトを考えるときにわかりやすいと思います。 この teki0 が入ったムービークリップにインスタンス名を付けてもかまいませんが, この説明にはインスタンス名は不要ですから,一応,無名のムービークリップということにしておきます。 無名のムービークリップ 内のタイムラインの編集に入ります。 teki0 をコピペで右方向と下方向に40個になるまで増やします。 そして, 各40個のインスタンス名を次のように付けなおします。   ↓無名のムービークリップの基準点  teki0  teki1  teki2  … teki9  teki10 teki11 teki12 … teki19  teki20 teki21 teki22 … teki29  teki20 teki21 teki22 … teki29  teki30 teki31 teki32 … teki39 無名のムービークリップ内のタイムラインを, 3フレーム,2レイヤーにします。  □ レイヤー 筆・・|○ []|○| ←スクリプト  □ レイヤー 筆・・|●   []| ←teki0 ~ 39 そして,フレームにスクリプトを書いて行きます。 無名のムービークリップの フレーム1(コピペ可能) ------------------------------------- // ステージの横幅の設定 stg = 240; // teki の個数を設定 n = 40; // teki の速度を設定 spd = 2; // teki の降りる距離を設定 down = 4; // teki の動く向きのフラグの初期値 flg = 1; // teki0 の横幅を取得 w = teki0._width; ------------------------------------- 無名のムービークリップの フレーム3(コピペ可能) ------------------------------------- // --- 当たり判定 --- for (i=0; i<n; i++) { if (/tama/:_x<=_x+getProperty("teki" add i, _x)+10) { if (/tama/:_x>=_x+getProperty("teki" add i, _x)-10) { if (/tama/:_y<=_y+getProperty("teki" add i, _y)+10) { if (/tama/:_y>=_y+getProperty("teki" add i, _y)-10) { if (eval("teki" add i add "/:death")<>true) { // teki を再生開始 tellTarget ("teki" add i) { play(); } // 加速 spd = spd+0.15; } // 死 のフラグ death を true にする set("teki" add i add "/:death", true); } } } } // 右端 teki の座標を取得 RR = getProperty("teki" add i, _x); if (RR>R and eval("teki" add i add "/:death")<>true) { R = RR; } } // --- 左右の teki 座標を取得--- // 左端 teki の座標値の初期化 L = 1000; // 右端 teki の座標値の初期化 R = 0; for (i=0; i<n; i++) { // 左端 teki の座標を取得 LL = getProperty("teki" add i, _x); // teki? の座標が L より小さく,かつ,死んでなければ if (LL<L and eval("teki" add i add "/:death")<>true) { // teki? の座標を L に入れなおす L = LL; } // 右端 teki の座標を取得 RR = getProperty("teki" add i, _x); if (RR>R and eval("teki" add i add ":death")<>true) { R = RR; } } // ---移動--- _x = _x+(spd*flg); if (_x>stg-R-(w/2)) { flg = -1; _x = stg-R-(w/2); _y = _y+down; } else if (getProperty("", _x)<-L+(w/2)) { flg = 1; _x = -L+(w/2); _y = _y+down; } gotoAndPlay(2); ------------------------------------- これで,本題の敵の軍団の作成は終わりです。 ドキュメント(_root)の編集に戻ります。 玉(tama) ですが, これは,本題の敵の軍団の動作検証をするためのもので, 簡易的なものにしました。 実際はもっと凝ってくださってかまいません。 ステージ上に ● を描きます。 私は,直径 10px の塗りを描きました。 その塗りをムービークリップに変換します。 基準点は中央です。 その● のムービークリップに 「tama」 というインスタンス名を付けます。 そして, その tama 内のタイムラインの編集に入ります。 tama 内のタイムラインを, 2フレーム,2レイヤーにします。  □ レイヤー 筆・・|○|○| ←スクリプト  □ レイヤー 筆・・|●  []| ←●の塗り そして,フレーム2のみにスクリプトを書きます。 tama の フレーム2(コピペ可能) ------------------------------------- // 上まで行ったら if (_y<0) { // ランダムな下へ移動 _x = 5+random(230); _y = 250; } else { // それ以外は上へ _y -= 15; } gotoAndPlay(1); ------------------------------------- tama は敵に当たっても消えません。 簡易的なものです。 また,ゲームの終了もありません。 敵が全て消えるかもしれませんし, 消えずにステージより下にもぐって行ってしまうかもしれません。 どちらにしても終了はしません。 tama は出続けます。 これで,何度かムービープレビューして動作を見てもらうと, どうなったときにどうなるのかという動きがわかると思います。 あとは,これをカスタマイズしてみてください。 ※私の場合,上のように作成すると,   2.83 KB (2,908 バイト) と,容量的には,   全く問題はないと思われる SWF ができました。   しかし,   このような苛酷なループ処理スクリプトを,   実際の携帯が正常な再生速度で,   できるのかどうかはわかりません。 インベーダー って, あと自機もあって, さらに敵からも玉が出て, そして敵の玉避けの砦みたいなのがあって, その玉避け砦は玉によって徐々に壊れて行きますし, たまに UFO も出没しましたよね。 なつかしい,遠い日の想い出です...。 Flash で,それも Flash Lite 1.x で, 全て実現するのは無理かもしれません。 インベーダはシンプルで簡単に作成できそうなゲームですが, 実際はかなり難しいゲームだったのですよね。 感心します。 実際のアルゴリズムはどんなのだったのでしょうかね。 ムービークリップというような概念もないと思いますし, ピクセル(といっても当時はかなり大きなドット)単位で色を変えて行くなど, 少なくとも上記のものとは全く違うものだとは予測できますがすごそうです。 つくづくインベーダに感心感心。

noname#35109
noname#35109
回答No.1

おそらく,書かれていない(多すぎて書くことができない)部分が多々あると思いますから, 意味不明な部分も多々ありますが, 一応うまく行った方法を書きます。 まず,敵機(インベーダ?)にインスタンス名を付けます。 ここではインスタンス名を「teki」としておきます。 構造自体を変えるとインスタンス名はなくてもすみますが, ややこしくなるのでなるべく構造を変えないようにするために, インスタンス名を付けることにしておきます。 インスタンス名を付けるのは変数の初期値を設定するためです。 これで階層構造は次のようになると思います。  _root   └game(MC)     ├ pc (自機:MC)     ├ tama(玉:MC)     └ teki (敵機:MC) そして, game(MC)の基準点をステージの左上のコーナーと一致させておきます。 つまり, MC内の座標を_rootのステージ座標と一致させるということです。 基準点についてもしわからない場合は次のURLを参考にしてみてください。 インスタンスの基準点 http://homepage3.nifty.com/ginga-b/MX/inst_refpoint.html 上記URLの, 「基準点の編集」 を参考に,game の基準点をステージの左上にしてください。 そして, _root のフレーム1に次のように, 変数の初期値を設定するスクリプトを用意しておきます。 ------------------------------------ // 敵が動くための変数 flg の設定 /game/teki:flg = 1; // // 以下は技巧的に(わざと)初期値を設定 /game:hp = 5; /game:dmg = 5; /game/tama:fire = 1; ------------------------------------ そして, ご質問で書かれている敵機(_root.teki)のフレーム1のスクリプトを次のようにします。 ----------------------------------------------- // ★↓以下を付け足し↓★ // x座標を spd ずつ加算or減算 _x += flg*5; // x座標が「ステージの幅-このMCの幅/2」になれば if (_x>=-_width/2+240) { // x座標を「ステージの幅-このMCの幅/2」で固定 _x = -_width/2+240; // y座標を高さ分下へ _y += _height; // そしてフラグの符号を変える flg = -1; // // x座標が「このMCの幅/2」になれば } else if (_x<=_width/2) { // x座標を「このMCの幅/2」で固定 _x = _width/2; // y座標を高さ分下へ _y += _height; // そしてフラグの符号を変える flg = 1; } // ★↑以上を付け足し↑★ // //自機(攻撃側)とのあたり判定 if (../pc:_y>=_y-10 and _y+10>=../pc:_y) { // ★↓次の行を変更↓★ if (../pc:_x >= _x-10 and _x+10>=../pc:_x) { if (/game:hp<>0) { if (/game:dmg<>1) { tellTarget ("../pc") { gotoAndPlay("dmg"); } tellTarget ("../../hp") { nextFrame(); } } } } } //弾とのあたり判定 if (../tama:fire == 1) { if (../tama:_y>=_y-10 and _y+10>=../tama:_y) { if (../tama:_x>=_x-10 and _x+10>=../tama:_x) { tellTarget ("../tama") { gotoAndStop(1); } gotoAndPlay("baku"); } } } ---------------------------------------------- 一応勝手にステージのサイズは240としています。 付け加えや変更部分は ★ 印を付けています。  tellTarget ("../../hp") {   nextFrame();  } この意味が結局わかりませんでしたが, この部分を除いてはうまく動作しましたよ。 ---全体的な感想です--- 上の "../../hp" もそうですし, 他の gotoAndPlay("dmg"); もそうですが, インスタンス名と変数名,フレームラベルと変数名に, 同じ名前を使われていますね。 ここらへんは混同しませんか? 私は上のうまく行ったサンプルを作りながら, 何が変数名で何がフレームラベルで何がインスタンス名なのかわからなくなりましたよ。 作者自体が混同せずに,うまく動作すれば, 名前がかぶっていても良いと思いますが, 別の意味を持つ物には,違う名前を付けた方が無難かと思います。

erinyanko
質問者

補足

結構流れてしまったので、見たいただけるか不安ですが・・・。 ご返答ありがとうございました。 色々と動作をしていたら返事が遅くなってしまいました。すみません。 一応動きをつけることはできたのですが、 実は敵は一機ではなく、横10の縦4の40機いるのです。 そうすると、動きをつけた所ばらばらになってしまって それをうまくコントロールする書き方が判っていづに時間がかかっています。 一段下がる時に全機一緒に移動させたいのです。 (本家のインベーダーの様ですね) もしお力をおかしいただけるようでしたら ご伝授の程、宜しくお願いいたします。

関連するQ&A