我有一个如下的Dialogue系统课程
class DIALOGUE(object):
def __init__(self, place, who, sTime, eTime, isActive, mood, menuText, func, repeatable, num):
self.place = place
self.who = who
self.sTime = sTime
self.eTime = eTime
self.isActive = isActive
self.mood = mood
self.menuText = menuText
self.func = func
self.repeatable = repeatable
self.num = num
@property
def ACheck(self):
global Date
if self.sTime == "none":
return True
else:
tHour,tMin = self.sTime.split(":")
if tHour >= Date.Hour and tMin <= Date.Minute:
tHour,tMin = self.eTime.split(":")
if tHour < Date.Hour and tMin < Date.Minute:
return True
return False
@property
def BCheck(self):
global Act
if self.who == Act:
return True
else:
return False
@property
def CCheck(self):
global Location
if self.place == Location:
return True
if self.place == "none":
return True
return False
@property
def DCheck(self):
if self.repeatable:
return True
else:
if self.num > 0:
return False
else:
return True
@property
def CanChat(self):
if self.isActive and self.ACheck and self.BCheck and self.CCheck and self.DCheck:
return True
else:
return False
def SetActive(self):
self.isActive = True
def Do(self):
self.num += 1
renpy.call(self.func)
其中大多数应该是不言自明的,但是我将XML文件解析为此类的实例列表。
根据用户所处的位置,一天中的什么时间以及他们选择的NPC,向用户显示可用对话框的列表。如果对话是不可重复的,则DCheck方法将检查对话是否在对话之前已完成,即对话是否不可重复,并且self.num > 0
将返回False
基本上,它会循环所有对话并执行i.CanChat
,如果此值返回True,则将Dialogue添加到菜单
我遇到的问题是Check方法未返回正确的值。具体来说,无论对话是否可重复,DCheck始终都会返回True,并且忽略self.num
在init python:
块中创建该类,然后在单独的python块中解析xml文件,该python块从开始标签内部调用
这可能真的很简单,但我无法弄清楚。
实例列表解析如下
Dialogues = []
for j in Dialo:
JPlace = j.find('Place').text
JWho = j.find('Who').text
JsTime = j.find('Start').text
JeTime = j.find('End').text
JMood = int(j.find('Mood').text)
JText = j.find('Text').text
JFunc = j.find('Func').text
JRep = j.find('Rep').text
if JRep == "True":
Jrep = True
else:
Jrep = False
Dialogues.append(DIALOGUE(JPlace, JWho, JsTime, JeTime, False, JMood, JText, JFunc, JRep, 0))
创建菜单的方法如下
def TalkCheck():
talks = []
talks.append(("Nevermind.", "none"))
for i, q in enumerate(Dialogues):
if q.CanChat:
talks.append((q.menuText,i))
renpy.say(None, "", interact=False)
talkchoice = renpy.display_menu(talks)
if talkchoice <> "none":
talkchoice = int(talkchoice)
Dialogues[talkchoice].Do()
答案 0 :(得分:0)
您的问题不完整-您未发布MCVE,我们不知道导致此行为的“ repeatble”和“ num”的有效值,甚至不知道它是否使用Python 2 .x或Python 3.x-因此我们可以尝试猜测。现在,既然您提到您“将XML文件解析为实例列表”,我就完全怀疑您正在运行Python 2.x,并将这些值作为字符串而不是(重复)布尔值和整数传递。在Python 2中,"-1"
(字符串)比较的值大于0
(int)-在Python 3.x中它引发一个TypeError
,并且在两种情况下,非空字符串都等于True
在布尔值上下文(bool('False') == True
)中。由于在您的方法实现中没有明显的逻辑错误,所以这是我能想到的唯一解释。
顺便说一句,表达式具有布尔值,并且return
退出了函数,因此您可以简化代码:
@property
def DCheck(self):
if self.repeatable:
return True
return self.num > 0