Slash Games
JapaneseEnglishKoreanShmplified ChineseTraditional Chinese
     
トップ
読み物
カレンダー
Other languages


■ 4)「クリックしてキャラクタの移動位置を決定」する方法

1体ずつクリックしては移動位置を指定、を繰り返す

 クリックして移動位置を決定する方法もある。
 移動させたいキャラクタをクリックし、移動目標位置をクリックすると、時間をかけてそこへ移動していく。そのキャラクタが移動している最中に、他のキャラクタの移動指令を出すことができる。
 多数のキャラクタの移動位置の関係がゲームの重要な要素である場合、特にいくつものキャラクタを同時にコントロールさせたい場合には、この操作方法が良いだろう。

  • キャラクタの移動位置を示したい
  • 移動位置の指定は自由にさせたい
  • キャラクタ自身が一定の移動速度を持つ
  • プレイヤの注意を全体の移動バランスに持っていきたい
  • 多数のコマンドを指定することがある

    例)リアルタイムストラテジー

米光:これはちょっと複雑ですね。
荻原:今までのものよりは。まず大元のタイムライン上に次のActionScriptを。

b.useHandCursor = false;
selectID = 0;
function selectChara(num){
    //選択IDを設定
    selectID = num;
    //矢印表示
    for(i=1;i<=3;i++){
        if(i == selectID){
            _root["c"+i].yaji._visible = true;
        }else{
            _root["c"+i].yaji._visible = false;
        }
    }
}
stop();

荻原:ここで、クリックしたとき矢印を表示させています。
米光:b.useHandCursor = false;は?
荻原:ステージの一番下のレイヤーに、ステージサイズと同じ大きさの透明ボタン(名前が「b」)を配置しているので、そのままだと……。
米光:あ、ステージ全体ば透明のボタンになってるので、カーソルがボタン上にきたときの手の形になってしまうわけか。
荻原:そう。それで、そうならないようにする為のスクリプトです。Button.useHandCursor=true で手のカーソル、Button.useHandCursor=false で矢印になります。
米光:その後、selectCharaファンクションになって。
荻原:numに選んだキャラの番号が入れられているので、その後は、その番号をselectIDとしてチェック。
米光:for(i=1;i<=3;i++)以下で、3回チェックしてるわけですね。selectIDが、1か2か3か?
荻原:そうです。で、該当ナンバーのときに、_root["c"+i].yaji._visible = true;で該当キャラの矢印を表示し、それ意外のときは_root["c"+i].yaji._visible = false;で消してます。
米光:えーと、それぞれのキャラクタ(ムービークリップ)に、c1,c2,c3と名づけてる、と。
荻原:そうです。で、その中にまたムービークリップyajiがあるわけです。
米光:だから、たとえばc1の矢印は、_root.c1.yajiと指し示すことができる。
荻原:はい。それで、_root["c"+i].yajiとすることで、iは、キャラクタのナンバーが入ってるから、該当キャラクタの矢印を指し示すわけですね。
米光:_root["c"+i].yaji._visible = true;で、その矢印を表示して、falseで非表示にする、と。
荻原:そうです。
米光:そうかー。
荻原:次は、そのc1,c2,c3のキャラクタのタイムライン上に以下のActionScriptを。

//初期設定
id = Number(this._name.charAt(1));
this.swapDepths((this._y*100)+id);
yaji._visible = false;
//歩くメソッド
function walk(X, Y) {
    this.gotoAndStop("walk");
    //目的地の設定
    opX = X;
    opY = Y;
    //エンジン
    this.onEnterFrame = function() {
        saX = opX-this._x;
        saY = opY-this._y;
        if (saX>=2) {
            _x += 2;
            _xscale = -100;
        } else if (saX<=-2) {
            _x -= 2;
            _xscale = 100;
        }
        if (saY>=2) {
            _y += 2;
        } else if (saY<=-2) {
            _y -= 2;
        }
        if (Math.abs(saX)<2 && Math.abs(saY)<2) {
            this.gotoAndStop("stay");
            delete this.onEnterFrame;
        }
        this.swapDepths((this._y*100)+id);
    };
}
//クリック→選択
this.onPress = function(){
    _root.selectChara(id);
}
stop();

