もんしょの巣穴blog

Squirrel その8

ちょっとだけワールドカップの話。
ドイツ×スウェーデン戦は前半10分までが面白かった。主にクローゼ。
それ以降はクローゼにあんまりボールが回らないし、バラックはミドルばっかり狙うし。
特にドイツの守備陣は酷すぎる。スウェーデンの攻撃陣がいつもの調子だったら2点くらい取られててもおかしくない。
次のアルゼンチン戦はヤバイだろう。
イングランド×エクアドル戦はベッカムのFK以外は糞みたいに面白くない試合だった。
イタリア×オーストラリアは途中で寝た。上記の試合より良かったけど、それでもあんまり面白くなかったし。
ブラジル×ガーナには期待しよう。


さて、今回はC/C++の関数をSquirrelから呼び出す方法についてやります。
まず登録する関数を作成しますが、この関数は SQFUNCTION 型の関数である必要があります。
この関数は HSQUIRRELVM を引数とし、SQInteger を返す関数です。
今回はその関数としてSquirrelのヘルプにもある関数を使用します。


SQInteger print_args(HSQUIRRELVM v)
{
    SQInteger nargs = sq_gettop(v);
    for(SQInteger n=1; n<=nargs; n++){
        printf("arg %d is ", n);
        switch(sq_gettype(v, n)){
            case OT_NULL:
                printf("null\n");        
                break;
(中略)
            default:
                return sq_throwerror(v, "invalid param");
        }
    }
    printf("\n");
    sq_pushinteger(v, nargs);
    return 1;
}


この関数は渡された引数全ての型を表示するというものです。(中略)部分はヘルプを参照してください。
引数の数を調べるにはスタックトップの正のインデックスを取得すればそれがそのまま引数の数になります。
sq_gettop() 関数はVMのスタックトップの正のインデックスを取得する命令ですが、これは HSQUIRRELVM のメンバ _top を持ってくるのではなく、_stackbase と _top の差を持ってくる関数です。
つまり、SquirrelからC/C++関数が呼ばれると呼び出し位置のスタックトップがスタックベースとなり、そこから引数をスタックに突っ込んでいくことになります。
スタックに入っている値の型を調べる sq_gettype() 関数にはインデックスとして 1? の数値を与えます。
1がスタックベースです。0 を指定した場合、動作の保証はできません(必ずハングするというわけではない)。
この関数をSquirrelから呼び出すと、引数の数は指定した引数の数より1つだけ多くなるはずです。
前回も説明した通り、関数を呼び出すと暗黙的にルートテーブルが最初の引数として指定されます。
なので、この関数を呼び出すと、必ず最初の引数の型はテーブルになるはずです。
では、この関数を登録する方法を以下に示します。


void register_global_func(HSQUIRRELVM v, SQFUNCTION f, const char* fname)
{
    sq_pushroottable(v);
    sq_pushstring(v, fname, -1);
    sq_newclosure(v, f, 0);
    sq_createslot(v, -3);
    sq_pop(v, 1);
}


この関数はやはりヘルプに載っているものですが、関数を登録するだけならこの関数を使っておけば問題ありません。
まず最初にルートテーブルをプッシュします。これはほとんどお約束。
次にSquirrelから呼び出す際の関数のIDを設定します。第3引数は-1がお約束(文字列の長さを自動的に計算するため)。
次に関数を登録します。sq_newclosure() 関数で登録できますが、第3引数はよくわかりません。
とりあえず 0 で問題ないっぽいですが。
次の sq_createslot() 関数はスタックトップとその下のスタックを何らかの値とそのIDと仮定し、第3引数で指定されているスタック位置の値に新しいスロットとして作成する関数です。
つまり、新しいクロージャ f をID fname としてスタックインデックス -3、つまりルートテーブルのスロットとして作成するわけです。
最後にルートテーブルをポップします。ポップしてもルートテーブルが初期化されるわけではないので問題ありません。
関数の登録はVMの作成後、Squirrelファイルの実行前に行います。


