github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgTime/TimeRecoverInt.go (about)

     1  package kmgTime
     2  
     3  import (
     4  	"math"
     5  	"time"
     6  )
     7  
     8  //类似于体力一样的,每隔一定时间就会恢复一点(加一点)的值,
     9  //没有负值,不会超过最大值
    10  //如果执行时间向前退,不会报错
    11  type TimeRecoverInt struct {
    12  	Num             int
    13  	Max             int
    14  	LastRecoverTime time.Time
    15  	AddDuration     time.Duration
    16  }
    17  
    18  func (t *TimeRecoverInt) Sync(now time.Time) {
    19  	timeDuring := now.Sub(t.LastRecoverTime)
    20  	staminaTimes := float64(timeDuring) / float64(t.AddDuration)
    21  	addStamina := int(math.Floor(staminaTimes))
    22  	//添加体力后,体力满了
    23  	if (addStamina + t.Num) >= t.Max {
    24  		t.LastRecoverTime = now
    25  		t.Num = t.Max
    26  		return
    27  	}
    28  	//可能是数据错误,重置
    29  	if addStamina < 0 {
    30  		t.LastRecoverTime = now
    31  		return
    32  	}
    33  	//没有添加体力
    34  	if addStamina == 0 {
    35  		return
    36  	}
    37  	t.Num = addStamina + t.Num
    38  	t.LastRecoverTime = t.LastRecoverTime.Add(t.AddDuration * time.Duration(addStamina))
    39  	return
    40  }
    41  
    42  func (t *TimeRecoverInt) Full(now time.Time) {
    43  	t.Num = t.Max
    44  	t.LastRecoverTime = now
    45  }