1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_MoveValue.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 13145 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_SND_MOVE_VALUE_H_
17 #define NW_SND_MOVE_VALUE_H_
18 
19 namespace nw {
20 namespace snd {
21 namespace internal {
22 
23 template< typename ValueType, typename CountType >
24 class MoveValue
25 {
26   public:
27     /*---------------------------------------------------------------------------*
28       Name:         MoveValue
29 
30       Description:  コンストラクタ
31 
32       Arguments:    なし
33 
34       Returns:      なし
35      *---------------------------------------------------------------------------*/
MoveValue()36     MoveValue() : m_Origin(0), m_Target(0), m_Frame(0), m_Counter(0) {}
37 
38     /*---------------------------------------------------------------------------*
39       Name:         InitValue
40 
41       Description:  値を初期化
42 
43       Arguments:    value : 初期化値
44 
45       Returns:      なし
46      *---------------------------------------------------------------------------*/
InitValue(ValueType value)47     void InitValue( ValueType value )
48     {
49         m_Origin  = value;
50         m_Target  = value;
51         m_Frame   = 0;
52         m_Counter = 0;
53     }
54 
55     /*---------------------------------------------------------------------------*
56       Name:         SetTarget
57 
58       Description:  変化させる値の目的値を設定する
59 
60       Arguments:    targetValue : 目的値
61                     frames : 変化に要するフレーム数
62 
63       Returns:      なし
64      *---------------------------------------------------------------------------*/
SetTarget(ValueType targetValue,CountType frames)65     void SetTarget( ValueType targetValue, CountType frames )
66     {
67         m_Origin  = GetValue();
68         m_Target  = targetValue;
69         m_Frame   = frames;
70         m_Counter = 0;
71     }
72 
73     /*---------------------------------------------------------------------------*
74       Name:         GetTarget
75 
76       Description:  変化させる値の目的値を取得する
77 
78       Arguments:    targetValue : 目的値
79                     frames : 変化に要するフレーム数
80 
81       Returns:      なし
82      *---------------------------------------------------------------------------*/
GetTarget()83     ValueType GetTarget() const { return m_Target; }
84 
85     /*---------------------------------------------------------------------------*
86       Name:         GetValue
87 
88       Description:  現在の値を取得する
89 
90       Arguments:    なし
91 
92       Returns:      現在の値
93      *---------------------------------------------------------------------------*/
GetValue()94     ValueType GetValue() const
95     {
96         if ( IsFinished() ) return m_Target;
97         return static_cast<ValueType>(
98             m_Origin + ( m_Target - m_Origin ) * m_Counter / m_Frame
99         );
100     }
101 
102     /*---------------------------------------------------------------------------*
103       Name:         Update
104 
105       Description:  値を更新する
106 
107       Arguments:    なし
108 
109       Returns:      なし
110      *---------------------------------------------------------------------------*/
Update()111     void Update() { if ( m_Counter < m_Frame ) ++m_Counter; }
112 
113     /*---------------------------------------------------------------------------*
114       Name:         IsFinished
115 
116       Description:  カウンタが完了しているかどうかを返す
117 
118       Arguments:    なし
119 
120       Returns:      完了していたら true
121      *---------------------------------------------------------------------------*/
IsFinished()122     bool IsFinished() const { return m_Counter >= m_Frame; }
123 
124     /*---------------------------------------------------------------------------*
125       Name:         GetRemainingCount
126 
127       Description:  ターゲット値に達するまでの残りのUpdate回数を取得する
128 
129       Arguments:    なし
130 
131       Returns:      残りのUpdate回数
132      *---------------------------------------------------------------------------*/
GetRemainingCount()133     CountType GetRemainingCount() const
134     {
135         if ( IsFinished() ) return static_cast<CountType>( 0 );
136         return m_Frame - m_Counter;
137     }
138 
139   private:
140     ValueType m_Origin;
141     ValueType m_Target;
142     CountType m_Frame;
143     CountType m_Counter;
144 };
145 
146 } // namespace nw::snd::internal
147 } // namespace nw::snd
148 } // namespace nw
149 
150 #endif /* NW_SND_MOVE_VALUE_H_ */
151