v = sq_open(1024);
sq_pushroottable(v);
register_global_func(v, print_args, "prt");
if(SQ_SUCCEEDED(sqstd_dofile(v, _SC("test.nut"), 0, 1))){
}


この例では print_args() 関数はSquirrelファイル内で prt というIDを使って呼び出されることになります。
今回はこれにて終了。次回はもう少し高度なことをやっていきましょう。

スポンサーサイト
  1. 2006/06/27(火) 22:40:53|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

Squirrel その7

前回はC/C++プログラムからSquirrelファイルを実行する方法をやりました。
しかし、この方法ではSquirrelの標準機能を使うくらいのことしかできません。
実際にC/C++プログラム中でSquirrelを使用する場合、必要になるのは以下の機能になるでしょう。


・C/C++プログラムからSquirrelの関数等を呼び出す
・SquirrelからC/C++プログラムの関数等を呼び出す


どちらも極めて重要な代物なのですが、今回は前者の方を説明します。
しかし、それを説明する前に、Squirrelのスタックについて簡単に説明します。
LuaもSquirrelもサブルーチンからの戻り位置や変数等は全てスタックによって管理されます。
C/C++プログラム←→Squirrelの各種機能を実装するにはSquirrelのスタックの仕組みを理解する必要があります。
基本的に、変数や引数、関数のアドレスや戻り位置などそれぞれ1つにつき1つのスタックを使用します。
例えば変数を2つ定義すると2つのスタックが使用されることになります。
スタックのインデックスには positive index と negative index の2つがあり、前者は正の整数、後者は負の整数で表されます。
positive index は1?で、ベーススタックが1になります。negative index は逆に、-1?で-1がトップスタックになります。
4つのスタックを使用しているとすると、一番最初にプッシュされたスタックが positive index では+1、negative index では -4 になります。
逆に最後にプッシュされたスタックは positive index では +4 で、negative index では -1 になります。
これを踏まえて、C/C++プログラムからSquirrel関数を呼び出してみます。


まず、適当な名前の関数を Squirrel ファイル内で定義します。
今回は foo() という名前にしてあります。引数は3つ、戻り値が存在します。
関数の処理は引数の数値を表示する程度のものでいいでしょう。
Squirrelの方はそれでOKっぽいのでC/C++プログラムの方を見ていきましょう。


sq_pushroottable(v);
sq_pushstring(v, _SC("foo"), -1);


まず何はなくともルートテーブルを設定します。
基本的に、何か新しいことをする場合はとりあえずルートテーブルを設定しておきましょう。
次にSquirrelの関数名をスタックにプッシュします。第3引数は第2引数の文字列の長さを自動計算させるための設定です。


 if(SQ_SUCCEEDED(sq_get(v, -2))){
}


次に関数のポインタ(?)を取得します。
sq_get() は関数に限らず、現在スタックトップに設定されている文字列をポップし、その文字列に対応する各種のデータ等を取得し、そのアドレス(?)等をトップスタックにプッシュする命令です。
第2引数はその文字列のデータをどのスタックに設定されているものから取得するかという意味です。
この場合、-2とは "foo" での前にプッシュされたもの、つまりルートテーブルから取得する命令です。
通常、Squirrel のグローバル関数はルートテーブルのメンバとして設定されているのでこれが正しいのです。


sq_pushroottable(v);
sq_pushinteger(v, n); 
sq_pushfloat(v, f);
sq_pushstring(v, s, -1);
sq_call(v, 4, SQTrue, 0);


関数の取得に成功すると上記のプログラムが走ります。これは、引数を設定し、その上で関数を呼び出します。
まず最初にまたもやルートテーブルを設定します。これは、いかなる関数においても暗黙的な第1引数としてルートテーブルが指定されているからです。
次の3行で整数、浮動小数点数、文字列を設定しています。引数はこれでOKです。
最後の sq_call() は第2引数の数だけスタックを引数としてポップし、その状態でトップスタックに設定されている関数を実行します。
設定された引数と第2引数の数が合わないと上手くいかないでしょう。
この段階で Squirrel に記述された foo() 関数が実行されます。
実行が終了するとプログラムは次に進みます。戻り値を取得する必要があります。


