逆向:程序研究/AT1/菜单相关例程:修订间差异

来自歌颂之丘
跳转到导航 跳转到搜索
(新建页面)
 
→‎菜单系统:​ 更新例子
第109行: 第109行:
* menuHostRegEntry(struct menu_t *menu, void (*displayCallback)(), void (*confirmCallback)()):注册一个菜单项。13CC18。
* menuHostRegEntry(struct menu_t *menu, void (*displayCallback)(), void (*confirmCallback)()):注册一个菜单项。13CC18。
* menuHostShowMenu(struct menu_t *menu):显示菜单,进行主循环。13CC38。
* menuHostShowMenu(struct menu_t *menu):显示菜单,进行主循环。13CC38。
* menuHostFini(struct menu_t *menu):菜单数组系统终止。释放资源。13CDB8。
* menuHostFini(struct menu_t *menu):菜单宿主系统终止。释放资源。13CDB8。


※:以上地址为日版SLPS_256.04的地址。
※:以上地址为日版SLPS_256.04的地址。
典型的调用是:
<pre>
/* ... */
menu_t menu;
menuHostInit(&menu);
menuHostRegEntry(&menu, helpDisplayCallback, helpShowCallback);
menuHostRegEntry(&menu, termDisplayCallback, termShowCallback);
menuHostShowMenu(&menu);
menuHostFini(&menu);
/* ... */
</pre>

2024年3月14日 (四) 21:27的版本

菜单相关处理。

用户界面绘制组(Gp)

Gp使用Tx的裁切结果。拼接成为用户界面。所有可变的元素,是在运行时,初始化时,调用方先在Gp结构中填入需要表示的值,然后再调用Gp处理函数进行显示。

Gp按以下结构连续存储:

<struct name='UiGp'>
    <field name='txptr' type='int32'/> <!-- 指向Tx结构的指针。若为NULL表示到达Gp列表尾端。 -->
    <field name='x' type='int16' />
    <field name='y' type='int16' />
    <field name='tex' type='int16' />
    <field name='pal' type='int16' />
    <field name='func' type='int32' />
    <field name='w-fx-no' type='int32' />
    <field name='h-fy' type='int32' />
    <field name='str' type='string*' />
    <field name='ukn' type='int32' />
    <field name='rot' type='float' />
    <field name='paras' type='int32[3]' />
</struct>

struct Gp {
    struct Tx* txptr;
    int16_t x;
    int16_t y;
    int16_t tex;
    int16_t pal;
    int32_t func;
    int32_t w-fx-no;
    int32_t h-fy;
    char *str;
    uint32_t ukn; /* 未知参数 */
    float rot;
    uint32_t para[3]; /* 未知参数 */
};

其中,func 表示此元素的绘制方式。各个参数的含义随func的不同而有不同解释。

处理其显示的函数为0x116588。

术语

“框”类元素。

+---+
|   |
+---+
此类型的元素,被分割为9块:左上角,上边框,右上角,左边框,中间,右边框,左下角,下边框,右下角。
在显示时,四角不进行变形,边框分别进行左右拉伸/反复,中间进行拉伸/反复。

例子:窗口类,对话框等。

“条”类元素。

+---+ +
      |
      +
此类型的元素,被分割为3块:左端点,中间,右端点。在显示时,端点进行上下拉伸/反复,中间进行左右及上下拉伸/反复。

例子:血量条等。

※以上的只是通用的结构,实际的显示中可能不包括所有的构件。

func表

0x116588首先检查func的值,并按跳表执行。跳表共55项,其中0,36,43,48,51-53取ukn之值,若为0则不动作,否则将ukn的值,否则将s4中的双字存入全局变量0xA7A778(某种标志?)。

55以上的值不做操作。

x,y为相对于屏幕左上角的偏移。tex 为 Tx 表的偏移 (0为Tx表第一项、1为第二项……,-1则此元素不显示)。

func==0

Tx 图片的直接显示。

func==1

func==15

文字显示。取str作为显示参数。并处理ukn。

使用主字库的显示。ukn 的典型值是:0x80808080。【疑似为字体颜色/透明度】

func==16

文字显示。

func==20

数字的显示。w-fx-no 此时表示 no,其中的值为要显示的值(若为999则显示为999)。

txptr 指向一组用于表示数字的 Tx。0号元素表示0,9号元素表示9。tex 仍用于表示偏移。tex 设定的情况下,txptr 首先偏移 tex 指定的值,然后以那里为0号元素。

func==25

“框”类元素的显示。w-fx-no 此时表示 w,宽度,h-fy 此时表示 h,高度。

txptr 指向一组9个用于表示框类元素各个构件的图片。【需要检查】

func==42

横“条”类元素的显示。w-fx-no 此时表示 w,宽度,h-fy 此时表示 h,高度。

txptr 指向一组3个用于表示条类元素各个构件的图片。【需要检查】

菜单系统

菜单宿主系统对菜单处理进行管理。需要注册当前菜单的绘图回调函数、每个菜单项的进入回调函数。然后运行菜单。

菜单宿主系统主循环每次渲染调用注册的绘图回调函数,然后检查玩家输入,并调整高亮和当前选择的菜单项。若玩家按下返回键则终止主循环并返回。

若玩家按下确认键则调用当前高亮的菜单项对应的注册的进入回调函数。

  • menuHostInit(struct menu_t *menu): 菜单宿主初始化,a0:要初始化的菜单宿主结构体。13CB48。
  • menuHostRegEntry(struct menu_t *menu, void (*displayCallback)(), void (*confirmCallback)()):注册一个菜单项。13CC18。
  • menuHostShowMenu(struct menu_t *menu):显示菜单,进行主循环。13CC38。
  • menuHostFini(struct menu_t *menu):菜单宿主系统终止。释放资源。13CDB8。

※:以上地址为日版SLPS_256.04的地址。

典型的调用是:

/* ... */
menu_t menu;
menuHostInit(&menu);
menuHostRegEntry(&menu, helpDisplayCallback, helpShowCallback);
menuHostRegEntry(&menu, termDisplayCallback, termShowCallback);
menuHostShowMenu(&menu);
menuHostFini(&menu);
/* ... */