Зачем вам вообще его обновлять, если у вас есть начальное значение и скорость увеличения, это достаточно простой расчет. StartValue + (HoursSinceStart * Rate)
, это закроет ваши дисплеи. Затем каждый раз, когда вы добавляете/удаляете ресурс с помощью определенного действия, вставляйте новую запись с суммой действия публикации и новой отметкой времени.
Например, используя Wood, User1 начинает со 100:
Ресурс
ResourceID Name HourlyIncrease
------------------------------------
1 Wood 100
2 Stone 100
3 Food 100
Пользовательский ресурс
UserID ResourceID Value CreatedDateTime
---------------------------------------------
1 1 100 2015-09-04 10:00:00
Чтобы получить значение в @DateTime, вы можете использовать:
DECLARE @DateTime DATETIME2 = SYSDATETIME(),
@UserID INT = 1,
@ResourceID INT = 1;
SELECT TOP 1
Quantity = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime))
FROM UserResource AS ur
INNER JOIN Resource AS r
ON r.ResourceID = ur.ResourceID
WHERE ur.ResourceID = @ResourceID
AND ur.UserID = @UserID
AND ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;
Затем, если пользователь делает что-то, что израсходует количество 50, просто создайте новую запись:
DECLARE @DateTime DATETIME2 = SYSDATETIME(),
@UserID INT = 1,
@ResourceID INT = 1,
QuantityChange INT = -50;
INSERT UserResource (UserID, ResourceID, Value, CreatedDateTime)
SELECT TOP 1
ur.UserID,
ur.ResourceID,
Value = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime)) + QuantityChange,
CreatedDateTime = @DateTime
FROM UserResource AS ur
INNER JOIN Resource AS r
ON r.ResourceID = ur.ResourceID
WHERE ur.ResourceID = @ResourceID
AND ur.UserID = @UserID
AND ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;
Таким образом, вы избегаете ненужных транзакций для вещей, которые предназначены только для демонстрации.
Н.Б. Я предположил, что ресурс будет увеличиваться только после завершения целого часа, если это не так, вам может понадобиться что-то вроде:
Quantity = Value + FLOOR((r.HourlyIncrease * DATEDIFF(SECOND, ur.CreatedDateTime, @DateTime) / 3600))
Тем не менее, для целей игры, если это будет постоянно увеличиваться, вероятно, лучше всего просто извлечь 3 компонента (скорость, время и начальное значение) и сохранить их в вашем сеансе, а затем выполнить расчет на сторона клиента.
person
GarethD
schedule
04.09.2015