if(sq_gettype(v, -1) == OT_INTEGER){
    int  ret;
    sq_getinteger(v, -1, &ret);
    sq_pop(v, 1);
    printf("ret = %d\n", ret);
}


今回の戻り値は整数型として与えられるものという仮定で進めます。なので、最初に戻り値のタイプをチェックします。
次に sq_getinteger() で、トップスタックの数値を取得しますが、この命令では元のデータをポップすることはありませんので、取得後は sq_pop() でポップしています。
これでSquirrelの関数呼び出しは完了ですが、最後に関数を実行する前のスタック状態に戻してやる必要があります。
関数呼び出しの各種処理が行われる前に sq_gettop() 命令でそのときのスタック数を保存しておき、関数呼び出しが終わったところで保存しておいたスタック数を sq_settop() にて設定すればOKです。
もしもどこかにポップされていない命令等があったとしてもこうすれば元の状態に戻すことができます。
スタックの状態さえ理解できていれば難しいことは何もないと思います。


というわけで今回は終了。
次回は逆に Squirrel からC/C++プログラム内の関数を呼び出す方法をやります。

  1. 2006/06/23(金) 03:18:56|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

ワールドカップの話

何試合か見たのでワールドカップの話。


まずは後半7分辺りから見たアルゼンチン×セルビア・モンテネグロ戦。
この段階で3-0で、セルモンはすでにやる気がほとんどない状態。
セルモンの売りは強烈なプレスディフェンスなのに、まったくプレスしてない。
マンツーマンなのかゾーンなのかも良くわからない微妙な守備だったので、まだ点が入るなと思ってたら案の定。
5点目が入った時点でセルモンがかわいそうになってきた。まさに虐殺。
しかし、アルゼンチンは強いな。さすが優勝候補。


次はフルで見たオランダ×コートジボワール戦。
この試合は酷いものだった。何が酷いって、オランダが酷すぎる。
ヨハン・クライフの有名な言葉に、「美しく負けることを恥じるな。無様に勝つことを恥と思え」というものがありますが、まさにこの言葉を送りたい。
前半から完全に押されていて、パスはまったく繋がらず、中盤はまったく機能しない。
困るとすぐにロングパスして取られて攻められる、の連続。あれがオランダのサッカーか?
あと、ラフプレーが酷すぎる。まったく役に立ってないファンボメルがかなり危ないプレーばっか。
コクもダメ、スナイデルもダメ。後半出てきたファンデルファールトが幾分ましくらい。
しかもファールトが出てきてからニステルロイが交代。ランザートに代えて守備を固めるってアホかよ!
サッカーの美学なんて欠片もない。ファンバステンは何を考えているのか!?
決勝トーナメントでもこんな試合をするようなら応援しないぞ。


イラン×ポルトガル戦も微妙。
クリスチアーノ・ロナウドって騒がれるほどすごくないような。
フェイントがただ踊ってるようにしか見えないし、速さも微妙。
対してデコは全体的にすばらしかった。いい選手だ。
全体的にポルトガルは個人技に走りすぎてる感じ。フィーゴはもう歳だし。
まあ、決勝トーナメントに行けたんだから良かったけど。


日本×クロアチア戦はどっちも決定力不足でつまらない試合。
それでも日本は攻めてたけど。やっぱりFWがねぇ…。
高原は遅いし走れてない。前半からずっとそんな感じ。
柳沢はあんな決定的な場面でミスってくれるし。何やってんだか。
大黒は出てくるのが遅い。玉田もミスキックしてるし…パスかと思ったよ。
後半、どちらもバテバテ。最後まで走ってたのは三都主だけか。
川口はよくPKを止めた。それだけでも神。
中田のミドルシュートは良かったけど、それ以外は微妙。
中村は酷いもんだ。ボールを止めてから考えるな。
DFも全体的にボールを奪うのが遅い。シュート撃たれてからじゃ遅いよ。
次のワールドカップは期待できそうにないしなぁ…。


