【概要】
このツールはNES対応のスプライトや背景、パレットなどを出力するためのツールです。
某ツールが使いづらいと思い、普段使っているEDGEと連携できたら楽だなと思い作りました。
【機能】
- PNG形式の画像を読み込み、NES対応の画像を出力
- EDGE形式のパレットからNES対応のパレットを出力
- NESで利用する固定64色をEDGE形式のパレットに出力
【注意点】
- PNG形式の画像サイズは128x128のみに対応しています
- PNG形式の画像モードはパレットを扱う形式のみに対応しています
- NES形式の画像とパレットには相関性がないため、どの色セットを扱うかは予めメモしておいてください
【使い方】
1.NESImageExtracter from PNGをインストールする
適当なところにインストールします。
2.EDGEをダウンロードする。
下記のサイトからEDGEの最新版をダウンロードし、インストールします。
http://takabosoft.com/edge
3.EDGEにNES固定64色のパレットを登録する
EDGEをインストールしたフォルダを開き、適当なフォルダを作成してください。
このフォルダを仮に"palette"フォルダと呼びます。
この"palette"フォルダに1.でインストールしたフォルダから"nes64.pal"というファイルをコピーします。
EDGEを起動し、適当に新規作成をします。
すると下の画像のようにカラーパレットというウィンドウが表示されると思います。
もし、表示されていない場合は赤丸で囲ったアイコンをクリックしてウィンドウを呼び出してください。

カラーパレットウィンドウの「ファイル」->「パレット登録・編集」でパレットの登録を行います。
新規登録をクリックし、パレットファイルに先ほどコピーした"nes64.pal"のパスを、タイトルに表示する名前を入力してください。
下の画像は一例です。
4.スプライトを作る
EDGEで128x128の画像を新規作成します。
パレットは先ほど登録したNES固定64色を選択してください。
NESの画像を編集するときは編集単位が8x8となっていますので、それからはみ出さないよう注意してください。
なお、デフォルトだとグリッドの編集単位に8x8がないため、「設定」->「グリッド&編集単位一発変更」->「設定」から編集単位を新たに登録しておくと便利です。

パレットが読み込まれると1〜2段目は黒く、3〜6段目に色が配置されています。
ツールが認識できるのはこの1〜2段目です。
1段目に背景の色を配置し、2段目にスプライトの色を配置します。
ただし、配置できる色は3〜6段目の色に限ります。
例えば、下の画像を作成します。

適当なファイル名を付けて画像のほうを出力します。
形式はPNG形式にしてください。
さらに今度はパレットも出力します。
カラーパレットから「ファイル」->「名前を付けて保存」で今編集中のパレットを出力します。
このパレットはNES対応パレットを出力するために必要です。
5.ツールを使ってスプライトとパレットを出力する
まずはコマンドプロンプトを起動します。
Pythonのパスが通っていない場合、パスを通してください。
"cd インストールフォルダへのパス"でディレクトリを移動してください。
インストールしたフォルダのアドレスバーをコピーして"cd "の後に続けてペーストすると移動が楽です。
次に、インストールしたフォルダに変換したいデータをコピーしてください。
特にコピーする必要もありませんが、入力ファイルのパス指定が長くなると後々面倒くさくなるのでコピーすると楽になります。
コピーしたデータも含めると以下のようなファイル構成になると思います。

今回使用するのは"test.png"と"test.pal"になりますが、入出力したいファイルの都合に合わせて適宜名前を変えてください。
ヘルプは"python nesimg.py -h"で表示できます。
"python"は好みなので付ける付けないは自由です。

まずはスプライトの出力ですが、"python nesimg.py -i 入力ファイル名 出力ファイル名"で出力できます。
今回は、"python nesimg.py -i test.png game.spr"とします。
また、パレットの出力は"python nesimg.py -p 入力ファイル名 出力ファイル名"で出力できます。
これは"python nesimg.py -p test.pal game.pal"とします。

するとインストールされたフォルダの中に"game.spr"と"game.pal"が追加されたと思います。
これをお手持ちのNESASMのプロジェクトに追加し、コンパイルすれば晴れてスプライトが表示されるのではないかと思います。
【仕組み】
パレットの仕組み
NES形式のパレットは非常に単純です。
固定64色の中から32色を選ぶようになっています。

1行目が背景で利用する色で、2行目がスプライトで利用する色です。
この色はNESであらかじめ定義されている64色の中から色番号を選ぶ形で列挙しています。
以下の画像は
Palette Editorというソフトで、NES形式のパレットを出力するツールです。
これは下の色から上の色にドラッグアンドドロップするように色を決めるのですが、だいたいそんな感じです。
スプライト・BGの仕組み
スプライトと背景(以下、スプライトと略します)の仕組みは共通です。
パレットとスプライトなどの簡単な仕組みは、
ギコ猫でもわかるファミコンプログラミング 第5章 スプライトを参照してください。
とりあえず、スプライトのバイナリを覗いてみましょう。

8x8のスプライトは1枚を表すのに1行使っています。16バイト=128ビットです。
0x00000000〜は一番左端、0x00000010〜はその隣、0x00000100〜は左端の一つ下となっています。
仮に1行目に着目するとしましょう。
利用できるのは4色=2ビットですので、内訳は8x8=64画素x2ビット=128ビットとなっています。
ただし、1画素を表すのに2ビット連続で表していません。
16バイトを8バイトで分け、前半が2ビット目、後半が1ビット目という形で分けられています。

スプライトの1行を表すのに1バイト+1バイト、1画素を表すのに1ビット+1ビットという形になることが分かりました。
色を表すにはどのような形になっているのかと言いますと、前半と後半のビットが立っているかどうかで使う色を判断しています。
0+0=0, 0+1=1, 1+0=2, 1+1=3と言う風な形です。

1ビット目が左端で、8ビット目が右端です。1行8ビットで表されています。
スプライトは上の画像のようにある意味足し算をするような形で色を決めています。
注意すべき点と言えば前半が2ビット目であることぐらいです。
【連絡先】
auth:竹渕瑛一
mail:nanashi4129@gmail.com
twit:
GRGSIBERIA
blog:
http://blogs.yahoo.co.jp/nanashi_hippie
改変は生のPythonコードなので自由ですが再配布は勘弁してください……。