public void Update(ARUpdateDealer dealer) { float elapsedTime = dealer.ElapsedTime; cameraRotation = Matrix.Lerp(cameraRotation, targetCameraRotation, MathHelper.Clamp(aC_rotationlerpScale * elapsedTime, 0, 1)); if (cameraOffset != Vector3.Zero) { aC_scale = Vector3.Distance(base.Position, target.Position) / cameraOffset.Length(); } float d = aC_scale - 1; if (Math.Abs(d) <= aC_scaleTolerance) { aC_scale = 1.0f; } else { aC_scale -= d * elapsedTime * aC_scaleLerpScale; } aC_scale = MathHelper.Clamp(aC_scale, aC_minScale, aC_maxScale); Vector3 ps = Vector3.TransformNormal(cameraOffset, cameraRotation); ps *= aC_scale; base.Position = target.Position + ps; base.LookAt = target.Position; Up = cameraRotation.Up; UpdateView(); }
/// <summary> /// 开始动作,创建一个新的动作列并发送给当前关卡,然后立即开始执行 /// </summary> /// <param name="dealer"></param> void Start(ARUpdateDealer dealer) { ARActionLine actionline = new ARActionLine(stage, this, actions); stage.AddActionLine(actionline); actionline.Start(dealer); }
/// <summary> /// 进行是否完成的检查,另外如果动作甚至没有开始就将isFinished设为False /// </summary> /// <param name="gameTime"></param> public virtual void Check(ARUpdateDealer dealer) { if (isStarted == false) { isFinished = false; } }
protected override void Initialize() { models.Add(new IllModel(@"Combined\Combined", new Vector3(0, 0, 0), new Vector3(0, MathHelper.ToRadians(0), 0), ScreenWidth / 0.34f , this)); models.Add(new IllModel(@"chahu\chahu", new Vector3(0, 0, 0), new Vector3(0, MathHelper.ToRadians(0), 0), ScreenWidth / 0.34f , this)); models.Add(new IllModel(@"huaping\huaping", new Vector3(0, 0, 0), new Vector3(0, MathHelper.ToRadians(0), 0), 0.3f * ScreenWidth / 0.34f , this)); models.Add(new IllModel(@"floor\floor", new Vector3(0, 0, 0), new Vector3(0, MathHelper.ToRadians(0), 0), 0.2f * ScreenWidth / 0.34f , this)); graphDealer = new ARGraphDealer(this); camera1 = new ARBaseCamera(new Vector3(0, 0, 1), new Vector3(0, 0, -2), graphDealer.Projection); camera1.Position = new Vector3(0, 0, 0.4f); graphDealer.SetCamera(camera1); updateDealer = new ARUpdateDealer(this); //GraphicsDeviceManager.ToggleFullScreen(); if (kinectbool && KinectSensor.KinectSensors.Count > 0) { kinect = new KinectComponent(this); Components.Add(kinect); } bloom = new BloomComponent(this); bloom.Settings = BloomSettings.PresetSettings[0]; //bloom.Visible = false; Components.Add(bloom); base.Initialize(); }
public override void Update(ARUpdateDealer dealer) { if (CurrentActiveScene != null) { CurrentActiveScene.Update(dealer); } base.Update(dealer); }
protected override void Initialize() { updateDealer = new ARUpdateDealer(this); graphDealer = new ARGraphDealer(this); supdateDealer = new ARUpdateDealer(this); base.Initialize(); }
public void Update(ARUpdateDealer dealer) { CalculateWorld(); currentMatrix = Matrix.Lerp(currentMatrix, targetMatrix, MathHelper.Clamp(lerpScale * dealer.ElapsedTime, 0f, 1f)); base.LookAt = currentMatrix.Forward + currentMatrix.Translation; base.Position = currentMatrix.Translation; base.Up = currentMatrix.Up; UpdateView(); }
/// <summary> /// 检查是否符合所有触发条件 /// </summary> /// <param name="dealer"></param> /// <returns></returns> bool Check(ARUpdateDealer dealer) { foreach (var con in conditions) { if (!con.Check(dealer)) { return(false); } } return(true); }
/// <summary> /// 尝试触发该触发器,先验证未关闭,再逐个验证所有条件,最后逐个执行所有动作 外部调用!! /// </summary> public void Trigger(ARUpdateDealer dealer) { if (Closed) { return; } if (!Check(dealer)) { return; } //触发器未关闭,条件符合!开始动作!! Start(dealer); }
public override void Update(ARUpdateDealer dealer) { //如果没有动作的话就可以清理掉,清理的方法在ARObject中 if (!this.Removing) { if (currentAction >= 0) { this.Continue(dealer); } else { this.Remove(); } } }
public void Start(ARUpdateDealer dealer) { if (actions.Count > 0) { for (int i = 0; i < actions.Count; i++) { actions[i].Perform(dealer); if (!actions[i].IsFinished) { currentAction = i; //如果有动作不是即时完成的话就等下一帧 return; } } currentAction = -1; } }
/// <summary> /// 如果有没完的动作则继续 /// </summary> /// <param name="dealer"></param> void Continue(ARUpdateDealer dealer) { actions[currentAction].Update(dealer); if (actions[currentAction].IsFinished) { currentAction += 1; } for (int i = currentAction; i < actions.Count; i++) { actions[i].Perform(dealer); if (!actions[i].IsFinished) { currentAction = i; //如果有动作不是即时完成的话就等下一帧 return; } } currentAction = -1; }
public void Update(ARUpdateDealer dealer) { foreach (T o in addingList) { memberList.Add(o); } addingList.Clear(); foreach (T o in memberList) { if (IsItemRemoving(o)) { continue; } if (o is IARUpdateable) { ((IARUpdateable)o).Update(dealer); } } }
public void SUpdate(ARUpdateDealer dealer) { foreach (T o in memberList) { if (!IsItemRemoving(o)) { if (o is IARUpdateable) { ((IARUpdateable)o).SUpdate(dealer); } } else { removingList.Add(o); } } foreach (T o in removingList) { memberList.Remove(o); } removingList.Clear(); }
public override void Update(ARUpdateDealer dealer) { float elapsedTime = dealer.ElapsedTime; sC_Xvelocity = Vector3.Zero; if (targetObject != null) { // if (targetObject.UnitState == UnitState.alive) // { // { // UpdateCameraTarget(targetObject.Position, targetObject.Face, targetObject.Up); // /* // InspectionPoint = Vector3.Transform(new Vector3(0, 0, -20000), chasingUnit.rotation) + chasingUnit.position; // position = Vector3.Transform(relativlyPosition, chasingUnit.rotation) + chasingUnit.position; // upVector = Vector3.TransformNormal(Vector3.Up, chasingUnit.rotation); // */ // if (targetObject.Speed > targetObject.MaxSpeed/3 && targetObject.Speed != 0 && CameraType == CameraType.SpringCamera) // { // //适当加入一些对单位的相对速度避免单位速度太快导致无法正常转动镜头 // sC_Xvelocity = targetObject.Velocity - Vector3.Normalize(targetObject.Velocity) * targetObject.MaxSpeed/3; // } // } // } } UpdateWorldPositions(); switch (cameraType) { case CameraType.NormalCamera: { } break; case CameraType.SpringCamera: { Vector3 stretch = sC_CameraPosition - position; Vector3 force = sC_stiffness * stretch - sC_damping * sC_velocity; Vector3 acceleration = force / sC_mass; sC_velocity += acceleration * elapsedTime; position += (sC_velocity + sC_Xvelocity) * elapsedTime; } break; case CameraType.AODChaseCamera: { cameraRotation = Matrix.Lerp(cameraRotation, targetCameraRotation, MathHelper.Clamp(aC_rotationlerpScale * elapsedTime, 0, 1)); if (cameraObjOffset != Vector3.Zero) { aC_scale = Vector3.Distance(position, targetObject.Position) / cameraObjOffset.Length(); } float d = aC_scale - 1; if (Math.Abs(d) <= aC_scaleTolerance) { aC_scale = 1.0f; } else { aC_scale -= d * elapsedTime * aC_scaleLerpScale; } aC_scale = MathHelper.Clamp(aC_scale, aC_minScale, aC_maxScale); Vector3 ps = Vector3.TransformNormal(cameraObjOffset, cameraRotation); ps *= aC_scale; position = ObjPosition + ps; ObjUp = cameraRotation.Up; } break; case CameraType.Observer: { if (observedUnit != null) { observedPoint = observedUnit.Position; } ObjPosition = observedPoint; } break; default: break; } lookAt = ObjPosition + Vector3.TransformNormal(lookAtOffset, cameraRotation); view = Matrix.CreateLookAt(position, lookAt, ObjUp); }
//SUpdate是每隔一定时间进行的一些比较耗资源的更新 public override void SUpdate(ARUpdateDealer dealer) { actionLines.SUpdate(dealer); base.SUpdate(dealer); }
/// <summary> /// 开始执行动作,然后将IsStarted设置为True再执行一次Check,第一次检查该动作是否完成(对于刚开始执行的动作,触发器可能在一帧内检查两次它是否完成) /// </summary> public virtual void Perform(ARUpdateDealer dealer) { isStarted = true; Check(dealer); }
public override void SUpdate(ARUpdateDealer dealer) { currentStage.SUpdate(dealer); }
public override void Update(ARUpdateDealer dealer) { #region 移动 {//velocity += acceleration * dealer.ElapsedTime; //Position += velocity * dealer.ElapsedTime; if (dealer.ElapsedTime != 0) { thrust += impulse / dealer.ElapsedTime; } if (Mass != 0) { Vector3 acceleration = thrust / Mass;//计算加速度 Velocity += acceleration * dealer.ElapsedTime; Position += Velocity * dealer.ElapsedTime; } impulse = Vector3.Zero; thrust = Vector3.Zero; } #endregion #region 清除速度冗余 if (velocity.LengthSquared() < 0.000001f) { velocity = Vector3.Zero; } #endregion #region 旋转 if (rotationTarget != Vector3.Forward && rotationTarget != Vector3.Zero) { Vector3 s; Vector3 rt = rotationTarget; float m = MathHelper.ToRadians(RotateSpeed * dealer.ElapsedTime); if (rt == Vector3.Backward) { rt = Vector3.Right; } float a = (float)Math.Acos(Vector3.Dot(rt, Vector3.Forward)); if (m >= a) { s = rt; } else { float b = (MathHelper.Pi - a) / 2; float c = (MathHelper.Pi - m - b); float h = -(float)(Math.Sin(b) / Math.Sin(c) * Math.Cos(m)); //2011/11/5注释 大地无敌忘记以前为什么这样算的了,从AOD里搬来的 //s = Vector3.Normalize((Vector3.Forward + (h + 1) / (rt.Z - h) * rt) / (1 + (h + 1) / (rt.Z - h))); s = Vector3.Normalize(Vector3.Lerp(Vector3.Forward, rt, (h + 1) / (rt.Z + 1))); } if (s != Vector3.Forward) { Matrix rr = Matrix.CreateFromAxisAngle(Vector3.Normalize(Vector3.Cross(s, Vector3.Forward)), -(float)Math.Acos(Vector3.Dot(Vector3.Forward, s))); Rotation = rr * Rotation; } rotationTarget = Vector3.Zero; } #endregion base.Update(dealer); }
public void SUpdate(ARUpdateDealer dealer) { }
/// <summary> /// 检查该条件是否符合,原始方法会返回false /// </summary> /// <param name="gameTime"></param> /// <returns></returns> public virtual bool Check(ARUpdateDealer dealer) { return(false); }
/// <summary> /// 对执行中尚未完成的动作执行一次Check,在持续一段时间的动作中检查动作是否已完成,如果已完成则标示为完成,对于已完成的动作,触发器将开始执行它的下一个动作 /// </summary> /// <param name="gameTime"></param> public override void Update(ARUpdateDealer dealer) { Check(dealer); base.Update(dealer); }