個人的に今までで一番面白かったのはガーナ×チェコ戦。まさに大どんでん返し。
FIFAランキング2位のチェコがまさかの敗戦。
この試合、全体的にオランダ×コートジボワール戦に似てた。
チェコはパスが繋がらず、あまり攻めることが出来てない。
対してガーナは高い身体能力と技術を生かして再三再四チェコゴールを脅かす。
オランダ戦と違うのはラフプレーが少なかったことくらいか。
つまり、ラフプレーがファール取られまくったらオランダは負けてた可能性が高いわけで。
それはともかく、面白かったのはガーナの各種プレー。
もう勝ちが決まったような状況でも積極的にイエローを貰いに行くところとか、シュートをキーパーの真正面にしか撃たないところとか。
何より楽しかったのはGK1に対してFW3という状況で、撃てばいいのにパス出すところ。もちろんオフサイド取られた。
他にもオフサイド取られまくり。そりゃ取られるに決まってるという状況が多く、彼らはオフサイドというルールを知らないのではないかと思うくらい。
ガーナはセットプレイがちょっと雑。この辺はチェコのほうが上手い。
でもまったく疲れない。しかも速い。日本の試合と比較するとビックリするくらい。
ガーナにはこのまま頑張って欲しい。次のアメリカ戦に勝てば決勝トーナメント進出だ。

  1. 2006/06/19(月) 00:48:36|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0

Squirrel その6

すっかり遅くなった Squirrel の話。
今回から数回に分けて組み込みの話をしていきます。
組み込む言語はC/C++を利用します。JAVAやC#に組み込む場合はソースを弄ってくださいね。


まず、プロジェクトのリンクライブラリに以下の2つを追加します。


squirrel.lib
sqstdlib.lib


DLしたソースをコンパイルすれば作成されます。
ヘッダファイルは必要なものをインクルードしますが、とりあえず以下のファイルはインクルードしてください。


squirrel.h
sqstdio.h
sqstdaux.h


今回は無難に main() 関数を使用します。適当にメイン関数を作りましょう。
Squirrel は直接実行するのではなく、仮想マシンを作成してその上で実行することになります。
仮想マシンとはCPUなどを積んだ実際のハードウェアではなく、ソフトウェア的に作成された計算機のことを言います。
組み込み系言語は基本的に仮想マシンを利用します。Virtual Machine の頭文字をとって VM と呼ばれることも多いですね。


HSQUIRRELVM v;
v = sq_open(1024);


HSQUIRRELVM が Squirrel の VM です。
sq_open() 関数で VM を初期化します。引数は初期スタックサイズです。
通常、スタックサイズは足りなくなれば自動的に増やされます。
ただ、コンシューマゲームなどメモリに制限がある環境では自動的に増やされても困るので、メモリ管理をユーザがするための設定もあるようですが、ここでは割愛します。
このようにして初期化した VM は不要になったら解放しなければなりません。


sq_close(v);


不要になったらこれでOKです。
では、初期化した仮想マシンで Squirrel 形式のファイルを実行してみましょう。
Squirrel ファイルとして、以下の行が書かれた test.nut というファイル名のファイルを用意します。


print("Call OK!");


上手くいけば Call OK! という文字列が出力されるわけです。
では、C/C++の方を見ていきましょう。


sqstd_seterrorhandlers(v);
sq_setprintfunc(v, printfunc);

sq_pushroottable(v);
if(SQ_SUCCEEDED(sqstd_dofile(v, _SC("test.nut"), 0, 1))){
    printf("Call Failed!");
}


