public virtual SpriterKeyFrame getNextFrameFor( SpriterAbstractObject @object, SpriterKeyFrame currentFrame, int direction) { SpriterKeyFrame nextFrame = null; int cnt = 0; bool isBone = @object is SpriterBone; for (int j = (currentFrame.getId() + direction + this.keyframes()) % this.keyframes(); nextFrame == null && cnt < this.keyframes(); j = (j + direction + this.keyframes()) % this.keyframes(), cnt++) { SpriterKeyFrame frame = this.frames[j]; bool contains = (isBone) ? frame.containsBone((SpriterBone )@object) : frame.containsObject((SpriterObject) @object); if (contains) { SpriterAbstractObject objectInFrame; if (isBone) { objectInFrame = frame.getBoneFor((SpriterBone)@object); } else { objectInFrame = frame.getObjectFor((SpriterObject)@object); } if (@object.equals(objectInFrame)) { nextFrame = frame; } } } return(nextFrame); }
/// <summary>Changes the state of each effector to unactive.</summary> /// <remarks>Changes the state of each effector to unactive. The effect results in non animated bodyparts. /// </remarks> /// <param name="parents">indicates whether parents of the effectors have to be deactivated or not. /// </param> public virtual void deactivateEffectors(SpriterAbstractPlayer player, bool parents) { foreach (SpriterIKObject key in this.ikMap.Keys) { SpriterAbstractObject obj = this.ikMap[key]; if (obj is SpriterBone) { obj = player.getRuntimeBones()[obj.getId()]; } else { obj = player.getRuntimeObjects()[obj.getId()]; } obj.active = false; if (!parents) { continue; } SpriterBone par = (SpriterBone)obj.getParent(); for (int j = 0; j < key.chainLength && par != null; j++) { player.getRuntimeBones()[par.getId()].active = false; par = (SpriterBone)par.getParent(); } } }
/// <param name="object">to compare with</param> /// <returns>true if both objects have the same id.</returns> public virtual bool equals(SpriterAbstractObject @object) { if (@object == null) { return(false); } return(this.timeline == @object.getTimeline()); }
private void translateRelative(SpriterAbstractObject @object, SpriterAbstractObject parent) { @object.setAngle(@object.getAngle() * this.flippedX * this.flippedY + parent.getAngle() ); @object.setScaleX(@object.getScaleX() * parent.getScaleX()); @object.setScaleY(@object.getScaleY() * parent.getScaleY()); SpriterCalculator.translateRelative(parent, @object); }
public virtual void updateAbstractObject(SpriterAbstractObject @object) { if (@object.hasParent()) { SpriterAbstractObject obj = (@object is SpriterBone ) ? (SpriterAbstractObject)this.lastFrame.getBones()[@object.getId()] : this.lastFrame.getObjects()[@object .getId()]; SpriterCalculator.translateRelative(this.tempBones[@object .getParentId()], obj.getX(), obj.getY(), @object); } }
private void tweenBone(SpriterBone currentBone, SpriterBone nextBone, int i, long startTime, long endTime) { currentBone.copyValuesTo(this.tempBones[i]); this.tempBones[i].setTimeline((nextBone != null) ? currentBone.getTimeline() : -1 ); SpriterAbstractObject parent = (this.tempBones[i] .hasParent()) ? this.tempBones[this.tempBones[i].getParentId()] : this.tempParent; if (nextBone != null) { if (parent != this.tempParent) { if (!currentBone.getParent().equals(nextBone.getParent())) { nextBone = (SpriterBone)this.getTimelineObject(currentBone , this.tempBones2); SpriterCalculator.reTranslateRelative(parent, nextBone); nextBone.setAngle(nextBone.getAngle() * this.flippedX * this.flippedY); } } else { if (nextBone.hasParent()) { nextBone = (SpriterBone)this.getTimelineObject(currentBone , this.tempBones2); SpriterCalculator.reTranslateRelative(parent, nextBone); nextBone.setAngle(nextBone.getAngle() * this.flippedX * this.flippedY); } } if (this.tempBones[i].active) { this.interpolateAbstractObject(this.tempBones[i], currentBone, nextBone, startTime , endTime); } } this.moddedBones[currentBone.getId()].modSpriterBone(this.tempBones[i]); if (this.transitionFixed) { this.tempBones[i].copyValuesTo(this.lastFrame.getBones()[i]); } else { this.tempBones[i].copyValuesTo(this.lastTempFrame.getBones()[i]); } if (!this.tempBones[i].hasParent() || !this.moddedBones[currentBone.getId()].isActive ()) { this.tempBones[i].setX(this.tempBones[i].getX() + this.pivotX); this.tempBones[i].setY(this.tempBones[i].getY() + this.pivotY); } this.translateRelative(this.tempBones[i], parent); }
public SpriterAbstractObject() { this.x = 0; this.y = 0; this.angle = 0f; this.scaleX = 1f; this.scaleY = 1f; this.id = -1; this.parentId = -1; this.name = string.Empty; this.parent = null; }
private void updateTransformedTempObject(SpriterAbstractObject source, SpriterAbstractObject target) { source.copyValuesTo(target); if (!target.hasParent()) { target.setX(target.getX() + this.pivotX); target.setY(target.getY() + this.pivotY); } this.translateRelative(target, (target.hasParent()) ? this.tempBones2[target.getParentId ()] : this.tempParent); }
getTimelineObject(SpriterAbstractObject @object, SpriterAbstractObject[] objects) { for (int i = 0; i < objects.Length; i++) { if (objects[i].getTimeline().Equals(@object.getTimeline())) { return(objects[i]); } } return(null); }
private void updateTempObject(SpriterAbstractObject source, SpriterAbstractObject[] target) { bool found = false; for (int j = 0; j < target.Length && !found; j++) { if (source.getId() == target[j].getId()) { source.copyValuesTo(target[j]); found = true; } } }
/// <summary>Constructs a new SpriterAbstractPlayer object which is able to animate SpriterBone instances and SpriterObject instances. /// </summary> /// <remarks>Constructs a new SpriterAbstractPlayer object which is able to animate SpriterBone instances and SpriterObject instances. /// </remarks> /// <param name="loader"> /// /// <see cref="FileLoader{I}">FileLoader<I> /// </see> /// which you have to implement on your own. /// </param> /// <param name="keyframes"> /// A list of SpriterKeyFrame arrays. See /// <see cref="SpriterKeyFrameProvider.generateKeyFramePool(com.discobeard.spriter.dom.SpriterData, com.discobeard.spriter.dom.Entity) /// ">SpriterKeyFrameProvider.generateKeyFramePool(com.discobeard.spriter.dom.SpriterData, com.discobeard.spriter.dom.Entity) /// </see> /// to get the list. /// Generate these keyframes once to save memory. /// </param> public SpriterAbstractPlayer(FileLoader loader, IList <SpriterAnimation> animations) { this.loader = loader; this.animations = animations; this.rootParent = new SpriterBone(); this.tempParent = new SpriterBone(); this.rootParent.setName("playerRoot"); this.tempParent.setName("playerRoot"); this.lastFrame = new SpriterKeyFrame(); this.lastTempFrame = new SpriterKeyFrame(); this.interpolator = SpriterLinearInterpolator .interpolator; this.players = new List <SpriterAbstractPlayer>(); rect = new SpriterRectangle(0, 0, 0, 0); }
/// <summary>Sets the values of this instance to the given one.</summary> /// <remarks>Sets the values of this instance to the given one.</remarks> /// <param name="object">which has to be manipulated.</param> public virtual void copyValuesTo(SpriterAbstractObject @object) { @object.setAngle(angle); @object.setScaleX(scaleX); @object.setScaleY(scaleY); @object.setX(x); @object.setY(y); @object.setId(id); @object.setParentId(parentId); @object.setParent(parent); @object.setTimeline(timeline); @object.setSpin(spin); @object.setName(name); }
protected internal virtual void updateRecursively(SpriterAbstractPlayer player, SpriterAbstractObject @object) { this.updateObject(player, @object); if (@object is SpriterBone) { foreach (SpriterBone child in ((SpriterBone )@object).getChildBones()) { this.updateRecursively(player, player.getRuntimeBones()[child.getId()]); } foreach (SpriterObject child_1 in ((SpriterBone )@object).getChildObjects()) { this.updateRecursively(player, player.getRuntimeObjects()[child_1.getId()]); } } }
public override void copyValuesTo(SpriterAbstractObject @object) { base.copyValuesTo(@object); if (!(@object is SpriterObject)) { return; } ((SpriterObject)@object).setAlpha(alpha); ((SpriterObject)@object).setRef(@ref); ((SpriterObject)@object).setPivotX(pivotX); ((SpriterObject)@object).setPivotY(pivotY); ((SpriterObject)@object).setTransientObject(transientObject ); ((SpriterObject)@object).setZIndex(zIndex); ((SpriterObject)@object).setLoader(loader); ((SpriterObject)@object).setVisible(visible); ((SpriterObject)@object).rect.set(this.rect); }
private void interpolateAbstractObject(SpriterAbstractObject target, SpriterAbstractObject obj1, SpriterAbstractObject obj2, float startTime, float endTime) { if (obj2 == null) { return; } target.setX(this.interpolate(obj1.getX(), obj2.getX(), startTime, endTime, this.frame )); target.setY(this.interpolate(obj1.getY(), obj2.getY(), startTime, endTime, this.frame )); target.setScaleX(this.interpolate(obj1.getScaleX(), obj2.getScaleX(), startTime, endTime, this.frame)); target.setScaleY(this.interpolate(obj1.getScaleY(), obj2.getScaleY(), startTime, endTime, this.frame)); target.setAngle(this.interpolateAngle(obj1.getAngle(), obj2.getAngle(), startTime , endTime, this.frame)); }
/// <summary> /// Resolves the inverse kinematics constraints with the implemented algorithm in /// <see cref="resolve(float, float, int, SpriterAbstractObject, SpriterAbstractPlayer) /// ">resolve(float, float, int, SpriterAbstractObject, SpriterAbstractPlayer) /// </see> /// . /// </summary> /// <param name="player">player to apply the resolving.</param> public virtual void resolve(SpriterAbstractPlayer player) { foreach (SpriterIKObject key in this.ikMap.Keys) { for (int j = 0; j < key.iterations; j++) { SpriterAbstractObject obj = this.ikMap[key]; if (obj is Com.Brashmonkey.Spriter.objects.SpriterBone) { obj = player.getRuntimeBones()[obj.getId()]; } else { obj = player.getRuntimeObjects()[obj.getId()]; } this.resolve(obj.getX(), obj.getY(), key.chainLength, obj, player); } } }
/// <param name="object">to compare with</param> /// <returns>true if both objects have the same id.</returns> public virtual bool equals(SpriterAbstractObject @object) { if (@object == null) { return false; } return this.timeline == @object.getTimeline(); }
//else this.tweenBone(this.nonTransformedTempBones[i], this.animations.get(0).frames.get(0).getBoneFor(this.nonTransformedTempBones[i]), i, currentFrame.getTime(), nextFrame.getTime()); private void tweenObject(SpriterObject currentObject , SpriterObject nextObject, int i, long startTime , long endTime) { DrawInstruction dI = this.instructions[i]; currentObject.copyValuesTo(this.tempObjects[i]); SpriterAbstractObject parent = null; if (!currentObject.isTransientObject()) { this.tempObjects[i].setTimeline((nextObject != null) ? currentObject.getTimeline( ) : -1); parent = (currentObject.hasParent()) ? this.tempBones[currentObject.getParentId() ] : this.tempParent; if (nextObject != null) { if (parent != this.tempParent) { if (!currentObject.getParent().equals(nextObject.getParent())) { nextObject = (SpriterObject)this.getTimelineObject (currentObject, this.tempObjects2); SpriterCalculator.reTranslateRelative(parent, nextObject); nextObject.setAngle(nextObject.getAngle() * this.flippedX * this.flippedY); } } else { if (nextObject.hasParent()) { nextObject = (SpriterObject)this.getTimelineObject (currentObject, this.tempObjects2); SpriterCalculator.reTranslateRelative(parent, nextObject); nextObject.setAngle(nextObject.getAngle() * this.flippedX * this.flippedY); } } if (this.tempObjects[i].active) { this.interpolateSpriterObject(this.tempObjects[i], currentObject, nextObject, startTime , endTime); } } this.moddedObjects[currentObject.getId()].modSpriterObject(this.tempObjects[i]); if (this.transitionFixed) { this.tempObjects[i].copyValuesTo(this.lastFrame.getObjects()[i]); } else { this.tempObjects[i].copyValuesTo(this.lastTempFrame.getObjects()[i]); } } else { parent = this.tempParent; } if (!this.tempObjects[i].hasParent()) { this.tempObjects[i].setX(this.tempObjects[i].getX() + this.pivotX); this.tempObjects[i].setY(this.tempObjects[i].getY() + this.pivotY); } this.translateRelative(this.tempObjects[i], parent); if (this.moddedObjects[currentObject.getId()].getRef() != null) { this.tempObjects[i].setRef(this.moddedObjects[currentObject.getId()].getRef()); } if (this.moddedObjects[currentObject.getId()].getLoader() != null) { this.tempObjects[i].setLoader(this.moddedObjects[currentObject.getId()].getLoader ()); } this.tempObjects[i].copyValuesTo(dI); this.setInstructionRef(dI, this.tempObjects[i], nextObject); }
protected override void resolve(float x, float y, int chainLength, SpriterAbstractObject effector, SpriterAbstractPlayer player) { base.updateRecursively(player, effector); float xx = effector.getX() + (float)System.Math.Cos(SpriterCalculator.DegreeToRadian(effector .getAngle())) * Com.Brashmonkey.Spriter.draw.AbstractDrawer.BONE_LENGTH * effector .getScaleX(); float yy = effector.getY() + (float)System.Math.Sin(SpriterCalculator.DegreeToRadian(effector .getAngle())) * Com.Brashmonkey.Spriter.draw.AbstractDrawer.BONE_LENGTH * effector .getScaleX(); effector.setAngle(Com.Brashmonkey.Spriter.SpriterCalculator.angleBetween(effector .getX(), effector.getY(), x, y)); if (player.getFlipX() == -1) { effector.setAngle(effector.getAngle() + 180f); } SpriterBone parent = null; if (effector.hasParent()) { parent = player.getRuntimeBones()[effector.getParentId()]; } //effector.copyValuesTo(temp); //SpriterCalculator.reTranslateRelative(parent, temp); //if(effector instanceof SpriterBone) temp.copyValuesTo(player.lastFrame.getBones()[effector.getId()]); //else temp.copyValuesTo(player.lastFrame.getObjects()[effector.getId()]); for (int i = 0; i < chainLength && parent != null; i++) { if (Com.Brashmonkey.Spriter.SpriterCalculator.distanceBetween(xx, yy, x, y) <= this .tolerance) { SpriterBone p = null; if (parent.hasParent()) { p = player.getRuntimeBones()[parent.getParentId()]; } int j = 0; while (p != null && j < chainLength) { base.updateRecursively(player, p); if (p.hasParent()) { p = player.getRuntimeBones()[p.getParentId()]; } else { p = null; } j++; } return; } parent.setAngle(parent.getAngle() + Com.Brashmonkey.Spriter.SpriterCalculator.angleDifference (Com.Brashmonkey.Spriter.SpriterCalculator.angleBetween(parent.getX(), parent.getY (), x, y), Com.Brashmonkey.Spriter.SpriterCalculator.angleBetween(parent.getX(), parent.getY(), xx, yy))); base.updateRecursively(player, parent); if (parent.hasParent()) { parent = player.getRuntimeBones()[parent.getParent().getId()]; } else { parent = null; } xx = effector.getX() + (float)System.Math.Cos(SpriterCalculator.DegreeToRadian(effector.getAngle ())) * Com.Brashmonkey.Spriter.draw.AbstractDrawer.BONE_LENGTH * effector.getScaleX (); yy = effector.getY() + (float)System.Math.Sin(SpriterCalculator.DegreeToRadian(effector.getAngle ())) * Com.Brashmonkey.Spriter.draw.AbstractDrawer.BONE_LENGTH * effector.getScaleX (); } }
/// <summary>Attaches a given player to this.</summary> /// <remarks>Attaches a given player to this.</remarks> /// <param name="player">indicates the player which has to be attached.</param> /// <param name="root"> /// indicates the object the attached player has to follow. /// Set to /// <see cref="getRootParent()">getRootParent()</see> /// to attach the player to the same position as this player. /// </param> public virtual void attachPlayer(SpriterAbstractPlayer player, SpriterAbstractObject root) { this.players.Add(player); player.changeRootParent(root); }
/// <param name="parent">the parent to set</param> public virtual void setParent(SpriterAbstractObject parent) { this.parent = parent; }
/// <summary>Adds the given object to the internal SpriterIKObject - SpriterBone map, which works like a HashMap. /// </summary> /// <remarks> /// Adds the given object to the internal SpriterIKObject - SpriterBone map, which works like a HashMap. /// This means, the values of the given object affect the mapped bone. /// </remarks> /// <param name="object"></param> /// <param name="bone"></param> public virtual void mapIKObject(SpriterIKObject @object , SpriterAbstractObject abstractObject) { this.ikMap.Add(@object, abstractObject); }
/// <summary>Resolves the inverse kinematics constraint with a specific algtorithm</summary> /// <param name="x">the target x value</param> /// <param name="y">the target y value</param> /// <param name="chainLength">number of parents which are affected</param> /// <param name="effector">the actual effector where the resolved information has to be stored in. /// </param> protected abstract void resolve(float x, float y, int chainLength, SpriterAbstractObject effector, SpriterAbstractPlayer player);
/// <param name="rootParent">the rootParent to set</param> internal virtual void setRootParent(SpriterAbstractObject rootParent) { this.rootParent = rootParent; }
/// <param name="rootParent">the rootParent to set</param> internal virtual void changeRootParent(SpriterAbstractObject rootParent) { this.rootParent.setParent(rootParent); }
protected internal virtual void updateObject(SpriterAbstractPlayer player, SpriterAbstractObject @object) { player.updateAbstractObject(@object); }