home *** CD-ROM | disk | FTP | other *** search
- #include "Scene2D.h"
- #include "Object2D.h"
- #include "LogPtr.h"
- #include "String.h"
- #include "Hardware2D.h"
-
- Scene2D::Scene2D(Hardware2D * hardware)
- : hardware( hardware ),
- shift( 1 )
- {}
-
- Scene2D::~Scene2D()
- {
- if( !object_list.empty() )
- LogPtr()->error( "in Scene2D::~Scene2D() there remained objects in list" );
- }
-
- bool Scene2D::render(int camera_x, int camera_y, const Color & back_color)
- {
- if( shift.size() != 1 )
- {
- LogPtr()->warning( String("in Scene2D::render() after all pop_shift called") + String::convert(shift.size()) + "shifts left" );
- }
- shift.resize( 1 );
- shift[0] = Shift( camera_x, camera_y );
-
- if( !hardware )
- return false;
- hardware->fill( 0, 0, hardware->get_width(), hardware->get_height(), back_color );
-
- std::list<Object2D *>::iterator it = object_list.begin();
- for( ;it != object_list.end(); ++it )
- {
- if( (*it)->get_layer() >= hidden_layer() )
- break;
- push_shift_add( (*it)->get_x(), (*it)->get_y() );
- (*it)->render();
- pop_shift();
- }
- // std::for_each( object_list.begin(), object_list.end(), std::mem_fun( Object2D::render ) );
-
- hardware->flip();
- return true;
- }
-
- void Scene2D::push_shift_add(int shx, int shy)
- {
- shift.push_back( shift[ shift.size() - 1 ] + Shift( shx, shy ) );
- }
-
- void Scene2D::pop_shift()
- {
- if( shift.size() > 1 )
- {
- shift.pop_back();
- return;
- }
- LogPtr()->error("in Scene2D::pop_shift() shift stack undeflow");
- }
-
- HardwarePicture2D * Scene2D::load_picture(const Color * colors, unsigned width, unsigned height, unsigned stride)
- {
- if( !hardware )
- return 0;
- return hardware->load_picture( colors, width, height, stride );
- }
-
- void Scene2D::blit(HardwarePicture2D * pic, int alpha)
- {
- pic->blit( shift.back().x, shift.back().y, alpha );
- }
-
- void Scene2D::add_object2d(Object2D * obj)
- {
- std::list<Object2D *>::iterator it = object_list.begin();
- for( ;it != object_list.end(); ++it )
- if( (*it)->get_layer() > obj->get_layer() )
- break;
- object_list.insert( it, obj );
- }
-
- void Scene2D::remove_object2d(Object2D * obj)
- {
- object_list.remove( obj );
- }
-