protected virtual void CheckCollisionWithCharacter()
 {
     for (int i = 0; i < _laserSegmentCount; i++)
     {
         Vector2 segmentVec = _laserSegmentList[i].GetSegmentVec();
         // 分段长度小于等于0,不进行判定
         if (segmentVec.y - segmentVec.x <= 0)
         {
             continue;
         }
         // 直线碰撞检测
         float minDis = MathUtil.GetMinDisFromPointToLineSegment(_pathList[(int)segmentVec.x], _pathList[(int)segmentVec.y], Global.PlayerPos);
         // 擦弹判断
         if (minDis <= DefaultCollisionHalfHeight + Global.PlayerGrazeRadius)
         {
             if (!_isGrazed)
             {
                 _isGrazed      = true;
                 _grazeCoolDown = GrazeCoolDown;
                 PlayerInterface.GetInstance().AddGraze(1);
             }
             if (minDis <= DefaultCollisionHalfHeight + Global.PlayerCollisionVec.z)
             {
                 PlayerInterface.GetInstance().GetCharacter().BeingHit();
                 // 直线激光击中玩家不消除
                 //Eliminate(eEliminateDef.HitPlayer);
             }
         }
     }
 }
Exemple #2
0
    private void UpdateGrazeValue()
    {
        int graze = PlayerInterface.GetInstance().GetGraze();

        if (graze != _curGraze)
        {
            int bit = GetBit(graze);
            // 显示、隐藏多余的位数
            if (bit > _grazeBitCount)
            {
                for (int i = _grazeBitCount; i < bit; i++)
                {
                    _grazeImgList[i].gameObject.SetActive(true);
                }
            }
            else if (bit < _grazeBitCount)
            {
                for (int i = bit; i < _grazeBitCount; i++)
                {
                    _grazeImgList[i].gameObject.SetActive(false);
                }
            }
            // 从个位开始显示擦弹数目
            int num;
            for (int i = bit; i > 0; i--)
            {
                num = graze % 10;
                _grazeImgList[i - 1].sprite = ResourceManager.GetInstance().GetSprite(Consts.STGMainViewAtlasName, BigNumStr + num);
                graze /= 10;
            }
        }
    }
 protected virtual void CheckCollisionWithCharacter()
 {
     if (!_detectCollision) return;
     if (_curWidth == 0 || _curLength == 0 || _curAlpha < 1) return;
     Vector2 center = new Vector2();
     float cos = Mathf.Cos(_curRotation * Mathf.Deg2Rad);
     float sin = Mathf.Sin(_curRotation * Mathf.Deg2Rad);
     // 矩形中心坐标
     center.x = _laserHalfLength * cos + _curPos.x;
     center.y = _laserHalfLength * sin + _curPos.y;
     Vector2 vec = _player.GetPosition() - center;
     float dw = Mathf.Max(0, Mathf.Abs(cos * vec.x + sin * vec.y) - _laserHalfLength);
     float tmpY = Mathf.Abs(-sin * vec.x + cos * vec.y);
     float dh = Mathf.Max(0, tmpY - _laserHalfWidth);
     float sqrDis = dw * dw + dh * dh;
     if (sqrDis <= _player.grazeRadius * _player.grazeRadius)
     {
         if (!_isGrazed)
         {
             _isGrazed = true;
             PlayerInterface.GetInstance().AddGraze(1);
             _grazeCoolDown = GrazeCoolDown;
         }
         dh = Mathf.Max(0, tmpY - _laserHalfWidth * _collisionFactor);
         sqrDis = dw * dw + dh * dh;
         if (sqrDis <= _player.collisionRadius * _player.collisionRadius)
         {
             Eliminate(eEliminateDef.HitPlayer);
             PlayerInterface.GetInstance().GetCharacter().BeingHit();
         }
     }
 }
Exemple #4
0
    /// <summary>
    /// 获取玩家当前是否可以移动
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int GetPlayerIsMovable(ILuaState luaState)
    {
        bool isMovable = PlayerInterface.GetInstance().GetCharacter().IsMovable;

        luaState.PushBoolean(isMovable);
        return(1);
    }
 public virtual void Init()
 {
     _instID      = ObjectsPool.GetInstance().GetNewInstanceID();
     _isAvailable = true;
     _curDir      = Consts.DIR_NULL;
     _isExplosive = false;
     if (_tasks == null)
     {
         _tasks = new List <Task>();
     }
     if (_movableObj == null)
     {
         _movableObj = ObjectsPool.GetInstance().GetPoolClassAtPool <MovableObject>();
     }
     _taskCount                     = 0;
     _isWandering                   = false;
     _isInteractive                 = true;
     _onHitFuncRef                  = 0;
     _onEliminateFuncRef            = 0;
     _resistEliminateFlag           = 0;
     _attachmentsCount              = 0;
     _isFollowingMasterContinuously = false;
     _isFollowMasterRotation        = false;
     _player = PlayerInterface.GetInstance().GetCharacter();
 }
