public Cf3MapObjectfff(int nCX, int nCY) : base(f3MapObjectType.MOT_FUNYA) { m_DX = 0.0f; m_DY = 0.0f; m_OldDX = 0.0f; m_OldDY = 0.0f; m_Angle = 0.0f; m_DAngle = 0.0f; m_nPower = 0; m_Power = 0.0f; m_PowerX = 0.0f; m_PowerY = 0.0f; m_VOffsetX = 0; m_VOffsetY = 0; m_VOffsetToX = 0; m_VOffsetToY = 0; m_PoseCounter2 = 0; m_State = f3fffState.NORMAL; SetPos(nCX * 32 + 16, nCY * 32 + 18); m_OldX = m_X; m_OldY = m_Y; }
public override void OnMove() { if (!IsValid()) { return; } if (!m_pParent.IsPlayable()) { return; } float Wind = m_pParent.GetWind((int)Math.Floor(m_X / 32), (int)Math.Floor(m_Y / 32)); if (m_pParent.ItemCompleted()) { Smile(); } float ADX = m_X - m_OldX, ADY = m_Y - m_OldY, ADDX = m_DX - m_OldDX, ADDY = m_DY - m_OldDY; if (Cf3Setting.theSetting.m_Hyper != 0) { m_nPower = 16; } m_DAngle += (ADX * ADDY - ADY * ADDX) * ROTATEACCEL; m_DAngle -= m_DAngle * ROTATEFRICTION; m_Angle += m_DAngle; m_OldX = m_X; m_OldY = m_Y; m_OldDX = m_DX; m_OldDY = m_DY; // 動かしま~す if (m_State == f3fffState.NORMAL) { // 空中 float ddx = 0, ddy = 0; if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { ddx -= 1; } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { ddx += 1; } if (m_PowerY <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_UP)) { ddy -= 1; } if (m_PowerY >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { ddy += 1; } if (ddx * ddx + ddy * ddy > FLYACCEL * FLYACCEL) { float r = (float)(FLYACCEL / Math.Sqrt(ddx * ddx + ddy * ddy)); ddx *= r; ddy *= r; } for (int i = m_pInput.GetKeyPressed((int)F3KEY.F3KEY_JUMP) ? 0 : 1; i <= 1; i++) { m_DX -= (m_DX - Wind) * FLYFRICTION; m_DX += ddx; m_DY -= m_DY * FLYFRICTION; m_DY += ddy; } if (m_pInput.GetKeyPushed((int)F3KEY.F3KEY_ATTACK)) { BreatheIn(); } } else if (m_State == f3fffState.BREATHEIN) { // 冷気充填中 m_ChargePower += 2.0f; float ddx = 0, ddy = 0; if (m_PowerX <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_LEFT)) { ddx -= 1; } if (m_PowerX >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_RIGHT)) { ddx += 1; } if (m_PowerY <= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_UP)) { ddy -= 1; } if (m_PowerY >= 0 && m_pInput.GetKeyPressed((int)F3KEY.F3KEY_DOWN)) { ddy += 1; } if (ddx * ddx + ddy * ddy > FLYACCEL * FLYACCEL) { float r = (float)(FLYACCEL / Math.Sqrt(ddx * ddx + ddy * ddy)); ddx *= r; ddy *= r; } m_DX -= (m_DX - Wind) * FLYFRICTION; m_DX += ddx; m_DY -= m_DY * FLYFRICTION; m_DY += ddy; if (!m_pInput.GetKeyPressed((int)F3KEY.F3KEY_ATTACK)) { BreatheOut(); } } else if (m_State == f3fffState.BREATHEOUT) { // 冷気放出!! m_ChargePower -= 1.0f; m_DX -= (m_DX - Wind) * FLYFRICTION; m_DY -= m_DY * FLYFRICTION; if (m_ChargePower <= 0.0f) { if (m_nPower != 0) { m_State = f3fffState.NORMAL; } else { Tire(); } } } else if (m_State == f3fffState.TIRED) { // ちかれたー! m_PoseCounter--; m_DX -= (m_DX - Wind) * FLYFRICTION; m_DY -= m_DY * FLYFRICTION; if (m_PoseCounter == 0) { m_State = f3fffState.NORMAL; } } else if (m_State == f3fffState.FROZEN) { // 凍っちゃった… m_PoseCounter--; m_DX -= (m_DX - Wind) * FLYFRICTION / 5; m_DY -= m_DY * FLYFRICTION / 5; if (m_PoseCounter == 0) { m_State = f3fffState.NORMAL; } } // 速度飽和(めり込み防止) if (m_DX * m_DX + m_DY * m_DY > 13 * 13) { float r = (float)(13.0 / Math.Sqrt(m_DX * m_DX + m_DY * m_DY)); m_DX *= r; m_DY *= r; } // 実際の移動+当たり判定 // 1回の移動ごとに当たり判定 // という手順ですり抜けバグは解消されるはず m_X += m_DX; HitCheck(); m_Y += m_DY; HitCheck(); }