private void animate(Bone effector, Bone bone, Vector2 boneTarget, Vector2 effectorTarget, float speed, float cascadeMod) { if (bone.Direction.X == 0 && bone.Direction.Y == 0 || bone.IsRigid) { return; } Vector2 tip = bone.Position + bone.Direction * bone.Length; if (Vector2.Distance(effector.Position + effector.Direction * effector.Length, effectorTarget) < effector.Length * 0.05f) { return; } Vector2 toTarget = VectorHelper.normalize(boneTarget - tip); float curAngle = VectorHelper.getSignedAngle(VectorHelper.normalize(bone.Position - bone.Parent.Position), VectorHelper.normalize(tip - bone.Position)); //float curAngle = VectorHelper.getAngle2(VectorHelper.normalize(bone.Position - bone.Parent.Position), VectorHelper.normalize(tip - bone.Position)); //float curAngle = VectorHelper.getAngle2(bone.Parent.Position + bone.Parent.Direction * bone.Parent.Length, tip); if (bone.Parent.IsRootMaster) { curAngle = 0f; } //curAngle = MathHelper.WrapAngle(curAngle); if (curAngle >= bone.MinAngle && curAngle <= bone.MaxAngle) { bone.Direction = VectorHelper.normalize(bone.Direction + toTarget * speed); } curAngle = VectorHelper.getSignedAngle(VectorHelper.normalize(bone.Position - bone.Parent.Position), VectorHelper.normalize(tip - bone.Position)); if (bone.Parent.IsRootMaster) { curAngle = 0f; } float angleCorrect; if (curAngle < bone.MinAngle) { angleCorrect = bone.MinAngle - (curAngle); bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip - bone.Position, angleCorrect + 0.000001f)); //bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip - bone.Position, -bone.MinAngle-0.000001f)); } else if (curAngle > bone.MaxAngle) { angleCorrect = bone.MaxAngle - (curAngle); bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip - bone.Position, angleCorrect - 0.000001f)); //bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip - bone.Position, -bone.MaxAngle+0.000001f)); } /*GOOD FROM HERE DOWN * float angle = Vector2.Dot(VectorHelper.getLeftNormal(bone.Direction), toTarget); * float rotVal = -angle * speed; * * * float curAngle = VectorHelper.getSignedAngle(VectorHelper.normalize(bone.Position - bone.Parent.Position),VectorHelper.normalize(tip - bone.Position)); * //float curAngle = VectorHelper.getAngle2(VectorHelper.normalize(bone.Position - bone.Parent.Position), VectorHelper.normalize(tip - bone.Position)); * * if (bone.Parent.IsRootMaster) * curAngle = 0f; * * curAngle = MathHelper.WrapAngle(curAngle); * * if(curAngle >= bone.MinAngle && curAngle <= bone.MaxAngle) * bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(bone.Direction, rotVal)); * * * curAngle = VectorHelper.getSignedAngle(VectorHelper.normalize(bone.Position - bone.Parent.Position),VectorHelper.normalize(tip - bone.Position)); * * if (bone.Parent.IsRootMaster) * curAngle = 0f; * * float angleCorrect; * * if (curAngle < bone.MinAngle) * { * angleCorrect = bone.MinAngle - (curAngle); * bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip-bone.Position, angleCorrect * speed)); * //bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(VectorHelper.normalize(bone.Position - bone.Parent.Position), -bone.MinAngle * speed)); * } * else if (curAngle > bone.MaxAngle) * { * angleCorrect = bone.MaxAngle - (curAngle); * bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(tip - bone.Position, angleCorrect * speed)); * //bone.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(VectorHelper.normalize(bone.Position - bone.Parent.Position), bone.MaxAngle * speed)); * }*/ if (bone.Parent != null) { if (toggleTip) { animate(effector, bone.Parent, tip, effectorTarget, speed * cascadeMod, cascadeMod); } else { animate(effector, bone.Parent, boneTarget, effectorTarget, speed * cascadeMod, cascadeMod); } } }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { int time = 1600; float key1 = 0.25f, key2 = 0.5f, key3 = 0.75f, key4 = 1f; // TODO: Add your initialization logic here face = new Animation(); face.Origin = new Vector2(100, 95); face.RotationOrigin = new Vector2(8, 16); face.Rotation = .3f; face.AnimationTime = time; face.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, .3f)); face.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 3), 0f)); face.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 5), -.3f)); face.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 3), 0f)); face.KeyFrames.Add(new KeyFrame((int)(time * key4), new Vector2(0, 0), .3f)); chest = new Animation(); chest.Origin = new Vector2(100, 110); chest.RotationOrigin = new Vector2(8, 12); chest.AnimationTime = time; chest.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, 0f)); chest.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 4), 0f)); chest.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 6), 0f)); chest.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 4), 0f)); chest.KeyFrames.Add(new KeyFrame((int)(time * key4), Vector2.Zero, 0f)); arm1 = new Animation(); arm1.Origin = new Vector2(116, 110); arm1.RotationOrigin = new Vector2(3, 0); arm1.AnimationTime = time; arm1.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, 0f)); arm1.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 6), 0f)); arm1.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 8), -3.14f)); arm1.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 6), 0f)); arm1.KeyFrames.Add(new KeyFrame((int)(time * key4), Vector2.Zero, 0f)); arm2 = new Animation(); arm2.Origin = new Vector2(94, 110); arm2.RotationOrigin = new Vector2(3, 0); arm2.AnimationTime = time; arm2.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, 0f)); arm2.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 6), 0f)); arm2.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 8), 3.14f)); arm2.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 6), 0f)); arm2.KeyFrames.Add(new KeyFrame((int)(time * key4), Vector2.Zero, 0f)); foot1 = new Animation(); foot1.Origin = new Vector2(109, 133); foot1.RotationOrigin = new Vector2(3, 0); foot1.AnimationTime = time; foot1.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, 0f)); foot1.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 6), 0f)); foot1.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 8), -1f)); foot1.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 6), 0f)); foot1.KeyFrames.Add(new KeyFrame((int)(time * key4), Vector2.Zero, 0f)); foot2 = new Animation(); foot2.Origin = new Vector2(101, 133); foot2.RotationOrigin = new Vector2(3, 0); foot2.AnimationTime = time; foot2.KeyFrames.Add(new KeyFrame(0, Vector2.Zero, 0f)); foot2.KeyFrames.Add(new KeyFrame((int)(time * key1), new Vector2(0, 6), 0f)); foot2.KeyFrames.Add(new KeyFrame((int)(time * key2), new Vector2(0, 8), 1f)); foot2.KeyFrames.Add(new KeyFrame((int)(time * key3), new Vector2(0, 6), 0f)); foot2.KeyFrames.Add(new KeyFrame((int)(time * key4), Vector2.Zero, 0f)); sRoot = new Bone(); sRoot.IsRootMaster = true; sRoot.IsNoVis = true; sRoot.Position = new Vector2(760 / 2, 480 / 2); sRoot.Length = 0; sRoot.Angle = 0; sRoot.Direction = new Vector2(0, 0); head = new Bone(); head.Parent = sRoot; head.Position = calcPosition(head.Parent); head.Angle = MathHelper.ToRadians(180); head.Length = 16; head.RotationOrigin = new Vector2(8, 0); head.Direction = new Vector2(0, -1); head.TextureName = "face"; head.TextureFlip = true; uBody = new Bone(); uBody.Parent = sRoot; uBody.Position = calcPosition(uBody.Parent);//new Vector2(0, 0) + body.Parent.Position; uBody.Angle = MathHelper.ToRadians(0); uBody.Length = 12; uBody.RotationOrigin = new Vector2(8, 0); uBody.Direction = new Vector2(0, 1); uBody.TextureName = "uBody"; lBody = new Bone(); lBody.Parent = uBody; lBody.Position = calcPosition(lBody.Parent); lBody.Length = 8; lBody.RotationOrigin = new Vector2(8, 0); lBody.Direction = new Vector2(0, 1); lBody.TextureName = "lBody"; lHip = new Bone(); lHip.Parent = lBody; lHip.Position = calcPosition(lHip.Parent); lHip.Length = 6; lHip.RotationOrigin = new Vector2(3, 0); lHip.Direction = VectorHelper.normalize(new Vector2(-1, 0)); lHip.TextureName = ""; lHip.MinAngle = MathHelper.ToRadians(5); lHip.MaxAngle = MathHelper.ToRadians(-5); lHip.IsNoVis = true; lHip.IsRigid = true; ulLeg = new Bone(); ulLeg.Parent = lHip; ulLeg.Position = calcPosition(ulLeg.Parent); ulLeg.Angle = MathHelper.ToRadians(-60); ulLeg.Length = 6; ulLeg.RotationOrigin = new Vector2(3, 0); ulLeg.Direction = new Vector2(0, 1); ulLeg.MinAngle = MathHelper.ToRadians(-90); ulLeg.MaxAngle = MathHelper.ToRadians(0); ulLeg.TextureName = "leg"; llLeg = new Bone(); llLeg.Parent = ulLeg; llLeg.Position = calcPosition(llLeg.Parent); llLeg.Angle = MathHelper.ToRadians(-60); llLeg.Length = 6; llLeg.RotationOrigin = new Vector2(3, 0); llLeg.Direction = new Vector2(0, 1); llLeg.MinAngle = MathHelper.ToRadians(-60); llLeg.MaxAngle = MathHelper.ToRadians(0); llLeg.TextureName = "leg"; lFoot = new Bone(); lFoot.Parent = llLeg; lFoot.Position = calcPosition(lFoot.Parent); lFoot.Angle = MathHelper.ToRadians(-60); lFoot.Length = 6; lFoot.RotationOrigin = new Vector2(3, 0); lFoot.Direction = new Vector2(0, 1); lFoot.MinAngle = MathHelper.ToRadians(-15); lFoot.MaxAngle = MathHelper.ToRadians(15); lFoot.TextureName = "foot"; rHip = new Bone(); rHip.Parent = lBody; rHip.Position = calcPosition(rHip.Parent); rHip.Length = 6; rHip.RotationOrigin = new Vector2(3, 0); rHip.Direction = VectorHelper.normalize(new Vector2(1, 0)); rHip.TextureName = ""; rHip.MinAngle = MathHelper.ToRadians(-5); rHip.MaxAngle = MathHelper.ToRadians(5); rHip.IsNoVis = true; rHip.IsRigid = true; urLeg = new Bone(); urLeg.Parent = rHip; urLeg.Position = calcPosition(urLeg.Parent); urLeg.Angle = MathHelper.ToRadians(-60); urLeg.Length = 6; urLeg.RotationOrigin = new Vector2(3, 0); urLeg.Direction = new Vector2(0f, 1); urLeg.MinAngle = MathHelper.ToRadians(0); urLeg.MaxAngle = MathHelper.ToRadians(90); urLeg.TextureName = "leg"; lrLeg = new Bone(); lrLeg.Parent = urLeg; lrLeg.Position = calcPosition(lrLeg.Parent); lrLeg.Angle = MathHelper.ToRadians(-60); lrLeg.Length = 6; lrLeg.RotationOrigin = new Vector2(3, 0); lrLeg.Direction = new Vector2(0, 1); lrLeg.MinAngle = MathHelper.ToRadians(0); lrLeg.MaxAngle = MathHelper.ToRadians(60); lrLeg.TextureName = "leg"; rFoot = new Bone(); rFoot.Parent = lrLeg; rFoot.Position = calcPosition(rFoot.Parent); rFoot.Angle = MathHelper.ToRadians(-60); rFoot.Length = 6; rFoot.RotationOrigin = new Vector2(3, 0); rFoot.Direction = new Vector2(0, 1); rFoot.MinAngle = MathHelper.ToRadians(-15); rFoot.MaxAngle = MathHelper.ToRadians(15); rFoot.TextureName = "foot"; lShoulder = new Bone(); lShoulder.Parent = sRoot; lShoulder.Position = calcPosition(lShoulder.Parent); //new Vector2(0, 0) + lShoulder.Parent.Position; lShoulder.Angle = MathHelper.ToRadians(90); lShoulder.Length = 11; lShoulder.RotationOrigin = new Vector2(3, 0); lShoulder.Direction = new Vector2(-1f, 0f); lShoulder.MinAngle = MathHelper.ToRadians(5); lShoulder.MaxAngle = MathHelper.ToRadians(-5); lShoulder.IsNoVis = true; lShoulder.IsRigid = true; lShoulder.TextureName = "arm"; ulArm = new Bone(); ulArm.Parent = lShoulder; ulArm.Position = calcPosition(ulArm.Parent); //new Vector2(-16, 0) + lArm.Parent.Position; ulArm.Angle = MathHelper.ToRadians(90); ulArm.Length = 6; ulArm.RotationOrigin = new Vector2(3, 0); ulArm.Direction = new Vector2(-1, 0); ulArm.MinAngle = MathHelper.ToRadians(-90); ulArm.MaxAngle = MathHelper.ToRadians(15); ulArm.TextureName = "arm"; llArm = new Bone(); llArm.Parent = ulArm; llArm.Position = calcPosition(llArm.Parent); llArm.Angle = MathHelper.ToRadians(-90); llArm.Length = 6; llArm.RotationOrigin = new Vector2(3, 0); llArm.Direction = new Vector2(-1, 0); llArm.MinAngle = MathHelper.ToRadians(-120); llArm.MaxAngle = MathHelper.ToRadians(90); llArm.TextureName = "arm"; lHand = new Bone(); lHand.Parent = llArm; lHand.Position = calcPosition(lHand.Parent); lHand.Length = 6; lHand.RotationOrigin = new Vector2(3, 0); lHand.Direction = new Vector2(-1, 0); lHand.MinAngle = MathHelper.ToRadians(-45); lHand.MaxAngle = MathHelper.ToRadians(45); lHand.TextureName = "hand"; rShoulder = new Bone(); rShoulder.Parent = sRoot; rShoulder.Position = calcPosition(rShoulder.Parent); //new Vector2(0, 0) + rShoulder.Parent.Position; rShoulder.Angle = MathHelper.ToRadians(-90); rShoulder.Length = 11; rShoulder.RotationOrigin = new Vector2(3, 0); rShoulder.Direction = new Vector2(1f, 0f); rShoulder.MinAngle = MathHelper.ToRadians(-5); rShoulder.MaxAngle = MathHelper.ToRadians(5); rShoulder.IsNoVis = true; rShoulder.IsRigid = true; rShoulder.TextureName = "arm"; urArm = new Bone(); urArm.Parent = rShoulder; urArm.Position = calcPosition(urArm.Parent); urArm.Angle = MathHelper.ToRadians(-90); urArm.Length = 6; urArm.RotationOrigin = new Vector2(3, 0); urArm.Direction = new Vector2(1, 0); urArm.MinAngle = MathHelper.ToRadians(-15); urArm.MaxAngle = MathHelper.ToRadians(90); urArm.TextureName = "arm"; lrArm = new Bone(); lrArm.Parent = urArm; lrArm.Position = calcPosition(lrArm.Parent); lrArm.Angle = MathHelper.ToRadians(-90); lrArm.Length = 6; lrArm.RotationOrigin = new Vector2(3, 0); lrArm.Direction = new Vector2(1, 0); lrArm.MinAngle = MathHelper.ToRadians(-90); lrArm.MaxAngle = MathHelper.ToRadians(120); lrArm.TextureName = "arm"; rHand = new Bone(); rHand.Parent = lrArm; rHand.Position = calcPosition(rHand.Parent); rHand.Length = 6; rHand.RotationOrigin = new Vector2(3, 0); rHand.Direction = new Vector2(1, 0); rHand.MinAngle = MathHelper.ToRadians(-45); rHand.MaxAngle = MathHelper.ToRadians(45); rHand.TextureName = "hand"; sRoot.Children.Add(head); sRoot.Children.Add(uBody); uBody.Children.Add(lBody); lBody.Children.Add(lHip); lHip.Children.Add(ulLeg); ulLeg.Children.Add(llLeg); llLeg.Children.Add(lFoot); lBody.Children.Add(rHip); rHip.Children.Add(urLeg); urLeg.Children.Add(lrLeg); lrLeg.Children.Add(rFoot); sRoot.Children.Add(lShoulder); lShoulder.Children.Add(ulArm); ulArm.Children.Add(llArm); llArm.Children.Add(lHand); sRoot.Children.Add(rShoulder); rShoulder.Children.Add(urArm); urArm.Children.Add(lrArm); lrArm.Children.Add(rHand); boneList = populateBones(25, 32, "line"); base.Initialize(); }
/// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Update(GameTime gameTime) { prevMouse = currMouse; currMouse = Mouse.GetState(); prevKeyboard = curKeyboard; curKeyboard = Keyboard.GetState(); // Allows the game to exit if (Keyboard.GetState().IsKeyDown(Keys.Escape)) { this.Exit(); } if (Keyboard.GetState().IsKeyDown(Keys.Up)) { sRoot.Position += new Vector2(0, -10); } if (Keyboard.GetState().IsKeyDown(Keys.Down)) { sRoot.Position += new Vector2(0, 10); } if (Keyboard.GetState().IsKeyDown(Keys.Left)) { sRoot.Position += new Vector2(-10, 0); } if (Keyboard.GetState().IsKeyDown(Keys.Right)) { sRoot.Position += new Vector2(10, 0); } if (Keyboard.GetState().IsKeyDown(Keys.OemOpenBrackets)) { head.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(head.Direction, 0.1f)); } if (Keyboard.GetState().IsKeyDown(Keys.OemCloseBrackets)) { head.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(head.Direction, -0.1f)); } if (Keyboard.GetState().IsKeyDown(Keys.OemPlus)) { urArm.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(urArm.Direction, 0.1f)); } if (Keyboard.GetState().IsKeyDown(Keys.OemMinus)) { urArm.Direction = VectorHelper.normalize(VectorHelper.rotateVectorRadians(urArm.Direction, -0.1f)); } if (prevMouse.X != currMouse.X || prevMouse.Y != currMouse.Y) { target = new Vector2(currMouse.X, currMouse.Y);// -new Vector2(760 / 2, 480 / 2); } if (curKeyboard.IsKeyUp(Keys.Delete) && prevKeyboard.IsKeyDown(Keys.Delete)) { if (toggleTip) { toggleTip = false; } else { toggleTip = true; } } if (curKeyboard.IsKeyUp(Keys.Insert) && prevKeyboard.IsKeyDown(Keys.Insert)) { if (lShoulder.Length == 11) { lShoulder.Length = 4; } else { lShoulder.Length = 11; } } if (curKeyboard.IsKeyUp(Keys.Home) && prevKeyboard.IsKeyDown(Keys.Home)) { if (toggleModel) { toggleModel = false; } else { toggleModel = true; } } if (!toggleModel) { animate(boneList[boneList.Count - 1], boneList[boneList.Count - 1], target, target, 0.1f, .95f); //animate(boneList[boneList.Count / 2], boneList[boneList.Count / 2], new Vector2(graphics.PreferredBackBufferWidth / 2, 100), new Vector2(graphics.PreferredBackBufferWidth/2, 100), 0.5f); } else { animate(rFoot, rFoot, target, target, .25f, 0.95f); animate(lFoot, lFoot, target, target, .25f, 0.95f); animate(lHand, lHand, target, target, .25f, 0.95f); animate(rHand, rHand, target, target, .25f, 0.95f); } if (time > 60 * 4) { time = 0; } face.updateTime(gameTime); chest.updateTime(gameTime); arm1.updateTime(gameTime); arm2.updateTime(gameTime); foot1.updateTime(gameTime); foot2.updateTime(gameTime); //calculate ms/s elapsed += gameTime.ElapsedGameTime.Milliseconds; count++; if (count > 100) { avg = (float)elapsed / (float)count; count = 0; elapsed = 0; } base.Update(gameTime); }