うえぽんSW局

古いタイプの日記ブログです。気まぐれに更新してます。

2010年05月

アゼル_パケ


 サターンユーザーならプレイ必須作品ですが、恥ずかしいことに先日やっとプレイしてクリアしました。
 点数をつけるなら10点満点中10点です。
 シェンムーと同じ3D空間上のキャラクターを背後からのカメラ視点で操作するタイプのRPGですが、カメラワークやカット割り、モーションなどはハードが2世代進んだ現在のゲームと変わりありません(最近のゲームをやらないので知らないだけかもしれないが)。ハードの性能によるところ以外は今でも遜色ないと思います。カメラワークはガンダムやマクロスで見たことあるようなのもあるので30年前から基本は変わっていないのかもしれませんが。
 一番気に入ったのは戦闘システム。元がシューティングゲームだけあり位置取りバトルはシューティングゲームっぽいです。ダメージを喰らう間もなく敵を速攻で倒してExcellent評価を狙うも良し(全ての敵で狙えるらしい)、敵の必殺技みたいな攻撃をわざと喰らって演出するも良しです。

 この名作をなぜ当時プレイしなかったのか言い訳を考えてみると、たぶん他にも注目タイトルが多かったからだと思います。ざっと同時期の注目タイトルを挙げてみると結構あったりします。

1997年
10月30日 カルドセプト
11月13日 デビルサマナー ソウルハッカーズ
11月20日 Jリーグ プロサッカーチームをつくろう!2
12月04日 この世の果てで恋を唄う少女YU-NO
12月11日 プリンセスクラウン
12月11日 シャイニング・フォースIIIシナリオ1
12月18日 グランディア

1998年
1月22日 センチメンタルグラフティ
1月22日 サウンドノベル 街
1月29日 AZEL -パンツァードラグーン RPG-
1月29日 仙窟活龍大戦カオスシード
2月19日 プロ野球チームもつくろう!
2月26日 バーニングレンジャー

参考:セガサターンのゲームタイトル一覧 - Wikipedia


 おそらくこのときがセガサターンの全盛期。1998年の年末にはドリームキャストが発売されますが、まだセガサターンで頑張れた気がします。


 以下ネタバレ含みます。
続きを読む
このエントリーをはてなブックマークに追加

時空探偵DD_パケ


 積んでいるセガサターンソフトを少しずつ消化していますが、「時空探偵DD 幻のローレライ」をだいぶ前に2回クリアしました。
 他のレビューサイトでも言われていますが、一言でいうとクソゲーです。オープニングが長く、それだけでディスク1が終わります(一応エンディングもディスク1にあります)。ディスク2へ進むまでにプレイヤーが操作したのはタイトルでスタートボタンを押しただけ。ディスクを交換してくださいというメッセージを見たときのガッカリ感ときたら…。
 そしてパッケージの絵にチャイナ服や古城、魔方陣がありますが、本編を進めてもそれらは出てこずクリア。パッケージから色々想像しているとガッカリさせられます(きっとパケ絵で売れるように工夫したんでしょうね)。
 それでも全ての要素を見てみたかったので2回クリアしました。

 さて、このゲームのヒントの出し方で気になることがあったので書いておきます。
 このゲームには「ヒント」というコマンドがあるのですが、このコマンドは「ヒントを教えてくれるアイテム」を取らないと有効になりません。ヒントを安易に見られないようにしておくのは良いのですが、この「ヒントを教えてくれるアイテム」を見つけるのがゲーム本編をクリアするよりも難しかったりします。クリアしたものの「ヒントを教えてくれるアイテム」はゲットできなかったという人もいるようです。自分もゲットできなかったので確認のために2回プレイとなりました。
 普通ヒントというのはクリアできない人のためにあるものです。それなのにクリアより難易度が高いのは本末転倒な気がします。
 とは言え2回クリアして気づきました。アイテムを取れなかった場合はより一層のヒントを与えるようにしてありました。1回目クリア時はアイテムを取らなかったのですが、なんと主人公がヒントをつぶやきだします(ボイス付き)。ちゃんと救済策を考えてあったんですね。ただ一歩歩くごとに同じ内容のヒントをボイス付きでつぶやくのはどうかなと思います。

 さてさて、このゲームのハイライトシーンを挙げると、声が丹下桜のキャラがシャワーしてるのを覗くところです。しかも「実は女だったのか!」というシチュエーション。でもCGが…。

 ちなみに、続編はPSのみで出ていて普通の出来栄えだそうです。







