
com.brashmonkey.spriter.ik.SpriterCCDResolver Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Spriter Show documentation
Show all versions of Spriter Show documentation
A generic Java library for Spriter animation files.
package com.brashmonkey.spriter.ik;
import com.brashmonkey.spriter.SpriterCalculator;
import com.brashmonkey.spriter.draw.AbstractDrawer;
import com.brashmonkey.spriter.objects.SpriterAbstractObject;
import com.brashmonkey.spriter.objects.SpriterBone;
import com.brashmonkey.spriter.player.SpriterAbstractPlayer;
public class SpriterCCDResolver extends SpriterIKResolver {
@Override
public void resolve(float x, float y, int chainLength, SpriterAbstractObject effector, SpriterAbstractPlayer player) {
super.updateRecursively(player, effector);
float xx = effector.getX()+(float)Math.cos(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX(),
yy = effector.getY()+(float)Math.sin(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
effector.setAngle(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(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){
super.updateRecursively(player, p);
if(p.hasParent()) p = player.getRuntimeBones()[p.getParentId()];
else p = null;
j++;
}
return;
}
parent.setAngle(parent.getAngle() + SpriterCalculator.angleDifference(SpriterCalculator.angleBetween(parent.getX(), parent.getY(), x, y),
SpriterCalculator.angleBetween(parent.getX(), parent.getY(), xx, yy)));
super.updateRecursively(player, parent);
if(parent.hasParent()) parent = player.getRuntimeBones()[parent.getParent().getId()];
else parent = null;
xx = effector.getX()+(float)Math.cos(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
yy = effector.getY()+(float)Math.sin(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy