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); }
private void CollidedByObject(IAffectedMovableObject affectedObject) { int curTime = STGStageManager.GetInstance().GetFrameSinceStageStart(); GravitationParas paras; if (_affectedObjectDic.TryGetValue(affectedObject, out paras)) { if (curTime - paras.lastUpdateTime == 1) { // 每帧重新计算向心力、离心力的角度 if (_fieldType == GravitationType.Centripetal) { paras.vAngle = MathUtil.GetAngleBetweenXAxis(_curPos - affectedObject.GetPosition()); paras.accAngle = paras.vAngle; } else if (_fieldType == GravitationType.Centrifugal) { paras.vAngle = MathUtil.GetAngleBetweenXAxis(affectedObject.GetPosition() - _curPos); paras.accAngle = paras.vAngle; } paras.timeInGravitationField++; } else { paras = CreateGravitationParas(affectedObject); paras.timeInGravitationField = 1; } } else { paras = CreateGravitationParas(affectedObject); paras.timeInGravitationField = 1; } paras.lastUpdateTime = curTime; _affectedObjectDic[affectedObject] = paras; // 设置额外运动参数 affectedObject.AddExtraSpeedParas(paras.velocity, paras.vAngle, paras.acce * paras.timeInGravitationField, paras.accAngle); }