00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00024
00025 #include "spritelist.h"
00026
00030 SpriteList::SpriteList()
00031 {
00032 head=NULL;
00033 }
00034
00038 void SpriteList::Destroy()
00039 {
00040 Sprite *ptr=head;
00041 while(ptr!=NULL)
00042 {
00043 Sprite *tmp=ptr->next;
00044
00045 if(ptr->Deleteable())
00046 {
00047 delete ptr;
00048 }
00049 else
00050 {
00051 ptr->prev=ptr->next=NULL;
00052 }
00053
00054 ptr=tmp;
00055 }
00056
00057 head=NULL;
00058 }
00062 SpriteList::~SpriteList()
00063 {
00064 Destroy();
00065 }
00066
00070 Sprite *SpriteList::Head()
00071 {
00072 return(head);
00073 }
00074
00078 Sprite *SpriteList::Tail()
00079 {
00080 Sprite *spr=head;
00081 while(spr!=NULL)
00082 {
00083 if(spr->next==NULL) return(spr);
00084 spr=spr->next;
00085 }
00086
00087 return(NULL);
00088 }
00089
00094 bool SpriteList::Extract(Sprite *spr)
00095 {
00096 if(spr==NULL)
00097 {
00098 return(false);
00099 }
00100 else if(!Find(spr))
00101 {
00102 return(false);
00103 }
00104 else if(spr==head)
00105 {
00106 head=head->next;
00107 head->prev=NULL;
00108 spr->prev=spr->next=NULL;
00109 return(true);
00110 }
00111 else
00112 {
00113 if(spr->prev!=NULL) spr->prev->next=spr->next;
00114 if(spr->next!=NULL) spr->next->prev=spr->prev;
00115 spr->next=spr->prev=NULL;
00116 return(true);
00117 }
00118 }
00119
00123 bool SpriteList::Insert(Sprite *spr)
00124 {
00125 Sprite *ptr=NULL;
00126 if(spr==NULL) return(false);
00127 if(head==NULL) return(Prepend(spr));
00128
00129 ptr=head;
00130 while(ptr!=NULL)
00131 {
00132 if(ptr==spr) return(false);
00133 else if(spr->DrawLayer() <= ptr->DrawLayer()) break;
00134
00135 ptr=ptr->next;
00136 }
00137 {
00138 Sprite *tmp=ptr;
00139 while(tmp!=NULL)
00140 {
00141 if(tmp==spr) return(false);
00142 tmp=tmp->next;
00143 }
00144 }
00145
00146 if(ptr==NULL)
00147 {
00148 return(Append(spr));
00149 }
00150 else if(ptr==head)
00151 {
00152 return(Prepend(spr));
00153 }
00154 else
00155 {
00156 if(ptr->prev!=NULL) ptr->prev->next=spr;
00157 spr->prev=ptr->prev;
00158 spr->next=ptr;
00159 ptr->prev=spr;
00160 return(true);
00161 }
00162 }
00163
00167 bool SpriteList::Find(Sprite *spr)
00168 {
00169 Sprite *ptr=NULL;
00170 if(spr==NULL) return(false);
00171
00172 ptr=head;
00173 while(ptr!=NULL)
00174 {
00175 if(ptr==spr)
00176 {
00177 return(true);
00178 }
00179
00180 else if(ptr->DrawLayer() > spr->DrawLayer())
00181 {
00182 return(false);
00183 }
00184 ptr=ptr->next;
00185 }
00186 return(false);
00187 }
00188
00193 bool SpriteList::Append(Sprite *spr)
00194 {
00195 if(spr==NULL) return(false);
00196 if(head==NULL)
00197 {
00198 return(Prepend(spr));
00199 }
00200 else
00201 {
00202 Sprite *ptr=Tail();
00203 if(ptr==NULL) return(false);
00204 spr->prev=ptr;
00205 spr->next=NULL;
00206 ptr->next=spr;
00207 return(true);
00208 }
00209 }
00210
00215 bool SpriteList::Prepend(Sprite *spr)
00216 {
00217 if(spr==NULL) return(false);
00218 if(head==NULL)
00219 {
00220 spr->prev=spr->next=NULL;
00221 head=spr;
00222 return(true);
00223 }
00224 else
00225 {
00226 spr->prev=NULL;
00227 spr->next=head;
00228 head->prev=spr;
00229 head=spr;
00230 return(true);
00231 }
00232 }