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