void Player::OnKeyDown(const CL_InputEvent &key, const CL_InputState &state) { if (m_flags[eDead]) { //TODO: I was a bit lazy here, maybe introduce respawn key as a keybind? if (key.id == CL_KEY_F1) { Respawn(); } return; } //TODO: can this be turned into a switch-case without breaking logic? if (key.id == m_moveLeftKey) { m_moveLeftKeyPressed = true; StartMoving(eLeft); } if (key.id == m_moveRightKey) { m_moveRightKeyPressed = true; StartMoving(eRight); } if (key.id == m_jumpKey && !m_jumpKeyPressed) { m_jumpKeyPressed = true; StartJump(); } if (key.id == m_attackKey && !m_attackKeyPressed) { m_attackKeyPressed = true; StartAttack(); } }
void ShellBall::Refresh(const Vector3& StartPos, const Vector3& JumpVec, bool IsEnemyBall){ SetUpdateActive(true); SetDrawActive(true); m_StartPos = StartPos; m_JumpVec = JumpVec; m_InStartTime = 0; m_IsEnemyBall = IsEnemyBall; //Transform取得 auto Ptr = GetComponent<Transform>(); Ptr->SetScale(m_NowScale); Ptr->SetPosition(m_StartPos); //描画コンポーネント auto PtrDraw = GetComponent<PNTStaticDraw>(); if (m_IsEnemyBall){ PtrDraw->SetDiffuse(Color4(1.0f, 1.0f, 0, 1.0f)); } else{ PtrDraw->SetDiffuse(Color4(0.0f, 1.0f, 0, 1.0f)); } //衝突判定を呼び出す auto PtrCollision = GetComponent<CollisionSphere>(); //衝突は無効にしておく PtrCollision->SetUpdateActive(false); //重力を取り出す auto PtrGravity = GetComponent<Gravity>(); //ジャンプスタート PtrGravity->StartJump(m_JumpVec); //今のステートをFiringStateに設定 m_StateMachine->SetCurrentState(FiringState::Instance()); //FiringStateの初期化実行を行う m_StateMachine->GetCurrentState()->Enter(GetThis<ShellBall>()); }
//初期化 void ShellBall::Create(){ //Transformだけは追加しなくても取得できる auto Ptr = GetComponent<Transform>(); Ptr->SetScale(m_NowScale); Ptr->SetRotation(0, 0, 0.0f); Ptr->SetPosition(m_StartPos); //重力をつける auto PtrGravity = AddComponent<Gravity>(); //最下地点 PtrGravity->SetBaseY(0.125f); //ジャンプスタート PtrGravity->StartJump(m_JumpVec); //影の作成 auto ShadowPtr = AddComponent<Shadowmap>(); //影の形状 ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE"); //描画コンポーネント auto PtrDraw = AddComponent<BasicPNTDraw>(); //メッシュの登録 PtrDraw->SetMeshResource(L"DEFAULT_SPHERE"); PtrDraw->SetDiffuse(Color4(1.0f, 1.0f, 0, 1.0f)); //ステートマシンの構築 m_StateMachine = make_shared< StateMachine<ShellBall> >(GetThis<ShellBall>()); //最初のステートをFiringStateに設定 m_StateMachine->SetCurrentState(FiringState::Instance()); //FiringStateの初期化実行を行う m_StateMachine->GetCurrentState()->Enter(GetThis<ShellBall>()); }
void CPlayerStateJump::OnJump( CPlayer& player, const bool isHeavyWeapon, const float fVerticalSpeedModifier ) { player.GetMoveRequest().type = eCMT_JumpInstant; player.GetMoveRequest().jumping = true; StartJump( player, isHeavyWeapon, fVerticalSpeedModifier ); NETINPUT_TRACE( player.GetEntityId(), (m_jumpState == JState_Jump) ); }
//砲弾と衝突した瞬間の処理 void RollingTorus::ShellHitMotion(){ //衝突判定を得る auto PtrCollision = GetComponent<CollisionSphere>(); //ヒットしたときのみこの関数は呼ばれるので //PtrCollision->GetHitObject()には必ず値が入っているが //一応、確認しておく if (PtrCollision->GetHitObject()){ auto ShellPtr = dynamic_pointer_cast<ShellBall>(PtrCollision->GetHitObject()); if (ShellPtr){ //相手が砲弾だった //相手がプレイヤーの可能性があるので、チェックする //スコアオブジェクトにイベント送出 auto PtrScoreObject = GetStage()->GetSharedGameObject<ScoreObject>(L"ScoreObject"); PostEvent(0, GetThis<RollingTorus>(), PtrScoreObject, L"TorusHit"); } //相手のTransformを得る。 auto PtrOtherTrans = PtrCollision->GetHitObject()->GetComponent<Transform>(); //相手の場所を得る auto OtherPos = PtrOtherTrans->GetPosition(); //Transformを得る。 auto PtrTrans = GetComponent<Transform>(); //場所を得る auto Pos = PtrTrans->GetPosition(); //飛ぶ方向を計算する Pos -= OtherPos; Pos.Normalize(); Pos.y = 0; Pos *= 4.0f; Pos += Vector3(0, 4.0f, 0); //回転開始 m_RotationSpeed = m_MaxRotationSpeed; //衝突を相手も含めなしにする PtrCollision->ClearBothHitObject(); //衝突は無効にしておく PtrCollision->SetUpdateActive(false); //重力を得る auto PtrGravity = GetComponent<Gravity>(); //ジャンプスタート PtrGravity->StartJump(Pos); } }
//初期化 void ShellBall::Create(){ //Transformだけは追加しなくても取得できる auto Ptr = GetComponent<Transform>(); Ptr->SetScale(m_NowScale); Ptr->SetRotation(0, 0, 0.0f); Ptr->SetPosition(m_StartPos); //衝突判定をつける auto PtrCollision = AddComponent<CollisionSphere>(); //衝突は無効にしておく PtrCollision->SetUpdateActive(false); //砲弾のグループを得る auto Group = GetStage()->GetSharedObjectGroup(L"ShellBallGroup"); //砲弾同士は衝突しないようにしておく PtrCollision->SetExcludeCollisionGroup(Group); //重力をつける auto PtrGravity = AddComponent<Gravity>(); //最下地点 PtrGravity->SetBaseY(0.125f); //ジャンプスタート PtrGravity->StartJump(m_JumpVec); //影の作成 auto ShadowPtr = AddComponent<Shadowmap>(); //影の形状 ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE"); //描画コンポーネント auto PtrDraw = AddComponent<BasicPNTDraw>(); //メッシュの登録 PtrDraw->SetMeshResource(L"DEFAULT_SPHERE"); if (m_IsEnemyBall){ PtrDraw->SetDiffuse(Color4(1.0f, 1.0f, 0, 1.0f)); } else{ PtrDraw->SetDiffuse(Color4(0.0f, 1.0f, 0, 1.0f)); } //ステートマシンの構築 m_StateMachine = make_shared< StateMachine<ShellBall> >(GetThis<ShellBall>()); //最初のステートをFiringStateに設定 m_StateMachine->SetCurrentState(FiringState::Instance()); //FiringStateの初期化実行を行う m_StateMachine->GetCurrentState()->Enter(GetThis<ShellBall>()); }
//Aボタンでジャンプする瞬間の処理 void Player::JumpMotion(){ auto PtrTrans = GetComponent<Transform>(); //重力 auto PtrGravity = GetComponent<Gravity>(); //ジャンプスタート Vector3 JumpVec(0.0f, 4.0f, 0); if (PtrTrans->GetParent()){ //親がいたら、アクションコンポーネントの移動アクションを探す //移動ボックスに乗っている場合、その慣性をジャンプに加算する auto ActionPtr = PtrTrans->GetParent()->GetComponent<Action>(false); if (ActionPtr){ JumpVec += ActionPtr->GetVelocity(); } } PtrGravity->StartJump(JumpVec); }
void NPC::TakeAction(BasicAction action, int timeElapsedMs) { //TODO: terrible code, consider using references switch (action) { case eAttack: { StopMoving(); StartAttack(); //TODO: might need to override break; } case eMove: { //compiler mistook this for the Move() method.. // reset speed to normal if (m_flags[eAffectedByGravity] && !m_flags[eJumping] && !m_flags[eFalling]) { m_speeds[eXSpeed] = m_speedX; m_speeds[eYSpeed] = m_speedY; } StartMoving(GetDirection()); break; } case eFlee: { // reset speed to normal if (m_flags[eAffectedByGravity] && !m_flags[eJumping] && !m_flags[eFalling]) { m_speeds[eXSpeed] = m_speedX; m_speeds[eYSpeed] = m_speedY; } //avoid colliding with the character //TODO: WHAT? This makes no sense (even before refactor) StartMoving(m_direction == eLeft ? eRight : eLeft); break; } case eJump: { StartJump(); break; } case eShoot: { Shoot(m_attackType); break; } default: { StopMoving(); if (!m_flags[eAffectedByGravity]) { m_speeds[eXSpeed] = 0; m_speeds[eYSpeed] = 0; } break; } } }
void CASW_Alien_Jumper::HandleAnimEvent( animevent_t *pEvent ) { int nEvent = pEvent->Event(); if ( nEvent == AE_ASW_ALIEN_START_JUMP ) { StartJump(); return; } else if ( nEvent == AE_ASW_ALIEN_GLIDE ) { SetActivity(ACT_GLIDE); return; } BaseClass::HandleAnimEvent( pEvent ); }
//初期化 void RollingTorus::Create(){ //Transformだけは追加しなくても取得できる auto Ptr = GetComponent<Transform>(); Ptr->SetScale(0.5f, 0.5f, 0.5f); Ptr->SetRotation(XM_PIDIV2, m_YRot, 0.0f); Ptr->SetPosition(m_StartPos); //衝突判定をつける auto PtrCollision = AddComponent<CollisionSphere>(); //トーラスのグループを得る auto Group = GetStage()->GetSharedObjectGroup(L"RollingTorusGroup"); //トーラス同士は衝突しないようにしておく PtrCollision->SetExcludeCollisionGroup(Group); //重力をつける auto PtrGravity = AddComponent<Gravity>(); //最下地点 PtrGravity->SetBaseY(0.25f); //ジャンプスタート PtrGravity->StartJump(Vector3(0,4.0f,0)); //影の作成 auto ShadowPtr = AddComponent<Shadowmap>(); //影の形状 ShadowPtr->SetMeshResource(L"DEFAULT_TORUS"); //描画コンポーネント auto PtrDraw = AddComponent<BasicPNTDraw>(); //メッシュの登録 PtrDraw->SetMeshResource(L"DEFAULT_TORUS"); PtrDraw->SetDiffuse(Color4(1.0f, 1.0f, 0, 1.0f)); //ステートマシンの構築 m_StateMachine = make_shared< StateMachine<RollingTorus> >(GetThis<RollingTorus>()); //最初のステートをDefaultStateに設定 m_StateMachine->SetCurrentState(TorusDefaultState::Instance()); //DefaultStateの初期化実行を行う m_StateMachine->GetCurrentState()->Enter(GetThis<RollingTorus>()); }
void ShellBall::Refresh(const Vector3& StartPos, const Vector3& JumpVec){ SetUpdateActive(true); SetDrawActive(true); m_StartPos = StartPos; m_JumpVec = JumpVec; //Transform取得 auto Ptr = GetComponent<Transform>(); Ptr->SetScale(m_NowScale); Ptr->SetPosition(m_StartPos); //描画コンポーネント auto PtrDraw = GetComponent<BasicPNTDraw>(); PtrDraw->SetDiffuse(Color4(1.0f, 1.0f, 0, 1.0f)); //重力を取り出す auto PtrGravity = GetComponent<Gravity>(); //ジャンプスタート PtrGravity->StartJump(m_JumpVec); //今のステートをFiringStateに設定 m_StateMachine->SetCurrentState(FiringState::Instance()); //FiringStateの初期化実行を行う m_StateMachine->GetCurrentState()->Enter(GetThis<ShellBall>()); }
void Enemy3NearState::Enter(const shared_ptr<Enemy3>& Obj) { auto PtrGrav = Obj->GetBehavior<Gravity>(); PtrGrav->StartJump(Vec3(0, 4.0f, 0)); }
//衝突時 void Enemy2::OnCollision(vector<shared_ptr<GameObject>>& OtherVec) { if (m_StateMachine->GetCurrentState() == Enemy2MediumState::Instance()) { auto PtrGrav = GetBehavior<Gravity>(); PtrGrav->StartJump(Vec3(0, 4.0f, 0)); } }
void PlayerJumpState::Enter(const shared_ptr<Player>& Obj) { auto PtrGrav = Obj->GetBehavior<Gravity>(); PtrGrav->StartJump(Vec3(0, 4.0f, 0)); }
void Cf3MapObjectfunya::OnMove() { if (!IsValid()) return; if (!m_pParent->IsPlayable()) return; if (m_bFirst) { HitCheck(); m_bFirst = false; } float Wind = m_pParent->GetWind(floor(m_X/32),floor(m_Y/32)); float Friction = m_pParent->GetFriction(floor(m_X/32),floor((m_Y+14)/32)); float Gravity = GetGravity(); if (m_pParent->ItemCompleted()) Smile(); if (theSetting->m_Hyper) m_nPower=4; // 動かしま〜す if (m_State==STANDING||m_State==SLEEPING||m_State==BLINKING) { // 立ってるとき m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION; BringClose(m_DX,0.0f,Friction); if (m_DX==0) m_Direction = DIR_FRONT; if (m_State==STANDING && ++m_Sleepy>=30*40/3) Sleep(); if (m_State==BLINKING && --m_PoseCounter==0) m_State = STANDING; if (m_State==STANDING && CApp::random(120)==0) Blink(); if (m_PowerY<=0 && m_pInput->GetKeyPressed(F3KEY_JUMP)) StartJump(); if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) Run(DIR_LEFT); if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) Run(DIR_RIGHT); if (m_pInput->GetKeyPressed(F3KEY_DOWN)) Sit(); if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn(); if (!m_HitBottom) { Fall(); } }ef(m_State==RUNNING) { // 走ってるとき int AXL = 0, AXR = 0; if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1; if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1; m_DX -= Friction*(m_DX-Wind)*RUNFRICTION; m_DX += Friction*2.0f*(AXR-AXL); if (AXL&&!AXR) m_Direction = DIR_LEFT; if (AXR&&!AXL) m_Direction = DIR_RIGHT; if (!AXL&&!AXR) Stop(); if (m_PowerY<=0 && m_pInput->GetKeyPressed(F3KEY_JUMP)) StartJump(); if (m_pInput->GetKeyPressed(F3KEY_DOWN)) Sit(); if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn(); if (!m_HitBottom) { Fall(); } }ef(m_State==WALKING) { // 歩いてるとき int AXL = 0, AXR = 0; if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1; if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1; m_DX += WALKACCEL*(AXR-AXL); m_DX -= m_DX*WALKFRICTION; if (AXL&!AXR) m_Direction = DIR_LEFT; if (AXR&!AXL) m_Direction = DIR_RIGHT; if (!AXL&!AXR) m_Direction = DIR_FRONT; if (!m_pInput->GetKeyPressed(F3KEY_DOWN)) Stop(); if (m_PowerY<=0 && m_pInput->GetKeyPushed(F3KEY_JUMP)) StartJump(); if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn(); if (!m_HitBottom) Fall(); }ef(m_State==CHARGING) { // パワー充填中 if (m_ChargePower>0) { m_ChargePower -= m_ChargeDec; if (m_ChargePower<0) m_ChargePower = 0; } m_X -= m_DX; if (m_pInput->GetKeyPushed(F3KEY_DOWN)) Sit(); if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn(); if (!m_pInput->GetKeyPressed(F3KEY_JUMP)) Jump(); if (!m_HitBottom) Fall(); }ef(m_State==JUMPING) { // 空中 if (m_DY>=0) { int AXL = 0, AXR = 0; if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1; if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1; m_DX -= (m_DX-Wind)*JUMPFRICTIONX; m_DX += JUMPACCEL*(AXR-AXL); if (AXL&!AXR) m_Direction = DIR_LEFT; if (AXR&!AXL) m_Direction = DIR_RIGHT; } if (m_HitLeft||m_HitRight) m_Direction = DIR_FRONT; m_DY += Gravity; if (m_DY>=0) { if (m_PowerY>=0 && m_pInput->GetKeyPressed(F3KEY_DOWN)) m_DY += Gravity*ADDGRAVITY; m_DY -= m_DY*JUMPFRICTIONY; if (m_pInput->GetKeyPressed(F3KEY_UP)) { m_DY += Gravity; m_DY -= m_DY*JUMPFRICTIONY; } } if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn(); if (m_HitBottom) Land(); }ef(m_State==BREATHEIN) { // 冷気充填中 m_ChargePower+=1.0f; if (m_pInput->GetKeyPushed(F3KEY_LEFT)) m_Direction = DIR_LEFT; if (m_pInput->GetKeyPushed(F3KEY_RIGHT)) m_Direction = DIR_RIGHT; if (m_pInput->GetKeyPushed(F3KEY_UP)) m_Direction = DIR_FRONT; if (m_HitBottom) { m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION; BringClose(m_DX,0.0f,Friction); if (m_pInput->GetKeyPushed(F3KEY_DOWN)) Sit(); }else { m_ChargePower+=1.0f; if (m_DY>=0) { m_DX -= (m_DX-Wind)*JUMPFRICTIONX; } m_DY += Gravity; if (m_DY>=0) { m_DY -= m_DY*JUMPFRICTIONY; } } if (!m_pInput->GetKeyPressed(F3KEY_ATTACK)) BreatheOut(); }ef(m_State==BREATHEOUT) { // 冷気放出!! m_ChargePower-=1.0f; if (m_HitBottom) { m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION; BringClose(m_DX,0.0f,Friction); }else { if (m_DY>=0) { m_DX -= (m_DX-Wind)*JUMPFRICTIONX; } m_DY += Gravity; if (m_DY>=0) { m_DY -= m_DY*JUMPFRICTIONY; } } if (m_ChargePower<=0.0f) { if (m_nPower) { if (m_HitBottom) Land(); else Fall(); }else { Tire(); } } }ef(m_State==TIRED) { // ちかれたー! m_PoseCounter--; if (m_HitBottom) { m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION; BringClose(m_DX,0.0f,Friction); }else { m_DX -= (m_DX-Wind)*JUMPFRICTIONX; if (m_HitLeft||m_HitRight) m_Direction = DIR_FRONT; m_DY += Gravity; m_DY -= m_DY*JUMPFRICTIONY; } if (m_PoseCounter==0) Land(); }ef(m_State==FROZEN) { // 凍っちゃった… m_PoseCounter--; if (m_HitBottom) { m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION/5; BringClose(m_DX,0.0f,Friction/5); }else { m_DX -= (m_DX-Wind)*JUMPFRICTIONX/5; m_DY += Gravity*(1+ADDGRAVITY); m_DY -= m_DY*JUMPFRICTIONY/5; } if (m_PoseCounter==0) Land(); } // 速度飽和(めり込み防止) Saturate(-RUNMAX,m_DX,RUNMAX); Saturate(-JUMPMAX,m_DY,FALLMAX); // 実際の移動+当たり判定 // 1回の移動ごとに当たり判定 // という手順ですり抜けバグは解消されるはず m_HitLeft = m_HitRight = m_HitTop = m_HitBottom = false; m_X += m_DX; HitCheck(); if (!m_HitTop&&!m_HitBottom) { m_Y += m_DY; HitCheck(); } }