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); } } } }
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(); } } }
/// <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(); }
/// <summary> /// 与玩家发生碰撞 /// </summary> protected virtual void CollidedByPlayer() { CharacterBase player = PlayerInterface.GetInstance().GetCharacter(); player.BeingHit(); _collidedByPlayer?.Invoke(this, player); }
private void RenderPlayer() { CharacterBase player = PlayerInterface.GetInstance().GetCharacter(); Color col = new Color(50f / 255, 255f / 255, 50f / 255); RenderCircle(player.GetPosition(), player.collisionRadius, col); }
/// <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); }
/// <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); }
/// <summary> /// 玩家死亡之后消失 /// </summary> private void OnPlayerMiss() { _isGameOver = !PlayerInterface.GetInstance().Miss(); if (_isGameOver) { _gameOverTimeCounter = 0; } }
public override void Update() { _moveMode = _character.curModeMode; _powerLevel = PlayerInterface.GetInstance().GetPower() / 100; //UpdatePos(); Shoot(); UpdateAni(); }
/// <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); }
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); }
/// <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); }
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; }
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); } }
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; }
/// <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; }
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); } }
/// <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); } }
/// <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); }
/// <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); } }
/// <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); } } }