Button.cpp
Go to the documentation of this file.00001 //*** Button.cpp ** 00002 00003 #include "Button.h" 00004 #include "BitmapStrip.h" 00005 #include "Bitmap.h" 00006 #include "SpriteControllerManager.h" 00007 #include "SpriteController.h" 00008 #include "SpriteAction_ButtonStateCrossFade.h" 00009 00010 00011 //*** Default Constructor *** 00012 00013 Button::Button(): 00014 state_(State_Normal), 00015 enabled_(true), 00016 highlighted_(false), 00017 eventUserData_(0), 00018 stateCrossFadeTime_(0.25f), 00019 stateCrossFadeFromState_(State_Normal), 00020 stateCrossFadeFromAlpha_(0), 00021 stateCrossFadeToAlpha_(0) 00022 { 00023 } 00024 00025 00026 //*** Constructor (SpriteManager) *** 00027 00028 Button::Button(SpriteManager* spriteManager): 00029 Sprite(spriteManager), 00030 state_(State_Normal), 00031 enabled_(true), 00032 highlighted_(false), 00033 eventUserData_(0), 00034 stateCrossFadeTime_(0.25f), 00035 stateCrossFadeFromState_(State_Normal), 00036 stateCrossFadeFromAlpha_(0), 00037 stateCrossFadeToAlpha_(0) 00038 { 00039 } 00040 00041 00042 //*** Destructor *** 00043 00044 Button::~Button() 00045 { 00046 } 00047 00048 00049 //*** GetBitmap *** 00050 00051 const Resource_BitmapStrip& Button::GetBitmap() const 00052 { 00053 if (bitmapStrips_[GetState()].GetCelCount()!=0) 00054 { 00055 return bitmapStrips_[GetState()]; 00056 } 00057 00058 if (bitmapStrips_[State_Normal].GetCelCount()!=0) 00059 { 00060 return bitmapStrips_[State_Normal]; 00061 } 00062 00063 return Sprite::GetBitmap(); 00064 } 00065 00066 00067 //*** GetBitmap *** 00068 00069 const Resource_BitmapStrip& Button::GetBitmap(Button::State state) const 00070 { 00071 return bitmapStrips_[state]; 00072 } 00073 00074 00075 //*** SetBitmap *** 00076 00077 void Button::SetBitmap(Button::State state, const Resource_BitmapStrip& bitmapStrip) 00078 { 00079 bitmapStrips_[state]=bitmapStrip; 00080 } 00081 00082 00083 //*** GetState *** 00084 00085 Button::State Button::GetState() const 00086 { 00087 return state_; 00088 } 00089 00090 00091 //*** SetState *** 00092 00093 void Button::SetState(Button::State state) 00094 { 00095 if (state==state_) 00096 { 00097 return; 00098 } 00099 00100 if (SpriteControllerManager::IsInstanceCreated() && stateCrossFadeTime_ && bitmapStrips_[state].GetCelCount()!=0) 00101 { 00102 SpriteController* controller=siSpriteControllerManager->AcquireSpriteController(this); 00103 static StringId idButtonStateCrossFadeAction("ButtonStateCrossFadeAction"); 00104 controller->RemoveAction(idButtonStateCrossFadeAction); 00105 controller->AddAction(new SpriteAction_ButtonStateCrossFade(stateCrossFadeTime_),0,0,0,idButtonStateCrossFadeAction); 00106 siSpriteControllerManager->ReleaseSpriteController(controller); 00107 } 00108 else 00109 { 00110 stateCrossFadeFromAlpha_=0; 00111 } 00112 stateCrossFadeFromState_=state_; 00113 state_=state; 00114 } 00115 00116 00117 //*** IsEnabled *** 00118 00119 bool Button::IsEnabled() const 00120 { 00121 return enabled_; 00122 } 00123 00124 00125 //*** SetEnabled *** 00126 00127 void Button::SetEnabled(bool enabled) 00128 { 00129 if (enabled_==enabled) 00130 { 00131 return; 00132 } 00133 00134 enabled_=enabled; 00135 00136 if (enabled_) 00137 { 00138 SetState(State_Normal); 00139 } 00140 else 00141 { 00142 SetState(State_Disabled); 00143 } 00144 } 00145 00146 00147 //*** GetEventId *** 00148 00149 StringId Button::GetEventId() const 00150 { 00151 return eventId_; 00152 } 00153 00154 00155 //*** SetEventId *** 00156 00157 void Button::SetEventId(StringId eventId) 00158 { 00159 eventId_=eventId; 00160 } 00161 00162 00163 //*** GetEventUserData *** 00164 00165 void* Button::GetEventUserData() const 00166 { 00167 return eventUserData_; 00168 } 00169 00170 00171 //*** SetEventUserData *** 00172 00173 void Button::SetEventUserData(void* userData) 00174 { 00175 eventUserData_=userData; 00176 } 00177 00178 00179 //*** GetCrossFadeTime *** 00180 00181 float Button::GetCrossFadeTime() const 00182 { 00183 return stateCrossFadeTime_; 00184 } 00185 00186 00187 //*** SetCrossFadeTime *** 00188 00189 void Button::SetCrossFadeTime(float time) 00190 { 00191 stateCrossFadeTime_=time; 00192 } 00193 00194 00195 //*** SetStateCrossFadeAlpha *** 00196 00197 void Button::SetStateCrossFadeAlpha(unsigned char fromAlpha, unsigned char toAlpha) 00198 { 00199 stateCrossFadeFromAlpha_=fromAlpha; 00200 stateCrossFadeToAlpha_=toAlpha; 00201 } 00202 00203 00204 //*** Render *** 00205 00206 void Button::Render(Bitmap& bitmap) 00207 { 00208 Sprite::Render(bitmap); 00209 00210 if (!IsVisible()) 00211 { 00212 return; 00213 } 00214 00215 if (IsEnabled() && !highlighted_ && (GetState()==State_Highlighted || GetState()==State_Pressed)) 00216 { 00217 SetState(State_Normal); 00218 } 00219 00220 highlighted_=false; 00221 00222 if (stateCrossFadeFromAlpha_>0) 00223 { 00224 unsigned char fromAlpha=(unsigned char)((((int)stateCrossFadeFromAlpha_)*GetAlpha())/256); 00225 unsigned char toAlpha=(unsigned char)((((int)stateCrossFadeToAlpha_)*GetAlpha())/256); 00226 GetBitmap(stateCrossFadeFromState_).Blit((int)GetCel(),bitmap,(int)(GetX()-GetOriginX()),(int)(GetY()-GetOriginY()),GetColor(),fromAlpha); 00227 GetBitmap().Blit((int)GetCel(),bitmap,(int)(GetX()-GetOriginX()),(int)(GetY()-GetOriginY()),GetColor(),toAlpha); 00228 } 00229 else 00230 { 00231 GetBitmap().Blit((int)GetCel(),bitmap,(int)(GetX()-GetOriginX()),(int)(GetY()-GetOriginY()),GetColor(),GetAlpha()); 00232 } 00233 } 00234 00235 00236 //*** OnMouseOver *** 00237 00238 bool Button::OnMouseOver(int x, int y, bool button, StringId& eventId, void*& userData) 00239 { 00240 if (!enabled_) 00241 { 00242 return false; 00243 } 00244 00245 if (GetBitmap().GetCelCount()==0) 00246 { 00247 return false; 00248 } 00249 00250 const Bitmap& bitmap=GetBitmap().GetCel((int)GetCel()); 00251 if (bitmap.GetPixelAlpha(x-(int)(GetX()+GetOriginX()),y-(int)(GetY()+GetOriginY()))>128) 00252 { 00253 if (enabled_) 00254 { 00255 highlighted_=true; 00256 if (button) 00257 { 00258 SetState(State_Pressed); 00259 } 00260 else 00261 { 00262 SetState(State_Highlighted); 00263 } 00264 } 00265 00266 eventId=eventId_; 00267 userData=eventUserData_; 00268 00269 return true; 00270 } 00271 00272 return false; 00273 } 00274 00275
Reproduction/republishing of any material on this site without permission is strictly prohibited.