1行ずつ見ていきましょう。
最初の sqstd_seterrorhandlers() 関数は標準のエラーハンドラを仮想マシンに設定する命令です。
標準のものを使いたくない場合は自分自身で用意することが可能です。
2行目の sq_setprintfunc() は仮想マシンに自作の出力関数をセットする命令です。
こちらも標準の print 命令が存在しているのでそちらを使ってもOKですが、それ以外の出力をしたい場合はこの関数で設定します。
なお、ここで設定している printfunc() 関数は以下のようになります。


void printfunc(HSQUIRRELVM v, const SQChar* s, ...)
{
    va_list arglist;
    va_start(arglist, s);
    vprintf(s, arglist);
    va_end(arglist);
}


この形式の関数なら何でも設定可能です。それこそ、出力命令である必要もなかったりします。
3行目の sq_pushroottable() 関数はルートテーブルを仮想マシンのスタックにプッシュします。
言語仕様の部分でも書いたように、Squirrel には暗黙的なルートテーブルが存在しています。
この命令はそのルートテーブルを設定する命令で、ことあるごとに実行する必要があったりします。それはまたのちほど。
4行目の sqstd_dofile() 関数でファイルの読み込み、及び実行を行います。SQ_SUCCEEDED は関数が正常終了したかどうかをチェックします。
この関数の第1引数は仮想マシン、第2引数は実行するファイル名です。
第3引数は True なら Squirrel ファイルからの戻り値をスタックにプッシュします。
第4引数は True ならエラーが起こった場合にエラーハンドラを呼び出します。
ファイルを実行するだけならこれでOKです。極めて簡単です。
もちろんこれだけではなく、Squirrel ファイル内の関数を呼び出したり、逆に C/C++ の関数を Squirrel から呼び出したりすることができます。
次回はその辺をやっていきたいと思います。

  1. 2006/06/16(金) 21:58:26|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

PS3はもういい

流行なのでワールドカップの話題から。
オランダファンとしてはセルビア・モンテネグロ戦で勝ってくれたのは嬉しい。
ただ問題がないわけではない。
ロッベンは良かったけど、ロッベン頼みの試合に見えました。
ニステルロイは調子が悪かったし、スナイデル、コクも良くなかった。
後者二人は怪我の問題かも。ニステルロイはマークが厳しいというだけではないと思う。
ファンデル・ファールトがいないのも大きいかもしれない。
ペルシーはもっと積極的に使っていくべきではないかと思う。決定的な力はないけど、悪くはないし。
それでも前半は良かった。パスは繋がってたし、攻撃も激しかったし。
後半が悪かった。パスミスが多くなって、攻撃が単調になってしまってた。
ラスト15分はファンバステンが出て来てもよかったんじゃないかな。40とは思えない体つきだった。
まあそれでも期待してる。頑張ってほしい。


ここ2週間くらい、SCEの偉い人のインタビューをよく見かけた。
よくわかったのは、SCE、少なくともその偉い人はゲーム業界などどうでもいいと考えているということだ。
重要なのはCELLとBDが標準規格になることで、その結果ゲーム業界が成り立たなくなっても知ったことではないと思っている。
面と向かって聞けば彼らはそれを否定するだろうが、とてもゲーム業界の発展を考えているとは思えない発言が目立っている。
SCEIのある幹部は、ゲームがなくてもPS3は500万台売れる、とのたまったという話もあり、ゲーム業界をどうとも思っていないのはまず確実だろう。
SCEの求める方向性はMSの方向性と確かに似ている。
SCEは規格面で業界標準になりたいと考え、MSはOS面で業界標準になりたいと考えている。
違いは、ハード面かソフト面か、という点だ。
SCEはPS3が如何に作りにくくても、難しい方がやってやるって思うでしょ、などと言ってはばからない。
難しいほどやりがいを見出す人は確かにいるが、業界全てがそういう人で埋まっているわけではない。
何より、企業だってやりがいだけでは生きていけない。利益を出さなければやりがいがあろうがなかろうが失敗だ。
MSもやっていることは似ている。ただし、こちらはハード面である。WindowsVistaに対する対応に各ハードメーカは四苦八苦しているようだ。
もちろんそれはそれでどうかとは思うのですが、やはり私はソフト屋さんなのでMSのアプローチの方を支持する。
少なくとも、PS3では次世代体験ばかりを宣伝しているが、それで今まで以上の利益を出せるかというと、それは無理だと思う。
MSは、上手くいっているいってないはさておき、開発費が安いソフトでもそれなりに利益が出せるような仕組みを模索している。
任天堂はそもそも方向性を変えることで顧客の幅を増やそうとしている。
PS3だけがソフトの利益を上げるための工夫をしていない。少なくともそれらしい話は聞かない。
一般ユーザはゲームがなくても生きていけるだろうが、この業界で食ってる人間としては死活問題だ。
その死活問題に対するSCEなりの解答はいまだに見えてこない。解決策を模索しているようにも見えない。
どのような結果になるかは今のところなんとも言えないが、個人的にはPS3には退場願いたいものだ。

  1. 2006/06/15(木) 21:40:06|
  2. ゲーム
  3. | トラックバック:0
  4. | コメント:0

