home *** CD-ROM | disk | FTP | other *** search
- #include "Monster.h"
- #include "Level.h"
-
- static Direction get_random_direction()
- {
- const int random_number = rand()%16;
- if ( random_number < 4 )
- return Direction::LEFT;
- if ( random_number < 8 )
- return Direction::RIGHT;
- if ( random_number < 12 )
- return Direction::UP;
- if ( random_number < 16 )
- return Direction::DOWN;
-
- return Direction::STAND;
- }
-
- Direction Monster::make_new_descision()
- {
- Direction dir = get_random_direction();
- int i(0);
- while (!level->next_direction( this, dir ) )
- {
- dir = get_random_direction();
- ++i;
- if ( i > 3 )
- break;
- }
- return dir;
- }
-
- void Monster::life_cycle(float delta_time)
- {
- anim.move( get_position().get_x()-anim.get_width()/2, get_position().get_y()-anim.get_height()/2 );
- anim.life_cycle( delta_time );
- switch( state )
- {
- case CREATING:
- if( anim.is_finished() )
- change_state( LIVING );
- break;
- case LIVING:
- if ( pos.go_to( speed * delta_time ) )
- {
- if ( !level->next_direction( this, current_direction ) )
- {
- Direction dir = make_new_descision();
- change_direction( dir );
- }
- }
- break;
- case WEAK:
- current_weak_time += delta_time;
- if ( current_weak_time > weak_time )
- change_state( LIVING );
- if ( pos.go_to( speed * delta_time ) )
- {
- if ( !level->next_direction( this, current_direction ) )
- {
- Direction dir = make_new_descision();
- change_direction( dir );
- }
- }
- break;
- case DYING:
- if( anim.is_finished() )
- change_state( DEAD );
- break;
- case DEAD:
- current_eye_time += delta_time;
- if ( current_eye_time >= eye_time )
- {
- change_state( CREATING );
- break;
- }
- //Γετ≡εΣΦ≥ⁿ± ≈σ≡στ φσΩε≥ε≡εσ Γ≡σ∞
- if ( pos.go_to( speed * delta_time ) )
- {
- if ( !level->next_direction( this, current_direction ) )
- {
- Direction dir = make_new_descision();
- change_direction( dir );
- }
- }
- break;
- }
- }
-
- String Monster::get_name()const
- {
- return name;
- }
-
- float Monster::get_size()const
- {
- return anim.get_width();
- }
-
- void Monster::process_collision(const Creature * cre)
- {
- if ( cre->get_name() == "Pacman" )
- {
- if ( state == LIVING )
- {
- //cool :)
- }
- if ( state == WEAK )
- {
- change_state( DYING );
- }
- }
- }
-
- bool Monster::is_solid()const
- {
- return state != CREATING && state != DYING && state != DEAD;
- }
-
- void Monster::process_death(const Creature * cre)
- {
- if ( cre->get_name() == "Pacman" )
- change_state( DYING );
- if ( cre->get_name() == "PowerDot" )
- if( state == LIVING || state == WEAK )
- change_state( WEAK );
- }
-
- bool Monster::is_alive()const
- {
- return true; //?
- }
-
- Monster::Monster( Scene2D * scene, Level * level )
- : Creature( level ),
- anim( scene, 1, "data/monster_01" ),
- state( DEAD ),
- weak_time( 5 ),
- current_weak_time( 0 ),
- eye_time( 5 ),
- current_eye_time( 0 ),
- current_direction( Direction::STAND )
- {
- speed = 2; //∩ε ΦΣσσ ²≥ε Γ±σ Φτ ΦφΦ°ΩΦ
- change_state( CREATING );
- }
-
- void Monster::change_state( state_enum new_state )
- {
- // switch( state ) // ╧εΩΦφ≤≥ⁿ ∩≡σΣ√Σ≤∙σσ ±ε±≥ε φΦσ
- // {}
- speed = 2;
- state = new_state;
- switch( state ) // ╟αΘ≥Φ Γ φεΓεσ ±ε±≥ε φΦσ
- {
- case CREATING:
- level->move( this, "monster_start" );
- change_state( LIVING );
- break;
- case LIVING:
- anim.start( 0, true );
- anim.move( get_position().get_x()-anim.get_width()/2, get_position().get_y()-anim.get_height()/2 );
- name = "Monster";
- current_direction = Direction::STAND;
- break;
- case WEAK:
- current_weak_time = 0;
- name = "Cat";
- anim.start( 5, true );
- speed = 1;
- break;
- case DYING:
- change_state( DEAD );
- break;
- case DEAD:
- current_eye_time = 0;
- anim.start( 4, true );
- break;
- }
- }
-
- void Monster::change_direction( Direction dir )
- {
- if ( state == LIVING )
- if ( current_direction != dir )
- {
- switch( dir.get_dir() )
- {
- case Direction::RIGHT:
- anim.start(0,true);
- break;
- case Direction::LEFT:
- anim.start(2,true);
- break;
- case Direction::UP:
- anim.start(1,true);
- break;
- case Direction::DOWN:
- anim.start(3,true);
- break;
- }
- }
- current_direction = dir;
- }
-