Rust + eguiで作成された、NES (ファミコン) 用 CHR タイルエディタです。
YY-CHR の基本機能に加え、10 種類の描画ツール・PNG インポート・連続スクロール表示など使い勝手を向上させた機能を搭載しています。
cargo run --releaseRust 1.80 以降が必要。
依存ライブラリは Cargo が自動取得します。
ファイル → 開く… から対応ファイルを選択するか、ウィンドウにドラッグ&ドロップで、ファイルをBank Viewに展開できます。
対応フォーマット:
.nes— iNES フォーマット。CHR-ROM が含まれる ROM に対応.bin— ヘッダなし生 CHR バイナリ.zip— ZIP 内の最初の.nesファイルを自動展開して読み込む
ファイル → 新規作成 で空の 16KB CHR データ(newfile)が作成されます。
| 操作 | ショートカット |
|---|---|
| 上書き保存 | ⌘S / Ctrl+S |
| 別名で保存 | ⌘⇧S / Ctrl+Shift+S |
未保存の変更がある場合、タイトルバーにアスタリスク(*)が表示されます。
ウィンドウを閉じようとすると確認ダイアログが出ます。
- バンクビュー(左): 最低幅 410px。ウィンドウ幅に合わせて整数倍スケーリング
- ドットエディタ(中央): リサイズ可能。最小 180px
- 情報パネル(右): 固定幅 245px
全 CHR データを 16 タイル幅(128px)の縦長テクスチャとして表示します。 1 行 = 16 タイル × 16 バイト = 0x100 バイト。スクロールバーで上下に移動できます。
ツールバーの「アドレス:」欄に 16 進アドレスを入力して 移動 ボタンを押すか Enter で指定位置へ移動できます。
選択ブロック(=ドットエディタの編集単位)を 5 段階で切り替え可能です。
| ボタン | サイズ | タイル数 |
|---|---|---|
8 |
8×8 px | 1×1 タイル |
16 |
16×16 px | 2×2 タイル |
32 |
32×32 px | 4×4 タイル |
64 |
64×64 px | 8×8 タイル |
128 |
128×128 px | 16×16 タイル |
クリックしたタイルが選択起点になり、ドットエディタにフォーカスサイズ分のタイルが展開されます。
選択タイル(フォーカスサイズ分)を拡大表示して編集する領域になります。
ツールバーのアイコンをクリックするか、ショートカットキーでツールを選択します。
| 操作 | 内容 |
|---|---|
| 右クリック | スポイト(クリックした点の色を描画色に設定) |
クリック・ドラッグで 1 ドットずつ自由に描画。ドラッグでまたいだ複数タイルも 1 回の Undo で戻せます。
クリック起点のチェッカーボードパリティ (x+y) % 2 を基準に、1 ドット飛ばしのパターンで描画。タイルをまたいでも連続した市松模様になります。
クリック起点からドラッグして直線を描けます。Bresenham アルゴリズムによる整数演算ラインで、ドラッグ中リアルタイムプレビューが表示されます。ボタンを離した瞬間に確定。
対角 2 点をドラッグで指定し、外周のみを描画。ボタンを離した瞬間に確定。
矩形内部をすべて塗りつぶします。ボタンを離した瞬間に確定。
矩形の範囲内を起点パリティのチェッカーボードパターンで塗ります。ボタンを離した瞬間に確定。
バウンディングボックス(対角 2 点)で楕円を定義し、輪郭のみを描画。各行の左右端点と各列の上下端点を組み合わせて隙間のない輪郭を生成します。ボタンを離した瞬間に確定。
スキャンライン法で楕円の内部をすべて塗りつぶします。ボタンを離した瞬間に確定。
クリックした位置の色インデックスが連続している範囲を BFS(幅優先探索)で塗りつぶします。4 方向連結。クリックした色と描画色が同じ場合は何もしません。
2 フェーズ操作のコピー&ペーストツール。
| フェーズ | 操作 | 動作 |
|---|---|---|
| 選択(Phase1) | ドラッグ | 点線で範囲プレビュー |
| 離す | 範囲を確定してバッファに取り込む | |
| 貼り付け(Phase2) | ドラッグ | 点線+ピクセルプレビューが追従 |
| 離す | CHR に書き込み(バッファは保持) | |
| 右クリック | キャンセルして Phase1 へ |
バッファは保持されるため同じ内容を何度でもスタンプできます。
| 操作 | ショートカット |
|---|---|
| コピー | ⌘C / Ctrl+C |
| ペースト | ⌘V / Ctrl+V |
現在のフォーカスサイズ分のタイルブロックをクリップボードに保存し、選択タイル位置に貼り付けます。ペーストは Undo で元に戻せます。
| キー | 動作 |
|---|---|
↑ ↓ ← → |
選択タイルを 1 タイルずつ移動 |
Z / X / C / V |
パレットセット 0〜3 を切り替え |
⌘N / Ctrl+N |
新規作成 |
⌘Z / Ctrl+Z |
元に戻す(Undo) |
⌘C / Ctrl+C |
タイルコピー |
⌘V / Ctrl+V |
タイルペースト |
⌘S / Ctrl+S |
上書き保存 |
⌘⇧S / Ctrl+Shift+S |
別名で保存 |
矢印キーで選択タイルが画面外に出た場合は自動スクロールします。
4 セット × 4 色の NES パレット(DAT パレット)を表示。セルを選択し NES 64 色ピッカーから、色を変更できます。
バンクビューのレンダリングに使うセットを Z / X / C / V キーで切り替える事ができます。
パレット メニューから以下の操作が可能。
| メニュー項目 | 内容 |
|---|---|
| PAL ファイルを開く… | .pal(192 バイト = 64 色 × RGB 3 バイト)を読み込んでマスターパレットを上書き |
| DAT ファイルを開く… | .dat(16 バイト以上)を読み込んでパレットセットを更新 |
| DAT ファイルを保存… | 現在のパレットセットを .dat として書き出す |
| マスターパレットをリセット (NES 標準) | 内蔵の NES 標準 64 色パレットに戻す |
起動時に assets/rchr.pal(マスターパレット)と assets/rchr.dat(パレットセット)を自動読み込みする。
YY-CHR 互換フォーマット。
YY-CHR の「画像貼り付け」が 8bpp インデックス BMP / 8bit インデックス PNG のみ対応しているのに対し、 r-chr は以下の形式をすべて受け入れます。
- インデックスカラー PNG(1bit / 2bit / 4bit / 8bit)
- フルカラー PNG(RGB / RGBA)
- 透明色(tRNS チャンク / アルファチャンネル)を含む PNG
- ファイル → PNG をインポート… でファイル選択ダイアログを開く
- PNG ファイルをウィンドウにドラッグ&ドロップする
NES / BIN ファイルを先に開いておく必要があります。
PNG を選択すると確認ダイアログが開きます。
┌────────────────────────────────────────────────────────┐
│ PNG インポート │
│ │
│ ファイル: sprite.png (32×32 px = 4×4 タイル) │
│ │
│ マッピング戦略: │
│ ● パレット照合 (推奨) ○ インデックス直接 ○ RGB近似 │
│ │
│ ⚠ 3 色がパレットに完全一致せず近似されました │
│ ⚠ 透明パレットエントリ 1 色 → インデックス 0 に変換 │
│ │
│ プレビュー(変換後): │
│ [変換後の CHR 色でレンダリングされたプレビュー] │
│ │
│ 貼り付け先: タイル 0 (0x000000) から │
│ │
│ [キャンセル] [貼り付け] │
└────────────────────────────────────────────────────────┘
- 貼り付け先: バンクビューで選択中のタイルが起点となります
- 貼り付け後: Undo(
⌘Z/Ctrl+Z)で元に戻せます - マッピング戦略: ラジオボタンで切り替えるとプレビューがリアルタイムで更新されます
PNG のピクセルを CHR カラーインデックス(0〜3)に変換する方法を 3 種類から選べます。 ファイルの種類に応じて自動選択されるが、ダイアログで手動切り替えも可能。
自動選択条件: インデックスカラー PNG かつ PLTE チャンクあり
Aseprite などで NES マスターパレットを使って作業した場合に最適です。
変換フロー:
PLTE[i] の RGB
→ NES マスターパレット 64 色に最近傍マッチ
→ 現在の DAT パレットセット 4 色の中で最も近い色を選択
→ CHR インデックス 0〜3 に変換
Aseprite での手順:
- Aseprite でスプライトをインデックスカラーモード(Indexed Color)で作成
- パレットを
rchr.palまたはゲームの実際の NES パレットから設定 - ファイル → エクスポート で PNG として書き出す(インデックスカラーのまま出力)
- r-chr でファイルを開き、貼り付け先タイルを選択
- ファイル → PNG をインポート… または D&D でインポート → 「パレット照合」が自動選択
- プレビューを確認して 貼り付け を押す
自動選択条件: インデックスカラー PNG かつ PLTE なし
ピクセルのインデックス値 mod 4 → CHR インデックス 0〜3
用途: パレット先頭 4 色(インデックス 0〜3)が CHR 0〜3 に対応するよう意図的に設定している場合。
自動選択条件: フルカラー PNG(RGB / RGBA)
各ピクセルの RGB
→ 現在の DAT パレットセット 4 色との RGB 距離を計算
→ 最も近い色インデックス 0〜3 → CHR に書き込む
用途: フルカラー PNG、スクリーンショット、BMP を変換した画像など任意の PNG。 色の再現は近似のみ。DAT パレットを実際のゲームのパレットに合わせておくと精度が上がります。
PNG に透明色が含まれる場合(tRNS チャンク / アルファチャンネル)、透明ピクセルは自動的に CHR インデックス 0 にマッピングされます。
| 形式 | 透明の判定条件 |
|---|---|
| インデックス PNG(tRNS あり) | tRNS でアルファ = 0 のパレットエントリ |
| RGBA PNG | アルファ値 < 128 のピクセル |
NES の CHR においてインデックス 0 は背景色(スプライトの抜き色)に対応するため、透明ピクセルを 0 にマッピングすることでスプライトの見た目が正しく設定されます。透明ピクセルの件数はダイアログの警告欄に表示されます。
すべての描画操作・PNG インポートは Undo に対応しています。
| 操作 | Undo の単位 | 最大ステップ数 |
|---|---|---|
| ドットエディタでの編集(ペン・ドラッグ) | ドラッグ 1 回分の全タイル変更 | 100 |
| 線 / 矩形 / 楕円 / 塗りつぶし | 図形 1 つ分の全タイル変更 | 100 |
| スタンプ | スタンプ 1 回分の全タイル変更 | 100 |
| タイルペースト | ペースト 1 回分の全タイル変更 | 100 |
| PNG インポート | 影響範囲の全タイルを一括 | 100 |
src/
main.rs — エントリポイント・ウィンドウ設定
native_menu.rs — macOS ネイティブメニュー(muda クレート)
editor/
mod.rs
app.rs — アプリ状態定義・メインループ(eframe::App)
bank_view.rs — バンクビュー(CHR 全体表示・タイル選択)
clipboard.rs — タイルコピー & ペースト
dot_editor.rs — ドットエディタ・10 種類の描画ツール
file_ops.rs — ファイル開く / 保存 / 新規作成
info_panel.rs — 右パネル(パレット・描画色・情報表示)
keyboard.rs — キーボードショートカット処理
png_import.rs — PNG インポートダイアログ
setup.rs — フォント設定
theme.rs — カラー・フォント・サイズ定数
mac/
mod.rs
menu_bar.rs — egui メニューバー(非 macOS 用)
menu_events.rs — macOS ネイティブメニューイベント処理
io/
mod.rs
chr.rs — CHR デコード / エンコード / レンダリング
nes.rs — iNES フォーマットパーサ / RomData 型
png.rs — PNG / BMP インポート(マッピング・CHR 書き込み)
model/
mod.rs
palette.rs — NES パレット(MasterPalette / DatPalette)
assets/
rchr.pal — デフォルトマスターパレット(YY-CHR 互換 .pal)
rchr.dat — デフォルトパレットセット(YY-CHR 互換 .dat)
rchr.bin — 起動時表示用デフォルト CHR データ(R-CHR ロゴ)
nes.pal — NES 標準 64 色パレット(リセット用)
icons/ — ツールバー・描画ツール用 SVG アイコン
本ツールは YY-CHR を参考に開発を行いました。 YY-CHR は定番の NES / SNES CHR エディタであり、インターフェースの基本設計や CHR フォーマットの取り扱いにあたって大いに参考にさせていただきました。
This project is licensed under the MIT License. See the LICENSE file for details.
Daisuke Takayama


