我这直接以pokeemerald-expansion为例了
关于如何添加更多的背包
Github上的AsparagusEduardo的更好的背包(机翻)有相关教程
看对比就行了
所谓的箱子道具实质其实是个道具
使用后打开原本隐藏起来的背包
接下来步入正题
1.添加道具
像这样
ITEM_BOX就是我们的箱子道具
保存后再打开
里面就是每个道具的具体信息了
滑倒最下方
这样写
.type = ITEM_USE_BAG_MENU,是使用的类型
.pocket = POCKET_KEY_ITEMS,是道具所在的背包
.fieldUseFunc = ItemUseOutOfBattle_Box,是使用时调用的函数
.iconPic = gItemIcon_CoinCase,是道具图标
.iconPalette = gItemIconPalette_CoinCase,是道具色板
这两怎么申明对着别的道具搜下然后照猫画虎就行了
那么你就写好道具的相关信息了
接下来是打开背包的实现方法
ItemUseOutOfBattle_Box就是我们要写的函数
2.函数实现
打开
然后到
然后到
其中FreeBagMenu是个ex自带的函数
原来清空背包的原数据(防止内存不够用)
这个if条件是
原来判断道具使用是在野外通过注册道具来打开箱子
还是在背包内使用箱子道具来打开特定背包的
GoToBagMenu就是实现打开背包的核心函数了
ITEMMENULOCATION_FIELD是打开的位置(不太确定,我直接翻译是这样的)
SP_STONE_POCKET是打开的背包
CB2_BoxToBagMenu和CB2_BoxToField是退出后会运行的函数
有两个就是用来应对上面两个情况的
DestroyTask(taskId)就是销毁当前任务(没学过编程,只能这样讲了,sorry~)
这两个就是返回函数了
gBagPosition.pocket = KEYITEMS_POCKET;
这玩意是确保下次打开背包打开的是重要物品背包的
剩下的那两个是调用自带函数有兴趣可以自己看看
最后保存你所做的所有更改
然后make(编译)就行了
接下来就是打开看看吧
效果GIF如下
可能比较水
关于如何添加更多的背包
Github上的AsparagusEduardo的更好的背包(机翻)有相关教程
看对比就行了
所谓的箱子道具实质其实是个道具
使用后打开原本隐藏起来的背包
接下来步入正题
1.添加道具
include\constants\items.h
代码:
#define ITEM_BOX 829
// HOPO BERRY
// LEGEND PLATE
#define ITEMS_COUNT 830
像这样
ITEM_BOX就是我们的箱子道具
保存后再打开
src\data\items.h
里面就是每个道具的具体信息了
滑倒最下方
代码:
[ITEM_POKESHI_DOLL] =
{
.name = _("宝可梦木娃娃"),
.price = 2000,
.description = COMPOUND_STRING(
"宝可梦造型的木制\n玩具。可以在杂货\n店出售。"),
.pocket = POCKET_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
.iconPic = gItemIcon_PokeshiDoll,
.iconPalette = gItemIconPalette_PokeshiDoll,
},
[ITEM_BOX] =
{
.name = _("盒子"),
.price = 2000,
.description = COMPOUND_STRING(
"盒子"),
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_Box,
.iconPic = gItemIcon_CoinCase,
.iconPalette = gItemIconPalette_CoinCase,
},
这样写
.type = ITEM_USE_BAG_MENU,是使用的类型
.pocket = POCKET_KEY_ITEMS,是道具所在的背包
.fieldUseFunc = ItemUseOutOfBattle_Box,是使用时调用的函数
.iconPic = gItemIcon_CoinCase,是道具图标
.iconPalette = gItemIconPalette_CoinCase,是道具色板
这两怎么申明对着别的道具搜下然后照猫画虎就行了
那么你就写好道具的相关信息了
接下来是打开背包的实现方法
ItemUseOutOfBattle_Box就是我们要写的函数
2.函数实现
打开
写include\item_use.h
代码:
void ItemUseOutOfBattle_Box(u8 taskId);
然后到
写include\item_menu.h
代码:
void CB2_BoxToBagMenu(void);
void CB2_BoxToField(void);
然后到
写src\item_use.c
代码:
void ItemUseOutOfBattle_Box(u8 taskId)
{
FreeBagMenu();
if (gTasks[taskId].tUsingRegisteredKeyItem == 0)
GoToBagMenu(ITEMMENULOCATION_FIELD, SP_STONE_POCKET, CB2_BoxToBagMenu);
else
GoToBagMenu(ITEMMENULOCATION_FIELD, SP_STONE_POCKET, CB2_BoxToField);
DestroyTask(taskId);
}
其中FreeBagMenu是个ex自带的函数
原来清空背包的原数据(防止内存不够用)
这个if条件是
原来判断道具使用是在野外通过注册道具来打开箱子
还是在背包内使用箱子道具来打开特定背包的
GoToBagMenu就是实现打开背包的核心函数了
ITEMMENULOCATION_FIELD是打开的位置(不太确定,我直接翻译是这样的)
SP_STONE_POCKET是打开的背包
CB2_BoxToBagMenu和CB2_BoxToField是退出后会运行的函数
有两个就是用来应对上面两个情况的
DestroyTask(taskId)就是销毁当前任务(没学过编程,只能这样讲了,sorry~)
代码:
void CB2_BoxToBagMenu(void)
{
gBagPosition.pocket = KEYITEMS_POCKET;
SetMainCallback2(CB2_BagMenuFromStartMenu);
}
void CB2_BoxToField(void)
{
gBagPosition.pocket = KEYITEMS_POCKET;
SetMainCallback2(CB2_ReturnToField);
}
这两个就是返回函数了
gBagPosition.pocket = KEYITEMS_POCKET;
这玩意是确保下次打开背包打开的是重要物品背包的
剩下的那两个是调用自带函数有兴趣可以自己看看
最后保存你所做的所有更改
然后make(编译)就行了
接下来就是打开看看吧
效果GIF如下
可能比较水
由版主最后编辑: