SpriteSystem.cpp
Go to the documentation of this file.00001 //*** SpriteSystem.cpp *** 00002 00003 #include "SpriteSystem.h" 00004 #include "Debug.h" 00005 #include "SpriteManager.h" 00006 #include "ArrayIterator.h" 00007 #include "SpriteEventListener.h" 00008 00009 00010 //*** Constructor *** 00011 00012 SpriteSystem::SpriteSystem(): 00013 defaultSpriteManager_(0) 00014 { 00015 00016 // Add the default sprite manager 00017 AddSpriteManager(new SpriteManager()); 00018 } 00019 00020 00021 //*** Destructor *** 00022 00023 SpriteSystem::~SpriteSystem() 00024 { 00025 // Delete all managers 00026 for (int i=0; i<spriteManagers_.GetItemCount(); i++) 00027 { 00028 SpriteManager* spriteManager=spriteManagers_.Get(i); 00029 delete spriteManager; 00030 } 00031 00032 } 00033 00034 00035 //*** Update *** 00036 00037 void SpriteSystem::Update(float deltaTime) 00038 { 00039 // Update all managers 00040 for (int i=spriteManagers_.GetItemCount()-1; i>=0; i--) 00041 { 00042 SpriteManager* spriteManager=spriteManagers_.Get(i); 00043 spriteManager->Update(deltaTime); 00044 } 00045 } 00046 00047 00048 //*** Render *** 00049 00050 void SpriteSystem::Render(Bitmap& bitmap) 00051 { 00052 // Render all managers 00053 for (int i=spriteManagers_.GetItemCount()-1; i>=0; i--) 00054 { 00055 SpriteManager* spriteManager=spriteManagers_.Get(i); 00056 spriteManager->Render(bitmap); 00057 } 00058 } 00059 00060 00061 //*** GetDefaultSpriteManager *** 00062 00063 SpriteManager* SpriteSystem::GetDefaultSpriteManager() 00064 { 00065 // Make sure there's always a valid defult sprite manager 00066 if (!defaultSpriteManager_) 00067 { 00068 if (spriteManagers_.GetItemCount()>0) 00069 { 00070 defaultSpriteManager_=spriteManagers_.Get(spriteManagers_.GetItemCount()-1); 00071 } 00072 else 00073 { 00074 AddSpriteManager(new SpriteManager()); 00075 } 00076 } 00077 00078 Assert(defaultSpriteManager_,"No default sprite manager"); 00079 return defaultSpriteManager_; 00080 } 00081 00082 00083 //*** SetDefaultSpriteManager *** 00084 00085 void SpriteSystem::SetDefaultSpriteManager(SpriteManager* spriteManager) 00086 { 00087 defaultSpriteManager_=spriteManager; 00088 00089 // Check if the specified sprite manager is already in the manager list 00090 for (int i=0; i<spriteManagers_.GetItemCount(); i++) 00091 { 00092 if (spriteManagers_.Get(i)==spriteManager) 00093 { 00094 // Yes, it already exists, so we're done 00095 return; 00096 } 00097 } 00098 00099 // If not, add it now 00100 AddSpriteManager(spriteManager); 00101 } 00102 00103 00104 //*** GetSpriteManagerCount *** 00105 00106 int SpriteSystem::GetSpriteManagerCount() const 00107 { 00108 return spriteManagers_.GetItemCount(); 00109 } 00110 00111 00112 //*** GetSpriteManager *** 00113 00114 SpriteManager* SpriteSystem::GetSpriteManager(int index) const 00115 { 00116 return spriteManagers_.Get(index); 00117 } 00118 00119 00120 //*** AddSpriteManager *** 00121 00122 void SpriteSystem::AddSpriteManager(SpriteManager* spriteManager) 00123 { 00124 // Check if the specified sprite manager is already in the manager list 00125 ArrayIterator<SpriteManager*> it(spriteManagers_); 00126 if (it.Find(spriteManager)) 00127 { 00128 // Yes, it already exists, so just make sure the priority is correct 00129 UpdatePriority(spriteManager); 00130 return; 00131 } 00132 00133 // No, it's not already in the manager list, so insert it now 00134 spriteManagers_.Add(spriteManager); 00135 00136 // And make sure the priorities are correct 00137 UpdatePriority(spriteManager); 00138 00139 00140 // If there's no default sprite manager, make this one the default 00141 if (!defaultSpriteManager_) 00142 { 00143 defaultSpriteManager_=spriteManager; 00144 } 00145 } 00146 00147 00148 //*** RemoveSpriteManager *** 00149 00150 void SpriteSystem::RemoveSpriteManager(SpriteManager* spriteManager) 00151 { 00152 // Find the specified manager in the manager list 00153 ArrayIterator<SpriteManager*> it(spriteManagers_); 00154 if (it.Find(spriteManager)) 00155 { 00156 // If this was the default one, it is no longer valid 00157 if (defaultSpriteManager_==spriteManager) 00158 { 00159 defaultSpriteManager_=0; 00160 } 00161 00162 // Remove the sprite manager 00163 spriteManagers_.Remove(it); 00164 delete spriteManager; 00165 00166 return; 00167 } 00168 00169 // Manager not found, so report this in debug mode 00170 Assert(false,"Specified sprite manager could not be found"); 00171 } 00172 00173 00174 //*** UpdatePriority *** 00175 00176 void SpriteSystem::UpdatePriority(SpriteManager* spriteManager) 00177 { 00178 ArrayIterator<SpriteManager*> it(spriteManagers_); 00179 if (it.Find(spriteManager)) 00180 { 00181 spriteManagers_.Remove(it); 00182 00183 // Insert at the right position 00184 for (int i=0; i<spriteManagers_.GetItemCount(); i++) 00185 { 00186 SpriteManager* existingManager=spriteManagers_.Get(i); 00187 if (spriteManager->GetPriority()<existingManager->GetPriority()) 00188 { 00189 spriteManagers_.InsertBefore(spriteManager,i); 00190 return; 00191 } 00192 } 00193 00194 spriteManagers_.Add(spriteManager); 00195 return; 00196 } 00197 00198 Assert(false,"Sprite manager not found"); 00199 } 00200 00201 00202 //*** AddEventListener *** 00203 00204 void SpriteSystem::AddEventListener(SpriteEventListener* listener) 00205 { 00206 eventListeners_.Add(listener); 00207 } 00208 00209 00210 //*** RemoveEventListener *** 00211 00212 void SpriteSystem::RemoveEventListener(SpriteEventListener* listener) 00213 { 00214 ArrayIterator<SpriteEventListener*> it(eventListeners_); 00215 if (it.Find(listener)) 00216 { 00217 eventListeners_.Remove(it); 00218 } 00219 } 00220 00221 00222 //*** HasSpriteManager *** 00223 00224 bool SpriteSystem::HasSpriteManager(SpriteManager* spriteManager) const 00225 { 00226 ArrayIterator<SpriteManager*> it(spriteManagers_); 00227 return it.Find(spriteManager); 00228 } 00229 00230 00231 //*** SendEvent *** 00232 00233 void SpriteSystem::SendEvent(SpriteManager* spriteManager, StringId event, void* userData) 00234 { 00235 // Only send on the event if the we're controlling the specified manager 00236 ArrayIterator<SpriteManager*> it(spriteManagers_); 00237 if (it.Find(spriteManager)) 00238 { 00239 for (int i=0; i<eventListeners_.GetItemCount(); i++) 00240 { 00241 SpriteEventListener* listener=eventListeners_.Get(i); 00242 listener->OnSpriteEvent(event,userData); 00243 } 00244 } 00245 }
Reproduction/republishing of any material on this site without permission is strictly prohibited.
