画像を色違いにする
パレットを入れ替えることで画像の色を変更します
- 2022-11-15
- ResCompに関する記述を追加
- 2022-06-12
- 公開
コード
res_image.res
- SPRITE logo_sprite "logo.png" 12 4 BEST
main.c
- #include <genesis.h>
- #include "res_image.h"
- /**
- * ロゴのpaletteパターン
- */
- const u16 palette[4][16] = {
- {
- 0x0000, 0x0EEE, 0x0E20, 0x0E00, 0x0A00, 0x0800, 0x0E40, 0x0E60,
- 0x0E80, 0x0EA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
- },
- {
- 0x0000, 0x0EEE, 0x0EA0, 0x0E20, 0x0E00, 0x0A00, 0x0800, 0x0E40,
- 0x0E60, 0x0E80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
- },
- {
- 0x0000, 0x0EEE, 0x0E80, 0x0EA0, 0x0E20, 0x0E00, 0x0A00, 0x0800,
- 0x0E40, 0x0E60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
- },
- {
- 0x0000, 0x0EEE, 0x0E60, 0x0E80, 0x0EA0, 0x0E20, 0x0E00, 0x0A00,
- 0x0800, 0x0E40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
- },
- };
- int main(u16 hard) {
- // 経過時間
- u8 timer = 0;
- // スプライト表示
- SPR_init();
- SPR_addSprite(&logo_sprite, 112, 96, TILE_ATTR(PAL0, TRUE, FALSE, FALSE));
- SPR_update();
- // 初期パレット設定
- PAL_setPalette(PAL0, palette[0], DMA);
- // メインループ
- while (TRUE) {
- SYS_doVBlankProcess();
- // 時間の加算
- timer++;
- // 8フレームごとに更新する
- // NOTE: 「x & 7」は剰余演算「x % 8」と同じ
- // つまり8で割った余りが0以外の場合は処理を飛ばしている
- if (timer & 7) {
- continue;
- }
- // NOTE: 「timer >> 3」はtimerを8で割った数(切り捨て)
- // 「x & 3」は剰余演算「x % 4」と同じ
- // つまり「(timer >> 3) & 3」は0, 1, 2, 3, 0, 1, ...を繰り返す
- PAL_setPalette(PAL0, palette[(timer >> 3) & 3], DMA);
- }
- return 0;
- }
実行結果
上記コードをSGDK1.70でコンパイルし
Gens v2.14 Souvenirで実行したスクリーンショット
解説
ResComp
画像ファイルをSGDK内で扱うには、ResComp1を利用します(利用せずに扱うことも可能です)。
ResCompの使用にはresファイルの作成(当ページではres_image.res)と、resファイルから作成されるヘッダファイル(.h)のインクルードが必要(当ページではmain.c 2行目)になります。
Indexed color
メガドライブ(Genesis)で表示されている画像は、各ドットに割り振られた色番号と、その番号に該当するパレットの色の組み合わせで表示される、いわゆるインデックスカラーというものです。
つまり色番号もしくはパレットのどちらかを変更するだけで色を変えることが出来ます。
ダウンロード
1画像や音楽データをSGDKコード内で使える形に変換してくれるツールです。
様々な形式に対応しており、また各形式によって指定できるオプションが異なるため、rescomp.txt(sgdk\bin\rescomp.txt)を確認することを推奨します。