あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

後日談

GBAは知らないといけないことが多いです。


というのもBG、スプライトの画像ファイルは別々。
変換後のフォーマットも知っていないといけないからです。


他にもOAM(拡大縮小表示など)、キー入力(ビット配列)、SRAM、乱数。
乱数は以下のような関数を作らないと、毎回電源ONで同じ値になってしまいますし。

IWRAM_CODE void ScoreInitRnd(void)
{
	SramSeek(0x10);
	u32 r = SramRead32();

	if(r != 0)
	{
		RndInitSeed(r);
	}

	SramSeek(0x10);
	SramWrite32(Rnd32());
}

画面単位のフレームカウンター、キー入力などのプレイヤーが不規則に動かした分の値を
加えて、事前に用意したテーブルと混ぜ混ぜする方式もあるようです。


といっても、コードの間に異物を入れるようなもので、結局は
・(上記の関数のように)ゲーム開始時に更新する
・ゲーム終了時、スコア書き込みタイミングで更新する


というのがスッキリしていいように思います。
CEDECの講演ではとても興味深い発表がありました。
http://www.4gamer.net/games/042/G004287/20140905040/
ROM参照法はかなり痺れました。考えもしなかったです。



そういえばメルセンヌ・ツイスタのサイトを久しぶりに見たら
TinyMTの最新版(ver1.1 2015/4/25)が公開されています。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index-jp.html

TinyMT はMersenne TwisterやWELL RNGと比べて小さな疑似乱数生成器です。
32bit 出力の tinymt32 は内部状態空間に16バイト、パラメータに12バイトしか使いません。

実はarduboyのtiny depthにも使われているのですけれど、その時、
敵弾が均等にまんべんなく攻撃してきてゲームになりゃしない(汗)という
事態が発生しました。嬉しいやら悲しいやらです。
結局、自機弾の最大数を4から5にして弾幕を厚くして対応しました(^^;。