最近遊んでるゲーム

最近遊んでるゲームは以下の4本。


NEWスーパーマリオ
メトロイドプライム ハンターズ
東方サッカー
メガマリ


DSと同人ゲーム。DSの2本はクリア済みです。

『NEWスーパーマリオ』は批判もされていますが、良作だと思います。
過去のシリーズをやりこんだ人にとっては不満点もあるかと思いますが、慣れれば問題ないレベルだと思います。
レベルエディットが非常に良く出来ていて、先に進んでいくといろいろと驚かされます。
難易度はゲーマーにはぬるく、非ゲーマーにはちょっと高めかと思いますが、頑張れば十分クリアできるレベルだと思います。
個人的な不満は、ラスボスに驚きがないことと空が飛べないことくらいか。
難易度は高いほうがやりがいがあることは事実ですが、その辺は仕方ないですね。

『メトロイドプライム ハンターズ』はDSでは珍しいFPS。
GCの『メトロイドプライム』シリーズの続編なので、基本はこのシリーズと同じのようです。
1人プレイのアドベンチャーモードは積極的にスキャンしていかないとストーリーがほとんどわからないので、日本人にはあんまり向かないかもしれません。
しかし、探索しているという感じが良く出ていて、操作に慣れてしまえば楽しくなると思います。
難点はマップが見難いところでしょうか。画面が小さいので仕方ないかもしれませんが。
Wi-Fi対戦も非常に面白いです。結構はまってます。
Wi-Fiでもんしょを見かけたら少しばかり手加減して欲しいかも。

『東方サッカー』は東方プロジェクトの二次創作で、FCの『キャプテン翼』シリーズのシステムを使っています。
システム面はかなりオリジナルに近いと感じました。基本的にワンツーで抜けていくところとか。
シナリオは二次創作設定が多いので、そちらが嫌いな人にはオススメできません。
しかし、一番の問題はやはりバグの多さでしょう。
最近出たパッチでかなり改善されていますが、ハングバグも多いし初期状態では致命的なバグを抱えすぎ。
通してプレイすれば必ずわかるバグもあったりするし、商品とするにはちょっとという状態。
まあ、同人だし、パッチで何とかなるからいいという考えなのでしょうが、それでももうちょっと何とかすべきだと思います。

『メガマリ』も東方プロジェクトの二次創作。システムは『ロックマン』ですが、上手く東方アレンジしていると思います。
難易度は非常に高く、2Dアクションが苦手ならまずクリアは不可能でしょう。
私もまだクリアしてませんが、それでもラストまでは進んでいます。まあ、ここからが長いんですけど。
このゲームはとにかくよく出来ている。東方としてもロックマンとしても。
最初は、無理!とか思ってたステージがパターン化すればクリア可能になる点もロックマンっぽいし。
バグもあるらしいのですが、現在のところ私はバグに出会ってません。
とにかくよく出来ているので、歯ごたえのある2Dアクションを望んでいる人は遊んでみてはいかがでしょうか。

  1. 2006/06/11(日) 00:30:16|
  2. ゲーム
  3. | トラックバック:0
  4. | コメント:0

