プチメタ3.0

刺激を受けた物事に対する感想や考察、資産運用や英語学習、自己成長に関することなど。


2D格闘ゲーム時代、「ストリートファイター2」の地面表現に感銘を受けた


1991年にゲームセンターに「ストリートファイター2」が登場し、
対戦格闘ゲームの大流行を巻き起こしたが、
当時の私が画面を見て衝撃を受けたのが
しっかりとした奥行きを感じるこの地面だ。


今なら3D表示処理で簡単に実現できるが、
当時はスーパーファミコンが発売されたばかりという
2Dゲーム全盛期の時代だ。この地面には本当に驚いた。




地面を単に一点透視法で描いただけでは
画面がスクロールしたときにも線が斜めになったままなので
いかにも平面画像を移動させただけという結果になり、
ここまで綺麗な立体感は出ない。


もちろんスト2内部のプログラムは見たことがないのだが、
おそらくこのように実現しているのだろう、という推測をしてみた。

2D表示で地面を立体的に表現する理屈


まず地面の画像を用意する。
上の方がステージの奥になるので
徐々に暗くなるように着色しておく。




この地面画像はそのまま丸ごと表示するのではなく、
横1行ずつに切り分けて表示する。
たとえば800×200のサイズなら
幅800ピクセルの画像を1行ずつ200回表示する。




その際、各行を横方向にだけ縮小する。
そして画面の上方向ほど縮小率を上げて
ステージの奥に行くほど小さく表示されるようにする。


これならただの画像の縮小処理なので
2D表示しかできないハードウェアでも可能だ。




縮小した分、画面の横幅に対して画像が足りなくなるので
同じ行の画像をループ表示させる形で補填する。




各行の表示位置を左右にズラす
(正確には元画像の取得位置をズラす)ことで
まっすぐ奥を見たまま
地面が左右に移動しているように見せられる。




実際に2D表示処理だけを使って
地面と奥の壁を表現するプログラムを自分で再現してみた。
使っている画像の違いはあるが、
おそらくこの理屈で正しいのではないかと思う。


処理の仕方は以前紹介したラスタースクロールとほぼ同じで、
2D表示しかできなかった時代に
いろいろなクリエイターが工夫した様子が感じ取れる。



mclover.hateblo.jp

mclover.hateblo.jp

いろいろな実験プログラムを流用したスタッフロールを動画にまとめてみた


受け持っているプログラミング授業の勉強を兼ねて
これまでいろいろなソフトを作ってきたが、
スタッフロール(クレジット)は
ゲーム本編とは違う世界観が入っても支障がないため、
作り溜めた実験プログラムを活用した思い出がある。


通常はゲームをクリアするか、
ある程度の成績に達しないと閲覧できないのだが、
すでに公開から20年近く経ったこともあり、
スタッフロール部分だけをまとめてみた。

喰人王

画面内のピクセルを少しずつ上に移動しつつ
色を白→黄→赤→黒と変化させていくことで
炎が燃えているように見せる実験プログラム。


画面に白いものを描けばなんでも燃えるようになっている。
文字としては読みにくいが、スタッフロールなら問題ない。
処理が重いので、ここだけ解像度を下げている。

フロントライン

押井守監督の「アヴァロン」というSF映画を見たときに
表示内容が奥に移動していく画面表現が出てきて
自分で再現したくなったプログラム。


数ピクセルおきに黒いラインを表示することで
レトロなディスプレイをイメージさせつつ、
表示した内容を1枚の画像にしたあと
縮小しつつ暗くして奥に移動したように見せている。

バーガーメーカー

指定した頂点を揺らしつつ直線で結ぶことで
線画がユラユラしているように見せるプログラム。


もともと「ウゴウゴルーガ」というテレビ番組で
何枚かの手書き文字を切り替えて見せる表現があり、
それにヒントを得て作ってみたもの。
これを誰にでも触れるようにしたのが
のちに公開した「ウゴツール」である。

ネイビーミッション

文字を3Dモデル化する処理を見つけたので
これでスタッフロールを作ったら面白いかも、と考えて
FPSっぽいゲーム性をトッピングしてみた。


入力した文字列を1文字ずつ分離してモデル化し、
それぞれの中心位置を調整したり
爆風範囲の文字は着弾位置に合わせてズレるようにしたりと
意外と手間がかかる造りをしている。

XOR演算を使った暗号化の仕組み


保存したデータを特定の人にしか見せたくない場合は
「暗号化」する必要がある。


インターネット上で扱う個人情報ももちろんだが、
ゲームに同梱されたデータがユーザーに読まれたり改ざんされると
楽しんでプレイする機会を奪うことになるので
暗号化しておくに越したことはない。


また、暗号化したものは元に戻せる(複合化)必要があるので
パスワードの管理で利用する「ハッシュ化」とは少し異なり、
可逆変換になっていなければならない。


暗号化については数学的な理屈も絡むので奥が深いが、
個人で自作できるレベルの簡単な理屈を紹介してみる。

文字は番号で管理されている

