- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-05-01T18:38:02+09:00","","")
#freeze
#author("2023-05-15T10:20:29+09:00;2023-05-10T16:53:27+09:00","","")
* 拡大縮小1 [#e7f21d32]
拡大縮小はBGやスプライトに対して行える機能です。正しハードウェア的制約があるので注意してください。~
拡大縮小はBGやスプライトに対して行える機能です。ハードウェア的制約があるので注意してください。表のように一部のBGのみとなっています。
| タイルモード | モード1のBG2、モード2のBG2,BG3 |
| ビットマップモード | BG2のみ |
| スプライト | 128個(すべて) |
*** REG_BGxPA、REG_BGxPB、REG_BGxPC、REG_BGxPD [#s4bcf35e]
I/OレジスタはBG2用とBG3用に分かれています。それぞれは拡大縮小パラメータ4つ(PA,PB,PC,PD)と、始点位置を決めるxX、xYで構成されています。~
** REG_BGxPA、REG_BGxPB、REG_BGxPC、REG_BGxPD、REG_BGxX、REG_BGxY [#s4bcf35e]
I/OレジスタはBG2用とBG3用に分かれています。それぞれは拡大縮小パラメータ4つ(PA,PB,PC,PD)と、始点位置を決めるxX、xYで構成されています。
#define REG_BG2PA *((vu16 *)(REG_BASE + 0x20))
#define REG_BG2PB *((vu16 *)(REG_BASE + 0x22))
#define REG_BG2PC *((vu16 *)(REG_BASE + 0x24))
#define REG_BG2PD *((vu16 *)(REG_BASE + 0x26))
#define REG_BG2X *((vu32 *)(REG_BASE + 0x28))
#define REG_BG2Y *((vu32 *)(REG_BASE + 0x2c))
#define REG_BG3PA *((vu16 *)(REG_BASE + 0x30))
#define REG_BG3PB *((vu16 *)(REG_BASE + 0x32))
#define REG_BG3PC *((vu16 *)(REG_BASE + 0x34))
#define REG_BG3PD *((vu16 *)(REG_BASE + 0x36))
#define REG_BG3X *((vu32 *)(REG_BASE + 0x38))
#define REG_BG3Y *((vu32 *)(REG_BASE + 0x3c))
拡大縮小パラメータの4つの数値を組み合わせることで、さまざまな効果を出すことができるのです。今回は拡大縮小のための最小限の解説を行います。このパラメータの基本(元と同じ画像を表示)は、PAから順番に256,0,0,256です。拡大・縮小して表示したい場合は、縦の変化率がPAとPB、横の変化率が、PCとPDに一定の値をかけます。かける値は倍率の逆数になります。つまり、2倍にして表示したい場合は2で割ればいいことになって、逆に1/2に表示したい場合は2をかけます。 ~
拡大縮小パラメータは4つの数値を組み合わせることで、さまざまな効果を出すことができます。今回は拡大縮小のための最小限の解説を行います。このパラメータの基本(元と同じ画像を表示)は、PAから順番に256,0,0,256です。拡大・縮小表示したい場合は、縦の変化率がPAとPB、横の変化率がPCとPDに一定の値をかけます。かける値は倍率の逆数になります。つまり2倍にして表示したい場合は2で割ればいいことになって、逆に1/2に表示したい場合は2をかけます。 ~
| 倍率 | PA~PD |
| 200% | 128, 0, 0, 128 |
| 100% | 256, 0, 0, 256 |
| 50% | 512, 0, 0, 512 |
** 画像縮小(50%)の表示例 [#nea1e2b1]
** BGの拡大縮小表示 [#nea1e2b1]
#include "lib/gba.h"
#include "res.h"
#include "irq.arm.h"
#include "key.h"
#include "font.h"
//---------------------------------------------------------------------------
void WaitForVsync(void)
{
while(*(vu16*)0x4000006 >= 160) {};
while(*(vu16*)0x4000006 < 160) {};
}
//---------------------------------------------------------------------------
// BG2の縦・横の拡大率を%で指定
void ScaleBG2(u32 xsc, u32 ysc)
{
REG_BG2PA = 256 * 100 / xsc;
REG_BG2PA = Div(256 * 100, xsc);
REG_BG2PB = 0;
REG_BG2PC = 0;
REG_BG2PD = 256 * 100 / ysc;
REG_BG2PD = Div(256 * 100, ysc);
}
//---------------------------------------------------------------------------
int main(void)
{
// モード設定
REG_WSCNT = 0x4317;
IrqInit();
KeyInit();
FontInit();
SetMode(MODE_3 | BG2_ENABLE);
// 画像の読み込み
s32 x = 150;
s32 y = 150;
u16 cnt;
REG_DMA3SAD = (u32)&imageBitmap;
REG_DMA3DAD = (u32)VRAM;
REG_DMA3CNT = (u32)(240*160) | (DMA_SRC_INC | DMA_DST_INC | DMA16 | DMA_ENABLE);
ScaleBG2(50, 50);
for(;;)
{
WaitForVsync();
VBlankIntrWait();
FontDrawPrintf(16, 16, RGB5(31,31,31), "[%3d][%3d]", x, y);
ScaleBG2(x, y);
KeyExec();
cnt = KeyGetCnt();
if(cnt & KEY_UP ) y--;
if(cnt & KEY_DOWN ) y++;
if(cnt & KEY_LEFT ) x--;
if(cnt & KEY_RIGHT) x++;
if(x < 1) x = 1;
if(x > 200) x = 200;
if(y < 1) y = 1;
if(y > 200) y = 200;
}
}
*** 動作画面 [#bdca191a]
-[[github:]]
#ref(1.png,nolink)
** 履歴 [#n1940654]
- 2023/05/02
- 2007/09/08