コード例 #1
0
 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;
 }
コード例 #2
0
        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();
        }