透明对话框
网上的透明对话框代码有一个缺陷,就是开启透明对话框后,yesno box也会变透明。而且源码参数含义不名。我通过查阅gba硬件参数,重新做了一份透明对话框源码。
原理:gba窗口可以至多分为两个窗口win0和win1,可以通过io参数设定它俩的大小,是否开启混合模式,以及混合颜色的参数等。
win0的优先级高于win1。这里,我们将win1设置为屏幕的上半部分(y坐标0到112),win0设置为屏幕的下半部分(y坐标112-160),
同时开启win0的混合颜色模式。即可达到仅显示对话框部分透明,其余部分不透明的目的。 C语言源代码:
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240));//left, right
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(112, 160));//top bottom
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 240));//left, right
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 112));//top bottom
SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_CLR);//开启win0混合模式
SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0);//混合bg0
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x5));//混合参数 汇编版本源码:
movs r1, #240
movs r0, #64
bl SetGpuReg
ldr r1, =28832
movs r0, #68
bl SetGpuReg
movs r1, #240
movs r0, #66
bl SetGpuReg
movs r1, #112
movs r0, #70
bl SetGpuReg
movs r1, #32
movs r0, #72
bl SetGpuRegBits
movs r1, #1
movs r0, #80
bl SetGpuRegBits
movs r1, #162
movs r0, #82
lsls r1, r1, #3
bl SetGpuReg 参数参考网址:
https://www.cs.rit.edu/~tjh8300/CowBite/CowBiteSpec.htm#Windowing 我觉得把YES/NO也完全透明化才对、而不是用window把alpha blending的范围隔离开。如果没记错,那段原始代码会导致YES/NO外面一圈边框显示不正确(没变黑),但是也不难解决
页:
[1]