У меня проблема, надеюсь, вы мне поможете. В моем проекте у меня есть виртуальное время, которое запускается при запуске скрипта (24 виртуальных секунды за 1 реальную секунду). Это время записывается в список и передается нужным классам из основного. Список состоит из пяти элементов [0, 0, 0, 0, 0]: первый - это минуты, второй - часы, третий - дни, четвертый - месяцы, а пятый - годы.
self.gTime = self.__engine.time
self.vTime = copy.deepcopy(self.gTime)
gTime
- общее виртуальное время, а vTime
- переменное время в соответствии с событиями.
__grow = {
"0": [10, 0, 0, 0, 0],
"1": [10, 0, 0, 0, 0],
"2": [10, 0, 0, 0, 0],
"3": [10, 0, 0, 0, 0],
"4": [10, 0, 0, 0, 0],
}
Это мини-словарь, в котором должно произойти пять событий. Эти события (числа внутри в настоящее время предназначены для тестирования) простыми словами представляют, сколько времени должно пройти, чтобы это событие произошло. Каждый раз, когда происходит это событие, vTime
обновляется значением gTime
, и цикл продолжается для следующей фазы.
Итак, я создал эту функцию:
def update_age(self):
if self.__age <= len(self.__grow) - 1:
for i, n in enumerate(self.gTime):
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
self.vTime = copy.deepcopy(self.gTime)
self.__age += 1
else:
pass
Где age
определяет, какое событие должно произойти.
Теперь, если я запускаю сценарий, я получаю эту ошибку:
if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
KeyError: '5'
Кроме того, до того, как сценарий завершится ошибкой, я вижу, что последовательность событий происходит слишком быстро.
Если вместо этого я заменю self.__grow[str (self.__age)][i]
на, например, 10, сценарий будет работать правильно.
Как мне изменить, чтобы он работал правильно? Спасибо за вашу помощь.
EDIT:
Прокрутка времени в основном классе создается следующим образом:
self.__time = [0, 0, 0, 0, 0, 0, 0]
self.time = [0, 0, 0, 0, 0]
def __time_update(self):
time = datetime.now()
if int(time.strftime("%S")) != self.__time[0]:
self.__time[0] = copy.deepcopy(int(time.strftime("%S")))
if self.__time[1] >= 60:
self.__time[1] = self.__time[1] - 60
self.__time[2] += 1
if self.__time[2] >= 60:
self.__time[2] = 0
self.__time[3] += 1
if self.__time[3] >= 24:
self.__time[3] = 0
self.__time[4] += 1
if self.__time[4] >= 30:
self.__time[4] = 0
self.__time[5] += 1
if self.__time[5] >= 4:
self.__time[5] = 0
self.__time[6] += 1
self.__time[1] += 24
if self.__time[2] % 10 == 0:
self.time[0] = copy.deepcopy(self.__time[2])
self.time[1] = copy.deepcopy(self.__time[3])
self.time[2] = copy.deepcopy(self.__time[4])
self.time[3] = copy.deepcopy(self.__time[5])
self.time[4] = copy.deepcopy(self.__time[6])
__time
каждый раз, когда вы выходите из скрипта сохраняется извне и перезагружается при повторном запуске скрипта.
Первая часть, например, должна имитировать рост дерева (состоящий из пяти фаз), который должен начинаться, как только объект будет сгенерирован. Всякий раз, когда age
изменяется (и, следовательно, имеет место фаза), спрайт изменяется на новый.
EDIT 2:
К сожалению, предлагаемое решение при устранении сгенерированной ошибки, из другого типа проблемы: Щелкните, чтобы увидеть изображение В первой части это то, как вы видите, как он выполняет предлагаемые изменения. Вторая часть в теории - это то, как должно быть (при тестировании изменение до последней фазы должно происходить каждые 10 минут), что я получил, заменив self.__grow[str (self.__age)][i]
, например, 10. Последняя часть - ошибка.
Либо я изменяю способ работы виртуальных часов, либо я не знаю, как искренне их решить ...
РЕДАКТИРОВАТЬ 3:
В конце концов, мне удалось решить создание внешнего модуля:
from datetime import datetime
from copy import deepcopy
gTime = [0, 0, 0, 0, 0]
name_day = 0
__dt = 0
__s = 0
__m = 0
__h = 0
__dy = 0
__st = 0
__mh = 0
__y = 0
__local = "it"
__nDay = {
"en": {
"0": "Monday",
"1": "Tuesday",
"2": "Wednesday",
"3": "Thursday",
"4": "Friday",
"5": "Saturday",
"6": "Sunday"
},
"it": {
"0": "Lunedì",
"1": "Martedì",
"2": "Mercoledì",
"3": "Giovedì",
"4": "Venerdì",
"5": "Sabato",
"6": "Domenica"
},
}
def time_update():
global __dt, __s, __m, __h, __dy, __st, __mh, __y, gTime, name_day
vTime = datetime.now()
if int(vTime.strftime("%S")) != __dt:
__dt = deepcopy(int(vTime.strftime("%S")))
if __s >= 60:
__s = __s - 60
__m += 1
if __m >= 60:
__m = 0
__h += 1
if __h >= 24:
__h = 0
__dy += 1
__st += 1
if __st >= 7:
__st = 0
if __dy >= 30:
__dy = 0
__mh += 1
if __mh >= 4:
__mh = 0
__y += 1
__s += 24
if __m % 10 == 0:
gTime[0] = deepcopy(__m)
gTime[1] = deepcopy(__h)
gTime[2] = deepcopy(__dy)
gTime[3] = deepcopy(__mh)
gTime[4] = deepcopy(__y)
name_day = __nDay[__local][str(__st)]
def calculation_time(vList, cList):
m = vList[0] + cList[0]
h = vList[1] + cList[1]
d = vList[2] + cList[2]
ms = vList[3] + cList[3]
y = vList[4] + cList[4]
if m >= 60:
h += 1
m = 0
if h >= 24:
d += 1
h = 0
if d >= 30:
ms += 1
d = 0
if ms >= 4:
y += 1
ms = 0
if gTime[0] >= m:
if gTime[1] >= h:
if gTime[2] >= d:
if gTime[3] >= ms:
if gTime[4] >= y:
return True
time_update()
он вызывается основным классом каждый раз, когда он обновляется, а calculation_time()
он вызывается отдельными классами сущностей, которым необходимо знать время, чтобы вызвать другое поведение.
Спасибо всем, кто ответил, и я надеюсь, что это кому-то поможет в будущем.