我在python和pygame中制作了一个简单的生存游戏,我在制作库存系统时遇到了麻烦。我一直试图找出它,没有任何帮助来挑战自己,但是时间寻求帮助。 我一直在玩这个代码
项目类
class item():
def __init__(self,name,amount):
self.name = name
self.amount = amount
资源类
class wood(pygame.sprite.Sprite):
def __init__(self):
self.x = 700
self.y = 100
self.cut = False
self.frame = 0
def draw(self,display):
self.rect = pygame.Rect((self.x + 38,self.y + 10,20,80))
display.blit(Art_lists.trees_list[self.frame], (self.x,self.y))
if pygame.sprite.collide_rect(self,Global.lion):
if (pygame.key.get_pressed() [pygame.K_SPACE] != 0):
if self.cut == False:
if Global.wood not in Global.inventory:
Global.inventory.append(Global.wood)
Global.oinventory.append('wood')
Global.wood.amount += 1
self.frame = 1
self.cut = True
if self.cut == True:
Global.wood.amount += 0
所以当你按空格时你碰撞节点例如一棵树你就会砍掉树,它会把一个items类的对象添加到一个名为inventory的列表中,然后将一个字符串添加到列表oinventory然后oinventory然后得到打印到屏幕但我不能得到一个int用字符串blit因为它不会接受它。我真的不认为这是制作库存的最佳方式。我希望库存只是在屏幕上的文本中以其旁边的数量显示其项目。就像你曾经玩过沉降一样。很抱歉,如果我的代码看起来很糟糕,或者我的问题在新手程序员中是不可理解的。
答案 0 :(得分:0)
我会将库存设置为数组。数组的每个值都是一个对象变量,它将根据用户在其库存中的含量而变化。
答案 1 :(得分:0)
您需要将问题分解为多个部分。一部分定义了世界的行为方式(树木可以被切碎,产生x木),另一部分定义了玩家在任何特定时间持有的内容,而最后一部分获取该信息并将库存呈现给屏幕。
通过这种方式,您可以执行以下其他操作:拥有可以砍伐木材/拥有自己的库存等的NPC,而不会在整个地方散布重复的定义。除此之外,您还可以减少每个游戏需要保存的数据量,因为木材的定义不会改变,而玩家携带的木材数量会有多少。
所以你的GlobalItems将是一个包含类似......的字典
{Global.wood: {"Name": "Lumber",
"Icon": Art_lists.xxx,
"MaxStack": 20,
"Portable": True}
Global.tree: {"Name": "Ash tree"
"Chop": {Global.wood: 50},
"Portable": False}
}
您的广告资源将成为列表/数组:
[{"Type": Global.wood, "Count": 10},
{"Type": Global.leather, "Count": 5}]
如果要处理堆栈/保留项目位置,可以有多个库存条目:
[{"Type": Global.wood, "Count": 20},
None, # Blank space
{"Type": Global.wood, "Count": 15}
]
然后,您绘制广告资源的代码可以遍历广告资源列表,计算每个项目的当前图块位置,然后在Type
中查找GobalItems
以确定图标和其他有用信息。
关注点分离有多重好处:
请注意,这可能是分离可以从世界上的事物中获取的东西的论据,但这取决于您的游戏的工作方式。使用上述方法,您可以在世界中创建一个对象并将其标记为Global.tree
。为了避免错误,我已经添加了" Portable"标记,以确保您永远不会在您的库存中结束树,因为您错误标记了某些内容,您将收到错误。
如果玩家不能将任意物品丢入世界并在以后捡起它们,那么便携式/非便携式物品就没有理由在同一个列表中混淆。你可能会更好地了解最终可能存在于玩家库存中的事物列表,以及可以出现在游戏世界中的事物列表。