Exemple #6
0
    /// <summary>
    /// 与玩家发生碰撞
    /// </summary>
    protected virtual void CollidedByPlayer()
    {
        CharacterBase player = PlayerInterface.GetInstance().GetCharacter();

        player.BeingHit();
        _collidedByPlayer?.Invoke(this, player);
    }
Exemple #7
0
    private void RenderPlayer()
    {
        CharacterBase player = PlayerInterface.GetInstance().GetCharacter();
        Color         col    = new Color(50f / 255, 255f / 255, 50f / 255);

        RenderCircle(player.GetPosition(), player.collisionRadius, col);
    }
Exemple #8
0
    /// <summary>
    /// 设置玩家当前是否可以移动
    /// <para>isMovable </para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetPlayerIsMovable(ILuaState luaState)
    {
        bool isMovable = luaState.ToBoolean(-1);

        PlayerInterface.GetInstance().GetCharacter().IsMovable = isMovable;
        return(0);
    }
    /// <summary>
    /// 做加速运动(限制最大速度)
    /// <para>bullet 敌机子弹</para>
    /// <para>float acce 加速度</para>
    /// <para>float angle 速度方向 or bool useVAngle使用速度方向</para>
    /// <para>bool isAimToPlayer 是否朝向玩家</para>
    /// <para>float maxVelocity 最大速度限制</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int EnemyBulletDoAccelerationWithLimitation(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase;
        float           acce   = (float)luaState.ToNumber(-4);
        float           angle;

        if (luaState.Type(-3) == LuaType.LUA_TBOOLEAN)
        {
            bullet.GetBulletPara(BulletParaType.VAngel, out angle);
        }
        else
        {
            angle = (float)luaState.ToNumber(-3);
        }
        bool  isAimToPlayer = luaState.ToBoolean(-2);
        float maxVelocity   = (float)luaState.ToNumber(-1);

        luaState.Pop(5);
        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            angle += MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition());
        }
        bullet.DoAccelerationWithLimitation(acce, angle, maxVelocity);
        return(0);
    }
Exemple #10
0
    /// <summary>
    /// 设置直线运动参数
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int STGMovableSetStraightParas(ILuaState luaState)
    {
        ISTGMovable movableObject = luaState.ToUserData(-6) as ISTGMovable;
        float       v             = (float)luaState.ToNumber(-5);
        float       angle         = (float)luaState.ToNumber(-4);
        bool        isAimToPlayer = luaState.ToBoolean(-3);
        float       acce          = (float)luaState.ToNumber(-2);
        float       accAngle;

        if (luaState.Type(-1) == LuaType.LUA_TBOOLEAN && luaState.ToBoolean(-1) == true)
        {
            accAngle = angle;
        }
        else
        {
            accAngle = (float)luaState.ToNumber(-1);
        }
        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            float   relAngle  = MathUtil.GetAngleBetweenXAxis(playerPos - movableObject.GetPosition());
            angle    += relAngle;
            accAngle += relAngle;
        }
        movableObject.SetStraightParas(v, angle, acce, accAngle);
        return(0);
    }
Exemple #11
0
 /// <summary>
 /// 玩家死亡之后消失
 /// </summary>
 private void OnPlayerMiss()
 {
     _isGameOver = !PlayerInterface.GetInstance().Miss();
     if (_isGameOver)
     {
         _gameOverTimeCounter = 0;
     }
 }
Exemple #12
0
 public override void Update()
 {
     _moveMode   = _character.curModeMode;
     _powerLevel = PlayerInterface.GetInstance().GetPower() / 100;
     //UpdatePos();
     Shoot();
     UpdateAni();
 }
Exemple #13
0
    /// <summary>
    /// 设置玩家的位置
    /// <para>posX</para>
    /// <para>posY</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetPlayerPos(ILuaState luaState)
    {
        float posX = (float)luaState.ToNumber(-2);
        float posY = (float)luaState.ToNumber(-1);

        PlayerInterface.GetInstance().GetCharacter().SetPosition(posX, posY);
        return(0);
    }
Exemple #14
0
 public SCEffect()
 {
     _go     = ResourceManager.GetInstance().GetPrefab("Prefab/Character/ReimuA", "ReimuASC");
     _tf     = _go.transform;
     _ps     = _go.GetComponent <ParticleSystem>();
     _timer  = 0;
     _player = PlayerInterface.GetInstance().GetCharacter();
     UIManager.GetInstance().AddGoToLayer(_go, LayerId.STGNormalEffect);
 }
