home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2009 February / maximum-cd-2009-02.iso / DiscContents / SMC_1.6_win32.exe / src / core / sprite_manager.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2008-07-01  |  6.5 KB  |  298 lines

  1. /***************************************************************************
  2.  * sprite_manager.cpp  -  Sprite Manager
  3.  *
  4.  * Copyright (C) 2005 - 2008 Florian Richter
  5.  ***************************************************************************/
  6. /*
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 3 of the License, or
  10.    (at your option) any later version.
  11.    
  12.    You should have received a copy of the GNU General Public License
  13.    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  14. */
  15.  
  16. #include "../core/sprite_manager.h"
  17. #include "../core/game_core.h"
  18. #include "../player/player.h"
  19. #include "../input/mouse.h"
  20. #include "../overworld/world_player.h"
  21.  
  22. /* *** *** *** *** *** *** cSprite_Manager *** *** *** *** *** *** *** *** *** *** *** */
  23.  
  24. cSprite_Manager :: cSprite_Manager( unsigned int reserve_items /* = 2000 */, unsigned int zpos_items /* = 100 */ )
  25. : cObject_Manager<cSprite>()
  26. {
  27.     objects.reserve( reserve_items );
  28.  
  29.     for( unsigned int i = 0; i < zpos_items; i++ )
  30.     {
  31.         zposdata.push_back( 0.0f );
  32.         zposdata_editor.push_back( 0.0f );
  33.     }
  34. }
  35.  
  36. cSprite_Manager :: ~cSprite_Manager( void )
  37. {
  38.     Delete_All();
  39. }
  40.  
  41. void cSprite_Manager :: Add( cSprite *sprite )
  42. {
  43.     // empty object
  44.     if( !sprite )
  45.     {
  46.         return;
  47.     }
  48.  
  49.     Set_Z( sprite );
  50.  
  51.     // Check if an destroyed object can be replaced
  52.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  53.     {
  54.         // get object pointer
  55.         cSprite *obj = (*itr);
  56.  
  57.         // if destroy is set
  58.         if( obj->destroy )
  59.         {
  60.             // set new object
  61.             *itr = sprite;
  62.             // delete old
  63.             delete obj;
  64.  
  65.             return;
  66.         }
  67.     }
  68.  
  69.     cObject_Manager<cSprite>::Add( sprite );
  70. }
  71.  
  72. cSprite *cSprite_Manager :: Copy( unsigned int identifier )
  73. {
  74.     if( identifier >= objects.size() )
  75.     {
  76.         return NULL;
  77.     }
  78.  
  79.     return objects[identifier]->Copy();
  80. }
  81.  
  82. void cSprite_Manager :: Delete_All( bool delayed /* = 0 */ )
  83. {
  84.     // clear z position data
  85.     for( unsigned int i = 0; i < zposdata.size(); i++ )
  86.     {
  87.         zposdata[i] = 0.0f;
  88.         zposdata_editor[i] = 0.0f;
  89.     }
  90.  
  91.     // delayed
  92.     if( delayed )
  93.     {
  94.         for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  95.         {
  96.             // get object pointer
  97.             cSprite *obj = (*itr);
  98.  
  99.             obj->Destroy();
  100.             obj->Collisions_Clear();
  101.         }
  102.     }
  103.     // instant
  104.     else
  105.     {
  106.         cObject_Manager<cSprite>::Delete_All();
  107.     }
  108.  
  109.     // todo : this should be elsewhere...
  110.     // clear collision data
  111.     if( pPlayer )
  112.     {
  113.         pPlayer->Collisions_Clear();
  114.         pPlayer->Reset_on_Ground();
  115.     }
  116.     if( pMouseCursor )
  117.     {
  118.         pMouseCursor->Collisions_Clear();
  119.     }
  120. }
  121.  
  122. cSprite *cSprite_Manager :: Get_First( SpriteType type )
  123. {
  124.     cSprite *first = NULL;
  125.  
  126.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  127.     {
  128.         // get object pointer
  129.         cSprite *obj = (*itr);
  130.  
  131.         if( obj->type == type && ( !first || obj->posz < first->posz ) )
  132.         {
  133.             first = obj;
  134.         }
  135.     }
  136.  
  137.     // return result
  138.     return first;
  139. }
  140.  
  141. cSprite *cSprite_Manager :: Get_Last( SpriteType type )
  142. {
  143.     cSprite *last = NULL;
  144.  
  145.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  146.     {
  147.         // get object pointer
  148.         cSprite *obj = (*itr);
  149.  
  150.         if( obj->type == type && ( !last || obj->posz > last->posz ) )
  151.         {
  152.             last = obj;
  153.         }
  154.     }
  155.  
  156.     // return result
  157.     return last;
  158. }
  159.  
  160. cSprite *cSprite_Manager :: Get_from_Position( int posx, int posy, SpriteType type /* = TYPE_UNDEFINED */ )
  161. {
  162.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  163.     {
  164.         // get object pointer
  165.         cSprite *obj = (*itr);
  166.  
  167.         if( static_cast<int>(obj->startposx) != posx || static_cast<int>(obj->startposy) != posy )
  168.         {
  169.             continue;
  170.         }
  171.  
  172.         // if type is given
  173.         if( type != TYPE_UNDEFINED )
  174.         {
  175.             // skip invalid type
  176.             if( obj->type != type )
  177.             {
  178.                 continue;
  179.             }
  180.         }
  181.  
  182.         // found
  183.         return obj;
  184.     }
  185.  
  186.     return NULL;
  187. }
  188.  
  189. void cSprite_Manager :: Get_Objects_sorted( SpriteList &new_objects, bool editor_sort /* = 0 */, bool with_player /* = 0 */ )
  190. {
  191.     new_objects = objects;
  192.  
  193.     if( with_player )
  194.     {
  195.         new_objects.push_back( pActive_Player );
  196.     }
  197.  
  198.     // z position sort
  199.     if( !editor_sort )
  200.     {
  201.         // default
  202.         sort( new_objects.begin(), new_objects.end(), zpos_sort() );
  203.     }
  204.     else
  205.     {
  206.         // editor
  207.         sort( new_objects.begin(), new_objects.end(), editor_zpos_sort() );
  208.     }
  209. }
  210.  
  211. void cSprite_Manager :: Update_Items_Valid_Draw( void )
  212. {
  213.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  214.     {
  215.         (*itr)->Update_Valid_Draw();
  216.     }
  217. }
  218.  
  219. void cSprite_Manager :: Update_Items( void )
  220. {
  221.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  222.     {
  223.         (*itr)->Update();
  224.     }
  225. }
  226.  
  227. void cSprite_Manager :: Draw_Items( void )
  228. {
  229.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  230.     {
  231.         (*itr)->Draw();
  232.     }
  233. }
  234.  
  235. void cSprite_Manager :: Handle_Collision_Items( void )
  236. {
  237.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  238.     {
  239.         // collision and movement handling
  240.         (*itr)->Collide_Move();
  241.         // handle found collisions
  242.         (*itr)->Handle_Collisions();
  243.     }
  244. }
  245.  
  246. unsigned int cSprite_Manager :: Get_Size_Array( ArrayType sprite_array )
  247. {
  248.     unsigned int count = 0;
  249.  
  250.     for( SpriteList::iterator itr = objects.begin(), itr_end = objects.end(); itr != itr_end; ++itr )
  251.     {
  252.         if( (*itr)->sprite_array == sprite_array )
  253.         {
  254.             count++;
  255.         }
  256.     }
  257.  
  258.     return count;
  259. }
  260.  
  261. void cSprite_Manager :: Set_Z( cSprite *sprite )
  262. {
  263.     // don't set animation z position
  264.     if( sprite->sprite_array == ARRAY_ANIM )
  265.     {
  266.         return;
  267.     }
  268.  
  269.     // set new z position if unset
  270.     if( sprite->posz <= zposdata[sprite->type] )
  271.     {
  272.         sprite->posz = zposdata[sprite->type] + 0.000001f;
  273.     }
  274.     // if editor Z position is given
  275.     if( sprite->editor_posz != 0 )
  276.     {
  277.         if( sprite->editor_posz <= zposdata_editor[sprite->type] )
  278.         {
  279.             sprite->editor_posz = zposdata_editor[sprite->type] + 0.000001f;
  280.         }
  281.     }
  282.  
  283.  
  284.     // update z position
  285.     if( sprite->posz > zposdata[sprite->type] )
  286.     {
  287.         zposdata[sprite->type] = sprite->posz;
  288.     }
  289.     // if editor Z position is given
  290.     if( sprite->editor_posz != 0 )
  291.     {
  292.         if( sprite->editor_posz > zposdata_editor[sprite->type] )
  293.         {
  294.             zposdata_editor[sprite->type] = sprite->editor_posz;
  295.         }
  296.     }
  297. }
  298.