スプライトを表示する
画面上にスプライトを表示して動かします
- 2022-11-15
- ResCompに関する記述を追加
- 2022-06-12
- 公開
コード
res_image.res
- PALETTE logo_palette "cblogo.png"
- SPRITE logo_sprite "cblogo.png" 18 5 BEST
main.c
- #include <genesis.h>
- #include "res_image.h"
- #define SCREEN_WIDTH 320
- #define SCREEN_HEIGHT 224
- int main(u16 hard) {
- // 経過時間
- u8 timer = 0;
- // ロゴ(スプライト)の位置
- s16 posX = 112;
- s16 posY = 96;
- // 移動速度
- s16 speedX = 1;
- s16 speedY = 2;
- // 移動方向
- s16 directionX = 1;
- s16 directionY = 1;
- // 移動範囲
- s16 maxWidth = SCREEN_WIDTH - 144; // 144: ロゴ幅
- s16 maxHeight = SCREEN_HEIGHT - 40; // 40: ロゴ高さ
- // 色の設定
- PAL_setPaletteColors(0, &logo_palette, DMA);
- // スプライトエンジンの初期化
- SPR_init();
- // スプライトの追加と取得
- Sprite* logo = SPR_addSprite(&logo_sprite, posX, posY, TILE_ATTR(PAL0, TRUE, FALSE, FALSE));
- // メインループ
- while (TRUE) {
- SYS_doVBlankProcess();
- // 4フレームごとに更新する
- // NOTE: 「x & 3」は剰余演算「x % 4」と同じ
- // つまり4で割った余りが0以外の場合は処理を飛ばしている
- if (timer++ & 3) {
- continue;
- }
- // スプライト更新(スプライトに対して行った変更が反映される)
- SPR_update();
- // ロゴの移動先座標の設定
- posX += directionX * speedX;
- posY += directionY * speedY;
- // ロゴを移動
- SPR_setPosition(logo, posX, posY);
- // 画面端であれば移動方向を反転させておく
- if (posX <= 0 || posX >= maxWidth) {
- directionX *= -1;
- }
- if (posY <= 0 || posY >= maxHeight) {
- directionY *= -1;
- }
- }
- return 0;
- }
実行結果
上記コードをSGDK1.70でコンパイルし
Gens v2.14 Souvenirで実行したスクリーンショット
解説
ResComp
画像ファイルをSGDK内で扱うには、ResComp1を利用します(利用せずに扱うことも可能です)。
ResCompの使用にはresファイルの作成(当ページではres_image.res)と、resファイルから作成されるヘッダファイル(.h)のインクルードが必要(当ページではmain.c 2行目)になります。
SPRITE
スプライトの1つのサイズはタイル単位で1x1から4x4までですが、SGDKではResCompを利用しSPRITEとして読み込むよう設定することで自動的に分割して配置され、移動や表示状態などの変更を1つの要素のように扱えます。
当ページではres_image.resの2行目の「18 5」がスプライトのサイズになります。18が横、5が縦のサイズ(タイル数)になります。
なお、スプライトはSPR_updateを実行しないと変更が画面に反映されません。
ダウンロード
1画像や音楽データをSGDKコード内で使える形に変換してくれるツールです。
様々な形式に対応しており、また各形式によって指定できるオプションが異なるため、rescomp.txt(sgdk\bin\rescomp.txt)を確認することを推奨します。