我正在为一个侄子做一个小型RPG游戏,我决定在混合中投入一些任务而不仅仅是纯粹的骷髅战斗。我建立了一个工作库存,我可以添加,删除和使用物品,但库存中的物品只会填满,直到达到限制(25件物品)而没有堆叠。
我用以下代码解决了这个问题:
finished = false;
if(Backpack[bSlot].ITEM.ItemName == Item.ItemName){
if(!finished){
Backpack[bSlot].ITEM.ItemCount += 1;
finished = true;
}
}
正如您所看到的那样,只检查我们添加的项目(项目)是否与我们在插槽中的项目相同。
然而,只有当项目完全相同,任何其他项目被丢弃并且其游戏对象被破坏时,这才会起作用。
这是我向背包添加物品的功能:
public void AddItem(ItemDefine Item){
bool finished = false;
for (int bSlot = 0; bSlot < Backpack.Count; bSlot++) {
//if slot is empty, add item
if(Backpack[bSlot].ITEM.ItemName == null){
if(!finished){
Backpack[bSlot].ITEM = Item;
finished = true;
}
}
//If item is the same as the one in our current slot
if(Backpack[bSlot].ITEM.ItemName == Item.ItemName){
if(!finished){
Backpack[bSlot].ITEM.ItemCount += 1;
finished = true;
}
}
//if the item is NOT the same as the one in our current slot
if(Backpack[bSlot].ITEM.ItemName != Item.ItemName){
if(!finished){
Backpack[bSlot].ITEM = Item;
finished = true;
}
}
}
}
我目前的问题是我无法检查项目是否相同,是否将金额(ItemCount)增加1,如果它不是迭代到下一个列表位置并添加那里的项目。
想法?
答案 0 :(得分:0)
您的代码存在一些问题。您应该真正使用if else
作为逻辑。
但是,使用hash table可以更轻松地执行此操作。哈希表将使您更容易避免重复已有的项目,并允许您堆叠可堆叠的项目。
您可以像这样创建Dictionary:
Dictionary<key, value>();
key
将是您的项目,值应为堆栈。
答案 1 :(得分:0)
我会在确定它是否存在之前完成forloop。
public void AddItem(ItemDefine Item){
bool exists = false;
if(Backpack.Where(x => x.ItemName == Item.ItemName).ToArray().Length > 0)
exists = true;
switch(exists) {
case true: {
// Item Exists
ItemDefine newItem = Backpack.Where(x => x.Itemname == Item.ItemName).FirstOrDefault();
// we double check to make sure it really exists.
If(newItem != null) {
newItem.ItemCount += 1;
}
} break;
case false: {
// Item Does Not Exist
Backpack.add(Item);
} break;
default: {
// Something went horribly wrong
} break;
}
}
在此示例中,我们首先搜索列表以查看是否存在具有此名称的项目,如果存在,我们将评估之后的操作。 如果它存在,我们只是增加项目数,否则我们只是将它添加到列表中, 请注意,如果它是一个数组,我不知道你如何声明背包变量 或列表背包。
有很多方法可以扩展逻辑,但List的功能非常适合库存处理。 希望这能提供一些见解。
答案 2 :(得分:0)
经过一夜好眠,回来看看答案。它让我思考,我把我的两段代码,添加新的和添加到项目计数在两个for循环中具有理想的插槽数量(5x5网格,25个插槽),这是没有用的。如果先前的陈述给了我一些奇怪的行为,我已经尝试过了。
我通过一个简单的语法更改来纠正整个情况,而不是检查itemName是否为null我检查了图标是否为null,因此修复是这样的:
public void AddItem(ItemDefine Item){
bool finished = false;
for (int bSlot = 0; bSlot < Backpack.Count; bSlot++) {
//if slot is empty, add item
if(Backpack[bSlot].ITEM.ItemIcon == null){
if(!finished){
Backpack[bSlot].ITEM = Item;
finished = true;
}
}else if (Backpack[bSlot].ITEM.ItemName == Item.ItemName) {
if (!finished) {
Backpack[bSlot].ITEM.ItemCount += 1;
finished = true;
}
}
}
}
这甚至达到了插槽的极限,每种物品类型都在另一段代码中计算,即武器限制为1,食物限制为128,资源128和任务物品1
感谢您的帮助(即使我没有使用它们,知道人们实际帮助也很棒)