米光:id = Number(this._name.charAt(1));は?
荻原:これは、自分自身のID番号を取得している部分です。_nameは自分につけられた名前で、charAt(1)はその名前の2文字目を抜き出すスクリプトです。
米光:えーと、1文字目を抜き出すときはcharAt(0)で、2文字目ならcharAt(1)ですか?
荻原:そうです。例えば、「c3」という名前をつけられたムービークリップ内に、this._name.charAt(1)と記述した場合、_nameが「c3」なので、その2文字目の「3」という文字列が抜き出されます。
米光:はい。そのキャラクタ自身のナンバーが抜き出されたわけですね?
荻原:いえ、まだキャラクタ自身の文字列なんですよ。だから、これをNumber()という関数で数値に変換してやるわけです。
米光:あ、そうか。Number(文字列)で、文字列を数値に変換するのか。
荻原:そして、idという変数に格納しているわけです。
米光:ラジャー。では次のthis.swapDepths((this._y*100)+id);は?
荻原:swapDepths()はオブジェクトの重ね順を入れ替えるスクリプトです。画面の下にあるオブジェクトほど、重なりを上にすることで、奥行きを表現しています。
米光:次のyaji._visible = false;は、まず矢印を非表示にする。
荻原:そう。これで、初期設定が終了。
米光:次は歩くメソッドですね。
荻原:キャラクタの移動を行います。
米光:function walk(X, Y) {ということは、X,Yが……。えーと、あとの行を見ると、この値が目標地点の座標みたいだけど、これは、どこで入れられてるの?
荻原:先ほど、b.useHandCursor = false;の説明で少し触れましたが、ステージの一番下のレイヤーに透明なボタンを配置しています。そのボタンアクションでクリックした時点のマウスカーソルのX座標とY座標をキャラに渡しています。
米光:そうか。ステージ全体に透明なボタンがあって、そこにもActionScriptがついてるんだ。見逃してた。えーと……これですね。

on(release){
	_root["c"+selectID].walk(_xmouse,_ymouse);
}

荻原:そうです。ボタンが離されたとき(release)、該当キャラのwalkメソッドを呼んで、同時に、マウスの座標位置(_xmouse,_ymouse)を受け渡してるわけです。
米光:それで受け渡されたXとYを、opX = X;とopY = Y;で、opX,opYにそれぞれ目標地点の座標を代入。後は、前に出てきた「マウスポインタで向かう位置を指定」の応用ですね。
荻原:そう。
米光:if (Math.abs(saX)<2 && Math.abs(saY)<2) {のところは、目標座標に着いたら、歩くアニメーションを止めて(this.gotoAndStop("stay"))、えーとdelete this.onEnterFrame;は?
荻原:this.onEnterFrame = function() {}で繰り返されていた処理を停止するスクリプトです。アニメーションを止めて、スクリプトの繰り返し処理も止めるということですね。


■ 5)その他

 その他、特殊もしくは複雑なコントロールを要求される場合は、違う操作方法を考えなければならない。
 たとえば操作ボタンをゲーム画面に用意したり、多数のキーに操作を割り当てたりする場合もあるだろう。
 FPS(First Person Shooting Game)と呼ばれる自分視点のシューティングゲームの多くは、マウスとキーボードを併用する。自分の移動と、向いている方向を分けて操作するためだ。



■ ゲームに適した操作方法を

 操作方法は、それ自体がゲームの面白さと直接関係する。いくら意欲的なゲームでも、操作感が不快だったり、ゲームと操作方法が合ってなければ、楽しく遊べない。操作方法こそが、プレイヤとゲームを結ぶ部分を担うからだ。
 操作方法が変わるだけで、ゲーム全体の楽しさが変わることは多い。
 たとえばゲームセンターのゲームは、コントローラーを変えることによって特徴を出したものがたくさんあった。
 たとえば、ブロック崩しの「アルカノイド」は、ボリュームのようなコントローラーだった。レバーよりも微妙な左右移動をコントロールすることができた。
 「T.A.N.K.」「怒」などのシューティングゲームは、ループレバーが採用されていた。レバーを傾ける方向に自機は移動するのは従来のゲームと同じだ。だが、それ以外にレバーについている握り部分を回すと、主人公の向きが変わった。これによって、後退しながら前方に撃つといったことが可能になり、ゲームの楽しみ方が変わったのだ。
 「ストリートファイター」のアップライト筐体では、2つの大きなボタンがついていた。ゴム製の大きなボタンで、押した強さを感知して攻撃の威力が変わった。押すというより、叩く、もしくは体重をかけて押さえ込むといった感じで、ボタンを押した。テーブル筐体は、圧力感知ボタンではなくて、6つのボタンがついていた。パンチとキックでそれぞれ弱・中・強のボタンだ。プレイする感覚は当然、まったく異なる。
 「三国志大戦」は、卓上の上に、三国志の武将が描かれたカードを並べて、そのカードを操作することで、ゲームをコントロールして戦う。フラットリーダー型筐体を使った独特の操作方法だ。
 ゲームセンターのゲームの歴史は、大きくは、操作方法の変化の歴史として捉えることもできるだろう。
 Flashのゲームを制作する場合でも、操作方法の違いはゲームに大きく影響する。ゲーム内容にあった操作方法について、しっかりと考えて制作することが大切だ。




米光一成(よねみつ・かずなり)
1964年生まれ。広島県出身。コンパイル、スティングを経てフリーランス。
「ぷよぷよ」「トレジャーハンターG」「バロック」「キングオブワンズ」などを企画監督脚本。ゲームデザイナー、ライター、講師 として幅広く活動中。著作に『日本文学ふいんき語り』(麻野一哉・飯田和敏・米光一成/双葉社)、『デジタルの夢でメシを食うた めにボクらは!』(米光一成編著/マイクロマガジン社)がある。
「こどものもうそう」ブログを更新中。

荻原貴明(おぎわら・たかあき)
1976年生まれ。群馬県出身。(株)デジタルビイムを経て2004年9月に独立し、フリーランスとして活動開始。
現在は、Niftyが運営する「デイリーポータルZ」「Game@Nifty」にてFlashゲームを制作。
主にFlashを使ったサイト制作、ゲーム制作を中心に活動中。

●米光一成&荻原貴明 一覧へ●

●ご意見・ご感想をお寄せ下さい●

BACK PAGE TOP
新着ニュース
記事一覧へ
リリースRSSによる配信についてバナー広告問い合わせ会社概要プライバシーポリシーリンクについて
RBB TODAY RESONSE e-nenpi.com cbook24.com DOKOYO MONO ONLINE
本サイトの内容は、著作権による保護を受けています。 Copyright (c) 1998-2006 IRI Commerce and Technology, Inc. All Rights Reserved.
IRI Commerce and Technology, Inc.