Exemple #15
0
 /// <summary>
 /// 疮痍之后继续游戏
 /// </summary>
 private void OnContinueAfterGameOver()
 {
     ReplayManager.GetInstance().SetReplayEnable(false);
     Global.IsPause = false;
     _isGameOver    = false;
     _resumeSTGSE   = true;
     // 设置初始残机数和符卡数目
     PlayerInterface.GetInstance().SetLifeCounter(Consts.STGInitLifeCount, 0);
     PlayerInterface.GetInstance().SetSpellCardCounter(Consts.STGInitSpellCardCount, 0);
 }
Exemple #16
0
    protected override void CheckCollisionWithPlayer()
    {
        float dis = Vector2.Distance(_curPos, Global.PlayerPos);

        if (dis <= Global.PlayerCollisionVec.z + _radius)
        {
            CharacterBase player = PlayerInterface.GetInstance().GetCharacter();
            CollidedByObject(player);
        }
    }
    protected override void CheckCollisionWithPlayer()
    {
        CharacterBase player = PlayerInterface.GetInstance().GetCharacter();

        // 由于只计算1次,所以省略掉矩形判定的步奏
        if (MathUtil.DetectCollisionBetweenCircleAndOBB(player.GetPosition(), player.collisionRadius, _curPos, _halfWidth, _halfHeight, _curRotation))
        {
            CollidedByPlayer();
        }
    }
 public virtual void Init()
 {
     _curState      = eState.MoveUp;
     _curTime       = 0;
     _curDuration   = 90;
     _vy            = UpVy;
     _clearFlag     = 0;
     _character     = PlayerInterface.GetInstance().GetCharacter();
     _isAboveBorder = false;
     _aboveY        = Consts.ItemTopBorderY;
 }
Exemple #19
0
    protected override void CheckCollisionWithPlayer()
    {
        Vector2 playerPos             = Global.PlayerPos;
        float   playerCollisionRadius = Global.PlayerCollisionVec.z;

        if (Mathf.Abs(playerPos.x - _curPos.x) <= _halfWidth + playerCollisionRadius &&
            Mathf.Abs(playerPos.y - _curPos.y) <= _halfHeight + playerCollisionRadius)
        {
            CharacterBase player = PlayerInterface.GetInstance().GetCharacter();
            CollidedByObject(player);
        }
    }
Exemple #20
0
 public void InitCharacter()
 {
     _character = PlayerInterface.GetInstance().GetCharacter();
     if (!Global.IsInReplayMode)
     {
         _keyList = new List <eSTGKey>();
     }
     else
     {
         _keyList = ReplayManager.GetInstance().GetReplayKeyList();
     }
     _lastInput = eSTGKey.None;
     _curInput  = eSTGKey.None;
 }
Exemple #21
0
    /// <summary>
    /// 初始化STG的数据、玩家对象、控制器等
    /// </summary>
    public void InitSTG(int characterIndex)
    {
        _char         = PlayerInterface.GetInstance().CreateCharacter(characterIndex);
        _opController = OperationController.GetInstance();
        _opController.InitCharacter();
        InterpreterManager.GetInstance().SetGlobalField("player", _char, LuaParaType.LightUserData);

        // 设置初始残机数和符卡数目
        PlayerInterface.GetInstance().SetLifeCounter(Consts.STGInitLifeCount, 0);
        PlayerInterface.GetInstance().SetSpellCardCounter(Consts.STGInitSpellCardCount, 0);

        CommandManager.GetInstance().RunCommand(CommandConsts.STGInitComplete);
        frameNode = 0;
    }
Exemple #22
0
    protected override void ResetSubWeapons()
    {
        _availableSubCount = -1;
        UpdateSubWeaponsAvailableCount();
        _availableSubCount = PlayerInterface.GetInstance().GetPower() / 100;
        SubWeaponBase subWeapon;

        for (int i = 0; i < _availableSubCount; i++)
        {
            subWeapon = _subWeapons[i];
            Vector2 pos = GetSubWeaponDefaultPos(_curMoveMode, _availableSubCount, i);
            subWeapon.SetToPosition(pos);
        }
    }