文字をデータとして管理するため、
文字にはそれぞれ番号が割り振られている。
これを「文字コード」と呼ぶ。


たとえば「A」の文字コードは65、
「B」の文字コードは66に定められている。
数字を表す文字にも文字コードがあり、「1」の文字コードは49だ。



今回は説明の都合上、
実際の文字コードとは異なるもので説明していく。

文字コードをズラす暗号方式

一番単純な暗号化は文字コードをズラす方式だ。
足し算と引き算は可逆演算なので、
例えばデータを構成する文字コードに適当な数を加算するのだ。



仮にそれぞれを1ずつ加算した場合、
「WORLD」という言葉は「XPSME」と変換される。
これでデータが暗号化されたわけだ。


逆に「XPSME」の文字コードを1ずつ減らせば元の単語に戻る。
どれだけズラしたかがわかれば複合できるので
「ズラした量」が暗号化キーとなる。
暗号化キーはなんらかの手段で相手に伝えたり
データファイルに埋め込んだりする。


昔作ったタイピングゲーム「喰人王」の出題文は
この方法で簡潔に暗号化してある。

2進数

1→2→3 …… 9→ 10 → 11 …… 19 → 20 → 21 …… 98 → 99 → 100 ……


普段、我々が使用している数字は
ひとつの桁を0~9の10種類で表現し、
10ごとに桁が上がるので10進数と呼ばれる。


コンピューターの場合は微妙な電圧を表現するのが困難なので
「電流が流れている」「電流が流れていない」の
2種類の状態だけで判別できるよう2進数が使われている。



0→1→ 10 → 11 → 100 → 101 → 110 → 111 → 1000 → 1001 ……


つまり、ひとつの桁(ビット)を0と1の2種類で表現し、
2ごとに桁が上がるわけだ。
コンピューターが「0と1の世界」と表現される所以である。


人間の手には2種類の状態を表せる指が5本あるので
2進数なら片手で31まで数えることができる。

論理演算

この2進数を使って行う計算が論理演算(ビット演算)だ。
ここでは2つの値に対して1つの結果を出すものを紹介する。



0 AND 0=0
0 AND 1=0
1 AND 0=0
1 AND 1=1


AND(論理積)演算は
2つの値がともに1であるときだけ1になる。



1111 AND 0010=0010
0011 AND 1100=0000
1001 AND 1100=1000


演算は桁ごとに個々に行われるため、
複数の桁を持つ値同士でも同様に計算できる。



0 OR 0=0
0 OR 1=1
1 OR 0=1
1 OR 1=1
1111 OR 0010=1111
0011 OR 1100=1111
1001 OR 1100=1101


OR(論理和)演算は
2つの値のどちらかさえ1なら1になる。



0 XOR 0=0
0 XOR 1=1
1 XOR 0=1
1 XOR 1=0
1111 XOR 0010=1101
0011 XOR 1100=1111
1001 XOR 1100=0101


XOR(排他的論理和)演算は少し変わっていて
2つの値が異なる内容の場合のみ1になる。

XORを使った暗号方式


前述した文字コードは単なる数値なので
それぞれ2進数でも表現できる。


そこで暗号化したいデータを2進数で表現し、
同じく2進数で表現した暗号キーとXOR演算を行う。



「WORLD」と「CANDY」をXOR演算すると「UOcIb」という結果になる。
「CANDY」という暗号化キーを使って「WORLD」を暗号化したわけだ。


面白いのは複合化の作業だ。
文字コードをズラす方式では暗号化するために加算した数字を
逆に減算することで複合化していたが、
XORを使った暗号化は再度同じ作業をするだけで元に戻る。




暗号化されたデータ「UOcIb」と「CANDY」をXOR演算すると
元のデータである「WORLD」になるのだ。


つまり「A XOR B=C」となる場合、「C XOR B=A」が成立する。
入力データが変わるだけなので、暗号化も複合化も
同一のプログラムで行えるというわけだ。

まとめ

暗号化のアルゴリズムはそれだけで学問になるほど奥が深く、
とにかく強固な暗号をかけたいなら
すでに洗練された既存の暗号化ライブラリを使う方が安全だ。


ただ、何かの理由で自作したいとか
どういう原理なのかを知っておきたいなら
上記のような理屈を理解しておくのも悪くないだろう。

不完全な作品でもどんどん作る方が学びが進む






―――「薔薇はシュラバで生まれる」より  


どんな創作物にも言えることだが、
質の高いものが作れないからとチャレンジしない人より
不出来なものでもどんどん生み出して
他人に目に触れさせる人の方が遥かに成長が早く、
実際にクオリティも上がっていく。


クリエイターにとって物を作るときの経験値が一番大きいし、
他人の評価や感想を受けるのは
自分の感覚を修正する貴重な機会だからだ。


プライドを捨ててがむしゃらに作り、
恥を忍んで人目に触れさせてこそ一流のクリエイターになる。



mclover.hateblo.jp

mclover.hateblo.jp

reblog.hateblo.jp

総アクセス数