/// <summary> /// 使用组件进行移动参数变更, /// <para>具体参数参考AddParaChangeEvent方法</para> /// <para>bullet</para> /// <para>para MovePara</para> /// <para>changeMode 改变方式 ChangeTo,IncBy,DecBy,ChangeTo</para> /// <para>valueType 参数类型</para> /// <para>arg0 参数0</para> /// <para>arg1 参数1</para> /// <para>valueOffset 随机偏移量</para> /// <para>delay 起始延迟</para> /// <para>duration 变化持续时间</para> /// <para>intMode 插值方式</para> /// <para>repeatCount 重复次数</para> /// <para>repeatInterval 每次重复的间隔</para> /// <para>总计12个参数</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int AddBulletParaChangeEvent(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-12) as EnemyBulletBase; BulletParaType para = (BulletParaType)luaState.ToInteger(-11); ParaChangeMode changeMode = (ParaChangeMode)luaState.ToInteger(-10); int valueType = luaState.ToInteger(-9); float arg0 = (float)luaState.ToNumber(-8); float arg1 = (float)luaState.ToNumber(-7); float valueOffset = (float)luaState.ToNumber(-6); int delay = luaState.ToInteger(-5); int duration = luaState.ToInteger(-4); InterpolationMode intMode = (InterpolationMode)luaState.ToInteger(-3); int repeatCount = luaState.ToInteger(-2); int repeatInterval = luaState.ToInteger(-1); BCParasChange bc = bullet.AddOrGetComponent <BCParasChange>(); ParaChangeValue changeValue = new ParaChangeValue { argType = valueType, arg0 = arg0, arg1 = arg1, offset = valueOffset, }; bc.AddParaChangeEvent(para, changeMode, changeValue, delay, duration, intMode, repeatCount, repeatInterval); 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> /// 设置敌机子弹的直线运动参数 /// <para>bullet</para> /// <para>v</para> /// <para>vAngle</para> /// <para>bool isAimToPlayer</para> /// <para>acce</para> /// <para>accAngle</para> /// <para>maxV</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int EnemyBulletSetStraightParas(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-6) as EnemyBulletBase; 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) { accAngle = angle; } else { accAngle = (float)luaState.ToNumber(-1); } if (isAimToPlayer) { Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition(); float relAngle = MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition()); angle += relAngle; accAngle += relAngle; } bullet.SetStraightParas(v, angle, acce, accAngle); return(0); }
/// <summary> /// 碰撞检测 /// </summary> /// <param name="collParas"></param> /// <returns></returns> private bool DetectCollisionWithEnemyBullet(EnemyBulletBase bullet) { if (bullet.Type == BulletType.Enemy_Laser) { return(false); } CollisionDetectParas collParas; switch (bullet.Type) { case BulletType.Enemy_Simple: collParas = bullet.GetCollisionDetectParas(0); break; case BulletType.Enemy_LinearLaser: case BulletType.Enemy_CurveLaser: collParas = bullet.GetCollisionDetectParas(-1); break; default: collParas = new CollisionDetectParas(); break; } if (DetectCollisionWithCollisionParas(collParas)) { CollidedByObject(bullet); return(true); } return(false); }
/// <summary> /// 获取子弹当前位置 /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int GetBulletPos(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-1) as EnemyBulletBase; luaState.PushNumber(bullet.posX); luaState.PushNumber(bullet.posY); return(2); }
public static int EliminateBullet(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-1) as EnemyBulletBase; luaState.Pop(1); bullet.Eliminate(); return(0); }
/// <summary> /// 设置子弹的消除抗性 /// <para>bullet</para> /// <para>flag 不能被消除的标识</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletResistEliminatedFlag(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; int flag = luaState.ToInteger(-1); luaState.Pop(2); bullet.SetResistEliminateFlag(flag); return(0); }
/// <summary> /// 设置子弹的透明度 /// <para>bullet</para> /// <para>float alpha 透明度</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletAlpha(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; float alpha = (float)luaState.ToNumber(-1); luaState.Pop(2); bullet.SetAlpha(alpha); return(0); }
public override void Init(EnemyBulletBase bullet) { _bullet = bullet; if (_taskList == null) { _taskList = new List <Task>(); } _taskCount = 0; }
/// <summary> /// 设置子弹是否进行碰撞检测 /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletDetectCollision(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; bool value = luaState.ToBoolean(-1); luaState.Pop(2); bullet.SetDetectCollision(value); return(0); }
/// <summary> /// 设置子弹的属性 /// <para>bullet</para> /// <para>BulletParaType paraType</para> /// <para>float value</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletPara(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-3) as EnemyBulletBase; BulletParaType paraType = (BulletParaType)luaState.ToInteger(-2); float value = (float)luaState.ToNumber(-1); luaState.Pop(3); bullet.SetBulletPara(paraType, value); return(0); }
/// <summary> /// 设置子弹位置 /// <para>bullet</para> /// <para>posX</para> /// <para>posY</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletPos(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-3) as EnemyBulletBase; float posX = (float)luaState.ToNumber(-2); float posY = (float)luaState.ToNumber(-1); luaState.Pop(3); bullet.SetPosition(posX, posY); return(0); }
/// <summary> /// 添加子弹的自定义碰撞事件 /// <para>bullet</para> /// <para>triggerType 触发碰撞事件的类型,从eEliminateDef.CustomizedType0~eEliminateDef.CustomizedType5</para> /// <para>triggerFuncRef 触发的函数</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int AddBulletColliderTriggerEvent(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-3) as EnemyBulletBase; int triggerType = luaState.ToInteger(-2); int triggerFuncRef = luaState.L_Ref(LuaDef.LUA_REGISTRYINDEX); BCColliderTrigger bc = bullet.AddOrGetComponent <BCColliderTrigger>(); bc.Register(triggerType, triggerFuncRef); return(0); }
public bool RegisterEnemyBullet(EnemyBulletBase bullet) { if (bullet == null) { return(false); } _enemyBullets.Add(bullet); _enemyBulletsCount++; _countOfEnemyBulletCreatedInFrame++; return(true); }
public override void Init(EnemyBulletBase bullet) { _bullet = bullet as EnemyBulletMovable; _reboundCount = 0; _reboundPara = 0; _left = Global.GameLBBorderPos.x; _right = Global.GameRTBorderPos.x; _bottom = Global.GameLBBorderPos.y; _top = Global.GameRTBorderPos.y; }
/// <summary> /// 物体做极坐标运动 /// <para>bullet 敌机子弹</para> /// <para>float radius 起始半径</para> /// <para>float angle 起始角度</para> /// <para>float deltaR 半径增量</para> /// <para>float omega 角速度</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int EnemyBulletSetCurvedParas(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase; float radius = (float)luaState.ToNumber(-4); float angle = (float)luaState.ToNumber(-3); float deltaR = (float)luaState.ToNumber(-2); float omega = (float)luaState.ToNumber(-1); luaState.Pop(5); bullet.SetPolarParas(radius, angle, deltaR, omega); return(0); }
/// <summary> /// 设置子弹的颜色与透明度 /// <para>bullet</para> /// <para>float rValue 0~255</para> /// <para>float gValue 0~255</para> /// <para>float bValue 0~255</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletColorWithAlpha(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase; float rValue = (float)luaState.ToNumber(-4); float gValue = (float)luaState.ToNumber(-3); float bValue = (float)luaState.ToNumber(-2); float alpha = (float)luaState.ToNumber(-1); luaState.Pop(5); bullet.SetColor(rValue, gValue, bValue, alpha); return(0); }
/// <summary> /// 添加反弹 /// <para>bullet</para> /// <para>reboundPara 反弹参数</para> /// <para>reboundCount 反弹次数</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int AddBulletRebound(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-3) as EnemyBulletBase; int reboundPara = luaState.ToInteger(-2); int reboundCount = luaState.ToInteger(-1); BCRebound rebound = bullet.AddOrGetComponent <BCRebound>(); if (rebound != null) { rebound.AddReboundPara(reboundPara, reboundCount); } return(0); }
public override void Clear() { _bullet = null; for (int i = 0; i < _triggerDataCount; i++) { int funcRef = _triggerDatas[i].triggerFuncRef; if (funcRef != 0) { InterpreterManager.GetInstance().UnrefLuaFunction(funcRef); } } _triggerDatas.Clear(); _triggerDataCount = 0; }
/// <summary> /// 做直线运动 /// <para>bullet 敌机子弹</para> /// <para>float v 速度</para> /// <para>float angle 速度方向</para> /// <para>bool isAimToPlayer 是否朝向玩家</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int EnemyBulletDoStraightMove(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-4) as EnemyBulletBase; float v = (float)luaState.ToNumber(-3); float angle = (float)luaState.ToNumber(-2); bool isAimToPlayer = luaState.ToBoolean(-1); luaState.Pop(4); if (isAimToPlayer) { Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition(); angle += MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition()); } bullet.DoStraightMove(v, angle); return(0); }
public static int AddBulletTask(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; int funcRef = InterpreterManager.GetInstance().RefLuaFunction(luaState); luaState.Pop(1); Task task = ObjectsPool.GetInstance().GetPoolClassAtPool <Task>(); task.funcRef = funcRef; task.isFinish = false; task.luaState = null; BCCustomizedTask bc = bullet.GetComponent <BCCustomizedTask>(); bc.AddTask(task); return(0); }
/// <summary> /// 获取子弹的属性 /// <para>bullet</para> /// <para>BulletParaType paraType</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int GetBulletPara(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; BulletParaType paraType = (BulletParaType)luaState.ToInteger(-1); luaState.Pop(2); float value; if (bullet.GetBulletPara(paraType, out value)) { luaState.PushNumber(value); return(1); } Logger.LogWarn("BulletPara " + paraType + " in " + bullet.Type + " is not exist!"); return(0); }
/// <summary> /// 根据id设置bullet的形状 /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletStyleById(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; string id; if (luaState.Type(-1) == LuaType.LUA_TNUMBER) { id = luaState.ToNumber(-1).ToString(); } else { id = luaState.ToString(-1); } bullet.SetStyleById(id); return(0); }
/// <summary> /// 获取子弹的碰撞参数 /// <para>bullet</para> /// <para>collisionIndex 第n个碰撞体</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int GetBulletCollisionDetectParas(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; int index = luaState.ToInteger(-1); luaState.Pop(2); CollisionDetectParas collParas = bullet.GetCollisionDetectParas(index); luaState.PushInteger((int)collParas.type); luaState.PushNumber(collParas.centerPos.x); luaState.PushNumber(collParas.centerPos.y); luaState.PushNumber(collParas.radius); luaState.PushNumber(collParas.halfWidth); luaState.PushNumber(collParas.halfHeight); luaState.PushNumber(collParas.angle); return(7); }
/// <summary> /// 碰撞检测 /// </summary> /// <param name="collParas"></param> /// <returns></returns> private bool DetectCollisionWithEnemyBullet(EnemyBulletBase bullet) { int nextColliderIndex = 0; int curColliderIndex; bool isCollided = false; do { CollisionDetectParas collParas = bullet.GetCollisionDetectParas(nextColliderIndex); curColliderIndex = nextColliderIndex; nextColliderIndex = collParas.nextIndex; if (DetectCollisionWithCollisionParas(collParas)) { bullet.CollidedByObject(curColliderIndex, _eliminateType); isCollided = true; } } while (nextColliderIndex != -1); return(isCollided); }
/// <summary> /// 添加子弹组件 /// <para>type enum BulletComponentType</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int AddBulletComponent(ILuaState luaState) { EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase; BulletComponentType type = (BulletComponentType)luaState.ToInteger(-1); luaState.Pop(2); if (type == BulletComponentType.ParasChange) { bullet.AddOrGetComponent <BCParasChange>(); } else if (type == BulletComponentType.Rebound) { bullet.AddOrGetComponent <BCRebound>(); } else if (type == BulletComponentType.ColliderTrigger) { bullet.AddOrGetComponent <BCColliderTrigger>(); } return(0); }
public override void Clear() { Task task; for (int i = 0; i < _taskCount; i++) { task = _taskList[i]; if (task != null) { if (task.luaState != null) { InterpreterManager.GetInstance().StopTaskThread(task.luaState, task.funcRef); } ObjectsPool.GetInstance().RestorePoolClassToPool <Task>(task); } } _taskList.Clear(); _taskCount = 0; _bullet = null; }
/// <summary> /// SetData /// </summary> /// <param name="i_distance">二次元座標</param> /// <param name="stop">停止フラグ</param> public void SetData(EnemyBulletBase.EnemyBulletGroup info) { base.Start(); myData = info; SPEED = info.Speed; DAMAGE = info.Damage; if (info.Homing) { distance = (parent.player.transform.position - this.transform.position).normalized; } else { float randRad = 1f; if (EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius > 0) { randRad = Random.Range(-EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius, EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius); } distance = EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].Radius * randRad; } isStop = myData.StopTime <= 0f; }
private void NormalMover() { float distance = PlayerManager.Instance.PlayerInstance.transform.position.x - transform.position.x; if (distance > 0f) { gameObject.transform.localScale = new Vector3(-Mathf.Abs(gameObject.transform.localScale.x), gameObject.transform.localScale.y, gameObject.transform.localScale.z); } else if (distance < 0f) { gameObject.transform.localScale = new Vector3(Mathf.Abs(gameObject.transform.localScale.x), gameObject.transform.localScale.y, gameObject.transform.localScale.z); } homingAttackNowTime += Time.deltaTime; if (shortAttackInstance == null) { sr.sprite = Base_Sprite; shortAttackNowTime += Time.deltaTime; } NormalMove(distance, moveSpeed); //遠距離攻撃 if (normalShotTiming < homingAttackNowTime) { foreach (var _shot in normalShot) { var shotInstance = Instantiate(_shot.bulletBase, transform.position + new Vector3(_shot.position.x, _shot.position.y, 0), Quaternion.identity); } homingAttackNowTime = 0; } //近接攻撃 if (shortAttackTime < shortAttackNowTime) { sr.sprite = Attack_Sprite; shortAttackInstance = Instantiate(shortAttack.bulletBase, Vector3.zero, Quaternion.identity); shortAttackInstance.transform.parent = transform; shortAttackInstance.transform.localPosition = new Vector3(shortAttack.position.x, shortAttack.position.y, 0); shortAttackNowTime = 0; } }
private void Normal(float distance) { //初期化 if (time == 0) { homingAttackNowTime = 0; shortAttackNowTime = 0; } time += Time.deltaTime; homingAttackNowTime += Time.deltaTime; if (shortAttackInstance == null) { sr.sprite = Base_Sprite; shortAttackNowTime += Time.deltaTime; } if (time > normalTime) { eState = FinalBossState.Move; time = 0; } NormalMove(distance, moveSpeed); if (normalShotTiming < homingAttackNowTime) { foreach (var _shot in normalShot) { var shotInstance = Instantiate(_shot.bulletBase, transform.position + new Vector3(_shot.position.x, _shot.position.y, 0), Quaternion.identity); } homingAttackNowTime = 0; } if (shortAttackTime < shortAttackNowTime) { sr.sprite = Attack_Sprite; shortAttackInstance = Instantiate(shortAttack.bulletBase, Vector3.zero, Quaternion.identity); shortAttackInstance.transform.parent = transform; shortAttackInstance.transform.localPosition = new Vector3(shortAttack.position.x, shortAttack.position.y, 0); shortAttackNowTime = 0; } }
/// <summary> /// 设置子弹的颜色 /// <para>bullet</para> /// <para>float rValue 0~255</para> /// <para>float gValue 0~255</para> /// <para>float bValue 0~255</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int SetBulletColor(ILuaState luaState) { int top = luaState.GetTop(); if (top == 4) { EnemyBulletBase bullet = luaState.ToUserData(-4) as EnemyBulletBase; float rValue = (float)luaState.ToNumber(-3); float gValue = (float)luaState.ToNumber(-2); float bValue = (float)luaState.ToNumber(-1); bullet.SetColor(rValue, gValue, bValue); } else { EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase; float rValue = (float)luaState.ToNumber(-4); float gValue = (float)luaState.ToNumber(-3); float bValue = (float)luaState.ToNumber(-2); float alpha = (float)luaState.ToNumber(-1); bullet.SetColor(rValue, gValue, bValue, alpha); } return(0); }