Exemple #23
0
    /// <summary>
    /// 更新power的显示
    /// </summary>
    private void UpdatePowerValue()
    {
        int power = PlayerInterface.GetInstance().GetPower();

        if (power != _curPower)
        {
            _curPower = power;
            int num = _curPower / 100;
            _powerInt.sprite = ResourceManager.GetInstance().GetSprite(Consts.STGMainViewAtlasName, BigNumStr + num);
            num = (_curPower % 100) / 10;
            _powerBit1.sprite = ResourceManager.GetInstance().GetSprite(Consts.STGMainViewAtlasName, BigNumStr + num);
            num = _curPower % 10;
            _powerBit2.sprite = ResourceManager.GetInstance().GetSprite(Consts.STGMainViewAtlasName, BigNumStr + num);
        }
    }
Exemple #24
0
    /// <summary>
    /// 做直线运动
    /// <para>movableObject 运动的物体</para>
    /// <para>float v 速度</para>
    /// <para>float angle 速度方向</para>
    /// <para>bool isAimToPlayer 是否朝向玩家</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int STGMovableDoStraightMove(ILuaState luaState)
    {
        ISTGMovable movableObject = luaState.ToUserData(-4) as ISTGMovable;
        float       v             = (float)luaState.ToNumber(-3);
        float       angle         = (float)luaState.ToNumber(-2);
        bool        isAimToPlayer = luaState.ToBoolean(-1);

        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            angle += MathUtil.GetAngleBetweenXAxis(playerPos - movableObject.GetPosition());
        }
        movableObject.DoStraightMove(v, angle);
        return(0);
    }
Exemple #25
0
    /// <summary>
    /// 做加速运动
    /// <para>movableObject 运动的物体</para>
    /// <para>float acce 加速度</para>
    /// <para>float angle 速度方向 or bool useVAngle使用速度方向</para>
    /// <para>bool isAimToPlayer 是否朝向玩家</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int STGMovableDoAcceleration(ILuaState luaState)
    {
        ISTGMovable movableObject = luaState.ToUserData(-4) as ISTGMovable;
        float       acce          = (float)luaState.ToNumber(-3);
        float       angle         = luaState.Type(-2) == LuaType.LUA_TBOOLEAN ? movableObject.vAngle : (float)luaState.ToNumber(-2);
        bool        isAimToPlayer = luaState.ToBoolean(-1);

        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            angle += MathUtil.GetAngleBetweenXAxis(playerPos - movableObject.GetPosition());
        }
        movableObject.DoAcceleration(acce, angle);
        return(0);
    }
    protected void CheckCollisionWithCharacter()
    {
        if (!_isInteractive)
        {
            return;
        }
        Vector2 playerPos = _player.GetPosition();

        if (Mathf.Abs(playerPos.x - _curPos.x) <= _collisionHalfWidth + _player.collisionRadius &&
            Mathf.Abs(playerPos.y - _curPos.y) <= _collisionHalfHeight + _player.collisionRadius)
        {
            //Logger.Log("Hit By Enemy!");
            PlayerInterface.GetInstance().GetCharacter().BeingHit();
        }
    }
    protected virtual void OnStateNormalExit()
    {
        int i;

        // 隐藏所有副武器
        for (i = 0; i < 4; i++)
        {
            _subWeapons[i].OnCharacterStateExit(eCharacterState.Normal);
            _subWeapons[i].SetActive(false);
        }
        _availableSubCount = -1;
        _isShootAvailable  = false;
        // 信号相关
        PlayerInterface.GetInstance().SetSignalValue(0);
    }
 public void CastBomb()
 {
     if (!_inputBomb || _curBombCD > 0)
     {
         return;
     }
     if (PlayerInterface.GetInstance().CastSpellCard())
     {
         OnCastSpellCard();
         _curBombCD = _bombCoolDown;
         SetInvincible(true, _bombInvincibleDuration);
         _isCastingBomb = true;
         CommandManager.GetInstance().RunCommand(CommandConsts.PlayerCastSC);
     }
 }
Exemple #29
0
    /// <summary>
    /// 更新子机可用的数目
    /// </summary>
    private void UpdateSubWeaponsAvailableCount()
    {
        int availableCount = PlayerInterface.GetInstance().GetPower() / 100;

        if (availableCount != _availableSubCount)
        {
            SubWeaponBase subWeapon;
            _availableSubCount = availableCount;
            for (int i = 0; i < 4; i++)
            {
                subWeapon = _subWeapons[i];
                subWeapon.SetActive(i < _availableSubCount);
            }
            _isChangingSubCount = true;
        }
    }
    protected void UpdateSubWeaponsVisible()
    {
        int intPower = PlayerInterface.GetInstance().GetPower() / 100;

        if (intPower != _availableSubCount)
        {
            SubWeaponBase subWeapon;
            int           i;
            _availableSubCount = intPower;
            for (i = 0; i < 4; i++)
            {
                subWeapon = _subWeapons[i];
                subWeapon.SetActive(i < _availableSubCount);
            }
        }
    }