【余談】
 オープニングのワンシーンをアニgifにしてみました。
 時空探偵DD_OPより
 これは笑わせるためにこんな動きをさせているのか、それとも技術不足でこうなっちゃったのか分かりません。どちらにしても素直に笑って良いのか困ります。
このエントリーをはてなブックマークに追加

 AviUtlの色変換プラグインを作ってみました。名前は rgb2yuy2(BT.601) で、SSE2必須です。

 いつもの置き場所

 「補間なしYUY2アップサンプリング」と「UVダウンサンプリング(のYUY2平均)」を統合したようなもので、RGB → YUY2 を重視したつもりです。
 Aviutl標準の BT.601 と同じように使えますが、Aviutl標準はYUY2出力時に小数点以下切捨ての傾向があるようなので、それに対して四捨五入としてみました。
 あと、頑張ってSSE2化(prefetch*やmovnt*も使ってる)してますが、標準より遅いです……。


 以下、薀蓄です。
 rgb2yuy2(BT.601)では、RGBからAviUtlの内部変数YC48への計算式はこんな感じにしています。
 この +2048 が薀蓄の結論です。

y = ( 19666*R + 38595*G + 7532*B + 2048) >> 12;
cb = (-11105*R - 21792*G + 32897*B + 2048) >> 12;
cr = ( 32897*R - 27525*G - 5372*B + 2048) >> 12;


 2の累乗の除算を右シフトに置き換えるのはよくあることで、今やというか大昔からコンパイラーがやってくれます。実はこのシフト命令への置き換えには細かい注意点があるのですが、意外と忘れがちです。特にMMXやSSE2を使うにあたっては、整数の除算命令がなく、自前で右シフトに置き換える必要があり、その際に細かいミスを犯している可能性があります。

 とりあえず思い浮かんだ注意点は3つ。
 (1) 右シフトには算術右シフトと論理右シフトがある
 (2) -1 をいくら算術右シフトしても -1 のまま
 (3) -5 / 2 は -2 だが、-5 >> 1 は -3

 算術右シフトは空いたビットを符号ビットで埋めますが、論理右シフトはゼロで埋めていきます。C言語で普通にシフトすると、符号付整数(signed)のシフトは算術シフト、符号なし整数(unsigned)のシフトなら論理シフトとなる場合が多いです(※処理系よって違うことあり)。

 (2)と(3)は小数点以下の丸め方が違うために起こります。除算の丸め方向は処理系依存ではありますが、gcc4.4.4(x86)では切り捨てですので、以下除算は切捨てするものとして書きます。
 この解決方法ですが、コンパイラーは次のように置き換えて問題を解決しているようです。

※ a / 4096 を右シフトで計算する場合(aはint型)

a が正数 → a >> 12 とそのまま計算

a が負数 → (a + 4095) >> 12 として計算


 注目は被除数が負数のときで、(除数 - 1)を加算してからシフトします。
 条件分岐があると速度が落ちてしまいそうですが、コンパイラーはちゃんとcmov命令を使うなどして機械語レベルで分岐をなくしています。
 SSE2ではpcmp*系の命令でビットマスクを作成して分岐なしにできますが、今回はそこまで正確にやらず、小数点以下の丸めを四捨五入にすることで近似しました。

 まず四捨五入について説明します。一見、除数/2 を加算してから除算すれば良いように思えますが、これも正負でやり方が変わります。

※ a / 4096 を四捨五入丸めで計算する場合(aはint型)

a が正数 → (a + 2048) / 4096 と計算

b が負数 → (a - 2048) / 4096 と計算


 被除数の正負によって加算する値の正負が変わります。(本題とずれる細かい注意点になりますが、+2048や-2048するときにオーバーフローやアンダーフローする場合もあるのでこれも注意)

 で、この四捨五入と右シフトを組み合わせます。

※ a / 4096 を四捨五入丸めで右シフトで計算する場合(aはint型)

a が正数 → (a + 2048) >> 12 と計算

b が負数 → (a - 2048 + 4095) >> 12 すなわち (a + 2047) >> 12 と計算


 計算式が正と負でだいたい同じになりました。
 2048 と 2047の違いなら画像処理においては誤差として扱うことができます。誤差があるといっても何も考えずにシフトするより精度は高いはずです。


 以上のことから一番最初にあげた色変換の計算で +2048 しているわけです。「なんで +2048 したんだろう」と後で忘れるかもしれないので書いてみました。
 ちなみに切り上げ・切捨てをランダムにすると多分ディザリングっぽくなると思う。
このエントリーをはてなブックマークに追加

↑このページのトップヘ