PlayerBehavior::CONTROLL PlayerBehavior::makeControll( ) { PlayerBehavior::CONTROLL controll; if ( _controll ) { // 自分で動かす DevicePtr device = Device::getTask( ); unsigned char button = device->getButton( ); CameraPtr camera = Camera::getTask( ); PlayerCameraPtr p_camera = std::dynamic_pointer_cast< PlayerCamera >( camera ); Vector move_vec = p_camera->getConvertDeviceVec( ); Character::STATUS status = _parent->getStatus( ); move_vec = move_vec.normalize( ) * status.speed;//プレイヤーの進行ベクトル controll.move = move_vec; if ( button & BUTTON_D ) { controll.action = CONTROLL::DEATHBLOW; } else if ( button & BUTTON_A ) { controll.action = CONTROLL::ATTACK; } else { controll.action = CONTROLL::NONE; } } else { // ネットから動かす ClientPtr client = Client::getTask( ); CLIENTDATA data = client->getClientData( ); Vector target; target.x = data.player[ _player_id ].x; target.y = data.player[ _player_id ].y; Vector vec = target - _parent->getPos( ); Character::STATUS status = _parent->getStatus( ); if ( vec.getLength( ) > status.speed * 2 ) { vec = vec.normalize( ) * status.speed; controll.move = vec; } switch ( data.player[ _player_id ].action ) { case ACTION_NONE: controll.action = CONTROLL::NONE; break; case ACTION_ATTACK: controll.action = CONTROLL::ATTACK; break; case ACTION_DEATHBLOW: controll.action = CONTROLL::MUSTDEATHBLOW; break; } } return controll; }
void PlayerBehavior::walk( const CONTROLL& controll ) { if ( _before_state != PLAYER_STATE_ATTACK && _before_state != PLAYER_STATE_DEAD && !isDeathblow( ) ) { if ( controll.move.getLength( ) > 0.0 ) { //進める場合移動 _parent->move( controll.move ); if ( _controll ) { Vector pos = _parent->getPos( ); int x = ( int )pos.x; int y = ( int )pos.y; ClientPtr client = Client::getTask( ); CLIENTDATA status = client->getClientData( ); if ( status.player[ _player_id ].x != x || status.player[ _player_id ].y != y ) { SERVERDATA data; data.command = COMMAND_STATUS_POS; data.value[ 0 ] = _player_id; data.value[ 1 ] = x; data.value[ 2 ] = y; client->send( data ); } } _player_state = PLAYER_STATE_WALK; } bool long_wait = ( _player_state == PLAYER_STATE_WAIT && _animation->getAnimTime( ) > 10 ); if ( _player_state == PLAYER_STATE_WALK || long_wait ) { _attack_pattern = 0; } pickupCrystal( controll ); } }