画像を色違いにする

パレットを入れ替えることで画像の色を変更します

2022-11-15
ResCompに関する記述を追加
2022-06-12
公開

コード

res_image.res

  1. SPRITE logo_sprite "logo.png" 12 4 BEST

main.c

  1. #include <genesis.h>
  2. #include "res_image.h"
  3.  
  4. /**
  5. * ロゴのpaletteパターン
  6. */
  7. const u16 palette[4][16] = {
  8. {
  9. 0x0000, 0x0EEE, 0x0E20, 0x0E00, 0x0A00, 0x0800, 0x0E40, 0x0E60,
  10. 0x0E80, 0x0EA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
  11. },
  12. {
  13. 0x0000, 0x0EEE, 0x0EA0, 0x0E20, 0x0E00, 0x0A00, 0x0800, 0x0E40,
  14. 0x0E60, 0x0E80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
  15. },
  16. {
  17. 0x0000, 0x0EEE, 0x0E80, 0x0EA0, 0x0E20, 0x0E00, 0x0A00, 0x0800,
  18. 0x0E40, 0x0E60, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
  19. },
  20. {
  21. 0x0000, 0x0EEE, 0x0E60, 0x0E80, 0x0EA0, 0x0E20, 0x0E00, 0x0A00,
  22. 0x0800, 0x0E40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
  23. },
  24. };
  25.  
  26. int main(u16 hard) {
  27. // 経過時間
  28. u8 timer = 0;
  29.  
  30. // スプライト表示
  31. SPR_init();
  32. SPR_addSprite(&logo_sprite, 112, 96, TILE_ATTR(PAL0, TRUE, FALSE, FALSE));
  33. SPR_update();
  34.  
  35. // 初期パレット設定
  36. PAL_setPalette(PAL0, palette[0], DMA);
  37.  
  38. // メインループ
  39. while (TRUE) {
  40. SYS_doVBlankProcess();
  41.  
  42. // 時間の加算
  43. timer++;
  44.  
  45. // 8フレームごとに更新する
  46. // NOTE: 「x & 7」は剰余演算「x % 8」と同じ
  47. // つまり8で割った余りが0以外の場合は処理を飛ばしている
  48. if (timer & 7) {
  49. continue;
  50. }
  51.  
  52. // NOTE: 「timer >> 3」はtimerを8で割った数(切り捨て)
  53. // 「x & 3」は剰余演算「x % 4」と同じ
  54. // つまり「(timer >> 3) & 3」は0, 1, 2, 3, 0, 1, ...を繰り返す
  55. PAL_setPalette(PAL0, palette[(timer >> 3) & 3], DMA);
  56. }
  57.  
  58. return 0;
  59. }

実行結果

上記コードを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)を確認することを推奨します。