//============================================================================== //移動処理 //============================================================================== //[input] // vTargetPos:対象位置 // pCam:カメラデバイス // pField:チェックするマップ // IsShowMark:マークが表示されているか //[return] // 移動中かどうか //============================================================================== bool CPlayer::Move( Selene::Math::Vector3D vTargetPos, CCamera *pCam, CField *pField, bool IsShowMark ) { if( IsShowMark ) { /*カメラ方向を基準に移動*/ m_vDirection.x = vTargetPos.x * pCam->GetRight().x + vTargetPos.y * (-pCam->GetFront().x); m_vDirection.y = 0.0f; m_vDirection.z = vTargetPos.x * pCam->GetRight().z + vTargetPos.y * (-pCam->GetFront().z); // float fLength = m_vDirection.Length(); m_fSpeed = fLength * m_fStSpeed ; if( m_fSpeed > 2.0f ) { m_fSpeed = 2.0f; } /*移動チェック*/ if( m_vDirection.Length() > 0.0f ) { if( vTargetPos.Length() > 0.5f ) { m_Rot.x = toF( Math::ATan2( -m_vDirection.z, -m_vDirection.x ) ); } /*正規化*/ m_vDirection /= fLength; /*移動(-1の場合は通れる)*/ if( MoveCheck( pField ) == -1 ) { m_vPos += m_vDirection * m_fSpeed; //CCommonObject::GetSoundMgr()->Play( CSoundManager::SND_PLAYERMOVE ); return true; } else { m_fSpeed = 0.0f; } } } return false; }
void State_Move::Update() { Player::Instance()->Move(); if (!MoveCheck()) { Player::Instance()->ChangeState(eSTATE::STAY); } if (Player::Instance()->IsAttack()) { Player::Instance()->ChangeState(eSTATE::ATTACK1); } }
//============================================================================== //移動処理 //============================================================================== //[input] // vTargetPos:対象位置 // pCam:カメラデバイス // pField:チェックするマップ //============================================================================== bool CCharacter::Move( Selene::Math::Vector3D vTargetPos, CCamera *pCam, CField *pField ) { m_vDirection.x = vTargetPos.x * pCam->GetRight().x + vTargetPos.y * (-pCam->GetFront().x); m_vDirection.y = 0.0f; m_vDirection.z = vTargetPos.x * pCam->GetRight().z + vTargetPos.y * (-pCam->GetFront().z); m_Rot.x = Math::ATan2( -m_vDirection.z, -m_vDirection.x ); float fLength = m_vDirection.Length(); m_fSpeed = fLength * 0.001f ; if( m_fSpeed > 2.0f ) { m_fSpeed = 2.0f; } /*移動チェック*/ if( m_vDirection.LengthSq() > 0.0f ) { /*正規化*/ m_vDirection /= fLength; /*移動(-1の場合は通れる)*/ if( MoveCheck( pField ) == -1 ) { m_vPos += m_vDirection * m_fSpeed; m_IsMoving = true; return true; } else { m_fSpeed = 0.0f; m_IsMoving = false; } } else { m_IsMoving = false; } return false; }
//============================================================================= //壁との判定 //============================================================================= //[input] // pField:フィールド //[return] // 壁に当たっているかどうか //============================================================================= bool CEnemyManta::HitCheckWall( CField *pField ) { m_HitRay.vStart = m_vPos + Math::Vector3D( 0.0f, 3.0f, 0.0f ); m_HitRay.vEnd = m_HitRay.vStart + m_vFront * 0.2f; Bool HitCheck = MoveCheck( pField ); //通れる箇所の設定 if( HitCheck == MASK_LAKE || HitCheck == -1 ) { return false; } return true; }
//============================================================================= //壁との判定 //============================================================================= //[input] // pField:フィールド //[return] // 壁に当たっているかどうか //============================================================================= bool CEnemyAmeus::HitCheckWall( CField *pField ) { m_HitRay.vStart = m_vPos + Math::Vector3D( 0.0f, 3.0f, 0.0f ); m_HitRay.vEnd = m_HitRay.vStart + m_vFront * 0.2f; Renderer::SCollisionResultExtend RetEx; Bool HitCheck = MoveCheck( pField ); //通れない箇所の設定 if( HitCheck == MASK_LAKE || HitCheck == MASK_OUT ) { return true; } else { return false; } }
//============================================================================== //移動処理 //============================================================================== //[input] // vTargetPos:対象位置 // pCam:カメラデバイス // pField:チェックするマップ // IsShowMark:マークが表示されているか //[return] // 移動中かどうか //============================================================================== bool CEnemyLizard::Move( Selene::Math::Vector3D vTargetPos, CCamera *pCam, CField *pField, bool IsShowMark ) { m_vDirection.x = vTargetPos.x * pCam->GetRight().x + vTargetPos.y * (-pCam->GetFront().x); m_vDirection.y = 0.0f; m_vDirection.z = vTargetPos.x * pCam->GetRight().z + vTargetPos.y * (-pCam->GetFront().z); m_Rot.x = toF( Math::ATan2( -m_vDirection.z, -m_vDirection.x ) ); float fLength = m_vDirection.Length(); m_fSpeed = fLength * 0.001f ; if( m_fSpeed > 2.0f ) { m_fSpeed = 2.0f; } /*移動チェック*/ if( m_vDirection.LengthSq() > 0.0f ) { /*正規化*/ m_vDirection /= fLength; /*移動(-1, 0の場合は通れる)*/ if( MoveCheck( pField ) == -1 ) { if( IsShowMark ) { m_Rot.y = DEG_TO_ANGLE( 0 ); m_vPos += m_vDirection * m_fSpeed; m_IsMoving = true; } return true; } /*壁の場合上る*/ else if( MoveCheck( pField ) == 0 ) { if( IsShowMark ) { m_Rot.y = DEG_TO_ANGLE( 90 ); m_vPos.y += m_vDirection.Length() * m_fSpeed; m_vPos.x += m_vDirection.x * m_fSpeed; } } else { m_fSpeed = 0.0f; m_IsMoving = false; } } else { m_IsMoving = false; } return false; }
//player move function //check if player can move to that location, if so whey yay they can move void Move(int &x,int &y,int xcen, int ycen,char Map[][MapMax]) { int c=Input(); if(!eventListener(x,y,xcen,ycen,Map,c)) { switch(c) { case KEY_UP: case 'w': if(MoveCheck(x,y,xcen,ycen,0,1,Map) == 0) //check if you can move to the next pos up y++; break; case KEY_DOWN: case 's': if(MoveCheck(x,y,xcen,ycen,0,-1,Map) == 0) //checks move down y--; break; case KEY_LEFT: case 'a': if(MoveCheck(x,y,xcen,ycen,-1,0,Map) == 0) //checks move left x--; break; case KEY_RIGHT: case 'd': if(MoveCheck(x,y,xcen,ycen,1,0,Map) == 0) //checks move right x++; break; case 'q': if(MoveCheck(x,y,xcen,ycen,-1,+1,Map) == 0 && (MoveCheck(x,y,xcen,ycen,0,+1,Map) == 0 || MoveCheck(x,y,xcen,ycen,-1,0,Map) == 0)) //check move NW { x--; y++; } break; case 'e': if(MoveCheck(x,y,xcen,ycen,+1,+1,Map) == 0 && (MoveCheck(x,y,xcen,ycen,0,+1,Map) == 0 || MoveCheck(x,y,xcen,ycen,+1,0,Map) == 0)) //check move NE { x++; y++; } break; case 'z': if(MoveCheck(x,y,xcen,ycen,-1,-1,Map) == 0 && (MoveCheck(x,y,xcen,ycen,0,-1,Map) == 0 || MoveCheck(x,y,xcen,ycen,-1,0,Map) == 0)) //check move SW { x--; y--; } break; case 'c': if(MoveCheck(x,y,xcen,ycen,+1,-1,Map) == 0 && (MoveCheck(x,y,xcen,ycen,0,-1,Map) == 0 || MoveCheck(x,y,xcen,ycen,+1,0,Map) == 0)) //check move SE { x++; y--; } break; case 'b': //Test Enter the Battle mode BattleMode = true; break; case 'n': DungeonMode = true; break; case '`': //Exit the game display play = false; break; case '~': //enable debug utility if(debug == false) debug = true; else debug = false; break; default: break; } } }