フロントミッション4

面白いゲームが売れないはずがない、なんて一部のユーザ以外は信じてないと思いますが、いまだにそんな意見を見かけます。
現実はそんなわけなく、面白い=売れる、ではない。
我々としても面白いゲームを作りたいところですが、結局、面白いことは二の次で売れることが大前提になる。
結果、続編が基本になる。どれくらい売れるか予想がつきやすいからね。
まあ、どんなに批判されようとも、FF12は200万本売れてる、ってのが事実だしね。


ソフマップに行った際に安かったからという理由で買ってきた『フロントミッション4』のレビューでも。
評価はあまり高くないようですが、これでは高くなくても仕方ないかな。
まずストーリーに問題がある。FF12みたいに盛り上がりも意外性もないまま終わります。
陰謀物であるのですが、かなり早いうちから敵の陰謀の全貌がわかってしまいます。
気付かないのは頭の固い各国首脳のみ。っていうか、おまえらの諜報機関は役立たずかと突っ込みたくなるくらい。
早いうちに陰謀がわかってしまうため、目的は証拠集めという名の戦闘のみになって、キャラクタ性を掘り下げるようなストーリーの流れもほとんどありません。
また、主人公が二人いるのですが、彼らが直接会って一緒に戦う場面はありません。
一応無線でのやり取りは行われますが、後半になって少しだけです。
同じ陰謀を別の地域で打ち破ろうとしているだけ。別の角度、というわけでもないので面白味に欠ける。
今までのシリーズと違い、出せるキャラの数が決まっているから使わないやつが出てくる、ということはないのですが、先にも言ったようにキャラクタ性が掘り下げられていないので愛着がわきません。
キャラの名前も既に忘れました。その程度の印象しかありません。


ゲームとしてはやはり前半の方が難しいです。クライマックス近くになるとそれなりに簡単になりますが、前半は難しいし、何より時間がかかる。
個人的に気に入らないのはリペアバックパックで耐久度の回復ができること。
アイテムのように数に限りがあるのならいいのですが、回数に限りがありません。
回復しながら攻略するのが前提でバランスが取られているため、全体的に時間がかかるようになっているのではないかと思います。
また、ユニットの移動とミサイルの飛翔は○ボタン押しっぱなしで高速化できるのですが、常に○ボタンを押しっぱなしにしないといけないのがウザイ。
そんなことならオプションで高速を選べるようにすればいいのに、何でしないんだろう?伝統だから?
ちなみに、○ボタンを押さない場合の速度は耐えられないくらいに遅いです。
戦闘もぶっちゃけ遅いです。これも1マップに時間がかかる理由の一つです。
一応戦闘アニメは×ボタンでスキップ可能です。っていうか、UIに統一感がないのですが。
この×ボタンスキップも問題で、どの程度のダメージを受けたかが表示されません。また、パーツが破壊されたかもわかりません。
適当にスキップしまくってると気づいた時には死んでた、ということになりかねないでしょう。
あと、攻撃の完全回避がウザすぎる。命中率99%(これが最高)の攻撃2つを含む5回の攻撃がすべて回避された時はコントローラ投げそうになった。


グラフィックは綺麗ではありますが、ヴァンツァーのデザインがどうにも気に入りません。
同じ組み立てロボット系の『アーマードコア』シリーズと比べると、パーツの特徴が微妙すぎてわかりにくいのです。
面白味のある隠し武器も少ないし、飛びぬけたものがなくてつまらないです。
バランスが取れている、といえば確かにそうかもしれませんがねぇ…。


全体的に盛り上がらず、これといった特徴も薄いゲームと言うのが私の意見です。
クリアしてもあんまり嬉しくなかったし。

  1. 2006/06/01(木) 21:25:09|
  2. ゲーム
  3. | トラックバック:0
  4. | コメント:0

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する