/// <summary> /// 根据ChangeValue的值获取对应的值并返回 /// </summary> /// <param name="changeValue"></param> /// <returns></returns> private float GetValueByChangeValue(ParaChangeValue changeValue) { float value = 0; if (changeValue.argType == 0) { value = changeValue.arg0; } else if (changeValue.argType == 1) { Vector2 playerPos = new Vector2(Global.PlayerPos.x, Global.PlayerPos.y); Vector2 bulletPos = _bullet.GetPosition(); float angle = MathUtil.GetAngleBetweenXAxis(playerPos - bulletPos); value = angle; } else if (changeValue.argType == 2) { Vector2 targetPos = new Vector2(changeValue.arg0, changeValue.arg1); Vector2 bulletPos = _bullet.GetPosition(); float angle = MathUtil.GetAngleBetweenXAxis(targetPos - bulletPos); value = angle; } if (changeValue.offset != 0) { value += MTRandom.GetNextFloat(-changeValue.offset, changeValue.offset); } return(value); }
public static int GetRandomFloat(ILuaState luaState) { float begin = (float)luaState.ToNumber(-2); float end = (float)luaState.ToNumber(-1); luaState.PushNumber(MTRandom.GetNextFloat(begin, end)); return(1); }
public override void Start() { SCEffect effect; float angle = MTRandom.GetNextFloat(0, 360); for (int i = 0; i < MaxEffectCount; i++) { effect = new SCEffect(); effect.Init(angle + i * 45, i); _effectList.Add(effect); } // 音效 SoundManager.GetInstance().Play("se_masterspark", 0.1f, false, true); }
private GravitationParas CreateGravitationParas(IAffectedMovableObject affectedObj) { // 偏移计算 float velocityOffset = _velocityOffset == 0 ? 0 : MTRandom.GetNextFloat(-_velocityOffset, _velocityOffset); float acceOffset = _acceOffset == 0 ? 0 : MTRandom.GetNextFloat(-_acceOffset, _acceOffset); // 计算实际的额外运动参数 float v = _velocity + velocityOffset; float acce = _acce + acceOffset; float vAngle = _vAngle, accAngle = _accAngle; // 中心吸力 if (_fieldType == GravitationType.Centripetal) { Vector2 affectObjectPos = affectedObj.GetPosition(); Vector2 fieldPos = _curPos; float angle = MathUtil.GetAngleBetweenXAxis(fieldPos - affectObjectPos); vAngle = angle; accAngle = angle; } // 中心斥力 else if (_fieldType == GravitationType.Centrifugal) { Vector2 affectObjectPos = affectedObj.GetPosition(); Vector2 fieldPos = _curPos; float angle = MathUtil.GetAngleBetweenXAxis(affectObjectPos - fieldPos); vAngle = angle; accAngle = angle; } // 只有普通立场才计算偏移 if (_fieldType == GravitationType.Normal) { float vAngleOffset = _vAngleOffset == 0 ? 0 : MTRandom.GetNextFloat(-_vAngleOffset, _vAngleOffset); float accAngleOffset = _accAngleOffset == 0 ? 0 : MTRandom.GetNextFloat(-_accAngleOffset, _accAngleOffset); // 计算速度方向以及加速度方向 vAngle += vAngleOffset; accAngle += accAngleOffset; } GravitationParas paras = new GravitationParas { velocity = v, vAngle = vAngle, acce = acce, accAngle = accAngle, }; return(paras); }
/// <summary> /// 掉落物品 /// </summary> /// <param name="itemDatas">结构 type,count</param> /// <para>举例: 1,5,2,3,5,6</para> /// <para>即生成type=1的5个,type=2的3个,type=5的6个</para> /// <param name="centerX"></param> /// <param name="centerY"></param> /// <param name="halfWidth"></param> /// <param name="halfHeight"></param> public void DropItems(List <int> itemDatas, float centerX, float centerY, float halfWidth, float halfHeight) { float beginX = centerX - halfWidth; float endX = centerX + halfWidth; float beginY = centerY - halfHeight; float endY = centerY + halfHeight; ItemType itemType; int itemCount; for (int i = 0, len = itemDatas.Count; i < len; i += 2) { itemType = (ItemType)itemDatas[i]; itemCount = itemDatas[i + 1]; for (int j = 0; j < itemCount; j++) { CreateItemByItemType(itemType, MTRandom.GetNextFloat(beginX, endX), MTRandom.GetNextFloat(beginY, endY)); } } }
/// <summary> /// 敌机在duration的持续时间内进行移动 /// <para>移动的目标地点以及方式在之前设置的范围、振幅、模式里面</para> /// </summary> /// <param name="duration"></param> public virtual void DoWander(int duration) { // 记录移动方向是否有效的数组 List <int> availableDir = new List <int>(); int dir; float minX, maxX, minY, maxY, toX, toY; // 根据dirMode计算重新计算边界 Vector2 playerPos = Global.PlayerPos; // 向左 if (_curPos.x - _wanderAmplitudeX.x >= _wanderRangeX.x) { availableDir.Add(0); } if (_curPos.x + _wanderAmplitudeX.x <= _wanderRangeX.y) { availableDir.Add(1); } if (availableDir.Count == 0) { toX = _curPos.x; } else { dir = MTRandom.GetNextInt(0, 1); if (_dirMode == DirectionMode.MoveXTowardsPlayer || _dirMode == DirectionMode.MoveTowardsPlayer) { //往左移动 if (playerPos.x < _curPos.x) { dir = 0; } else { dir = 1; } if (availableDir.IndexOf(dir) == -1) { dir = 1 - dir; } } else { dir = MTRandom.GetNextInt(0, availableDir.Count - 1); } // 左移动,计算左移动的最大值和最小值 if (dir == 0) { maxX = _curPos.x - _wanderAmplitudeX.x; minX = _curPos.x - _wanderAmplitudeX.y < _wanderRangeX.x ? _wanderRangeX.x : _curPos.x - _wanderAmplitudeX.y; } else { minX = _curPos.x + _wanderAmplitudeX.x; maxX = _curPos.x + _wanderAmplitudeX.y > _wanderRangeX.y ? _wanderRangeX.y : _curPos.x + _wanderAmplitudeX.y; } toX = MTRandom.GetNextFloat(minX, maxX); } // 计算Y的范围 0 = 下, 1 = 上 availableDir.Clear(); // 往下 if (_curPos.y - _wanderAmplitudeY.x >= _wanderRangeY.x) { availableDir.Add(0); } // 往上 if (_curPos.y + _wanderAmplitudeY.x <= _wanderRangeY.y) { availableDir.Add(1); } if (availableDir.Count == 0) { toY = _curPos.y; } else { if (_dirMode == DirectionMode.MoveYTowardsPlayer || _dirMode == DirectionMode.MoveTowardsPlayer) { //往下移动 if (playerPos.y < _curPos.y) { dir = 0; } else { dir = 1; } if (availableDir.IndexOf(dir) == -1) { dir = 1 - dir; } } else { dir = MTRandom.GetNextInt(0, availableDir.Count - 1); } // 向下移动 if (dir == 0) { maxY = _curPos.y - _wanderAmplitudeY.x; minY = _curPos.y - _wanderAmplitudeY.y < _wanderRangeY.x ? _wanderRangeY.x : _curPos.y - _wanderAmplitudeY.y; } else { minY = _curPos.y + _wanderAmplitudeY.x; maxY = _curPos.y + _wanderAmplitudeY.y > _wanderRangeY.y ? _wanderRangeY.y : _curPos.y + _wanderAmplitudeY.y; } toY = MTRandom.GetNextFloat(minY, maxY); } MoveTo(toX, toY, duration, _wanderMode); //Logger.Log("wander from " + _curPos + " to " + new Vector2(toX, toY)); }