[sfml] Added mix-and-match example. See #1375.

This commit is contained in:
badlogic 2019-06-13 17:10:17 +02:00
parent ee32f30545
commit 76af7851dc
3 changed files with 104 additions and 5 deletions

View File

@ -832,16 +832,16 @@ spSkin* spSkeletonBinary_readSkin(spSkeletonBinary* self, _dataInput* input, int
if (!defaultSkin) { if (!defaultSkin) {
for (i = 0, n = readVarint(input, 1); i < n; i++) for (i = 0, n = readVarint(input, 1); i < n; i++)
spBoneDataArray_add(skin->bones, spSkeletonData_findBone(skeletonData, readVarint(input, 1))); spBoneDataArray_add(skin->bones, skeletonData->bones[readVarint(input, 1)]);
for (i = 0, n = readVarint(input, 1); i < n; i++) for (i = 0, n = readVarint(input, 1); i < n; i++)
spIkConstraintDataArray_add(skin->ikConstraints, spSkeletonData_findIkConstraint(skeletonData, readVarint(input, 1))); spIkConstraintDataArray_add(skin->ikConstraints, skeletonData->ikConstraints[readVarint(input, 1)]);
for (i = 0, n = readVarint(input, 1); i < n; i++) for (i = 0, n = readVarint(input, 1); i < n; i++)
spTransformConstraintDataArray_add(skin->transformConstraints, spSkeletonData_findTransformConstraint(skeletonData, readVarint(input, 1))); spTransformConstraintDataArray_add(skin->transformConstraints, skeletonData->transformConstraints[readVarint(input, 1)]);
for (i = 0, n = readVarint(input, 1); i < n; i++) for (i = 0, n = readVarint(input, 1); i < n; i++)
spPathConstraintDataArray_add(skin->pathConstraints, spSkeletonData_findPathConstraint(skeletonData, readVarint(input, 1))); spPathConstraintDataArray_add(skin->pathConstraints, skeletonData->pathConstraints[readVarint(input, 1)]);
} }
for (i = 0, n = readVarint(input, 1); i < n; ++i) { for (i = 0, n = readVarint(input, 1); i < n; ++i) {

View File

@ -487,8 +487,60 @@ void testSkinsApi(SkeletonData* skeletonData, Atlas* atlas) {
spSkin_dispose(skin); spSkin_dispose(skin);
} }
void testMixAndMatch(SkeletonData* skeletonData, Atlas* atlas) {
SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData);
drawable->timeScale = 1;
drawable->setUsePremultipliedAlpha(true);
Skeleton* skeleton = drawable->skeleton;
// Create a new skin, by mixing and matching other skins
// that fit together. Items making up the girl are individual
// skins. Using the skin API, a new skin is created which is
// a combination of all these individual item skins.
spSkin* skin = spSkin_create("mix-and-match");
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "skin-base"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "nose/short"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "eyes/eyelids-girly"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "eyes/violet"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "hair/brown"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "clothes/hoodie-orange"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "legs/pants-jeans"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "accessories/bag"));
spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "accessories/hat-red-yellow"));
spSkeleton_setSkin(skeleton, skin);
spSkeleton_setSlotsToSetupPose(skeleton);
skeleton->x = 320;
skeleton->y = 590;
Skeleton_updateWorldTransform(skeleton);
AnimationState_setAnimationByName(drawable->state, 0, "dance", true);
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - mix and match");
window.setFramerateLimit(60);
sf::Event event;
sf::Clock deltaClock;
while (window.isOpen()) {
while (window.pollEvent(event))
if (event.type == sf::Event::Closed) window.close();
float delta = deltaClock.getElapsedTime().asSeconds();
deltaClock.restart();
drawable->update(delta);
window.clear();
window.draw(*drawable);
window.display();
}
spSkin_clear(skin);
spSkin_dispose(skin);
}
int main () { int main () {
testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f); testcase(testMixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f); testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f); testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f); testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
@ -499,5 +551,6 @@ int main () {
testcase(tank, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 0.2f); testcase(tank, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 0.2f);
testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor-pma.atlas", 0.5f); testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor-pma.atlas", 0.5f);
testcase(stretchyman, "data/stretchyman-pro.json", "data/stretchyman-pro.skel", "data/stretchyman-pma.atlas", 0.6f); testcase(stretchyman, "data/stretchyman-pro.json", "data/stretchyman-pro.skel", "data/stretchyman-pma.atlas", 0.6f);
// testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
return 0; return 0;
} }

View File

@ -450,6 +450,51 @@ void owl (SkeletonData* skeletonData, Atlas* atlas) {
} }
} }
void mixAndMatch (SkeletonData* skeletonData, Atlas* atlas) {
SkeletonDrawable drawable(skeletonData);
drawable.timeScale = 1;
drawable.setUsePremultipliedAlpha(true);
Skeleton* skeleton = drawable.skeleton;
Skin skin("mix-and-match");
skin.addSkin(skeletonData->findSkin("skin-base"));
skin.addSkin(skeletonData->findSkin("nose/short"));
skin.addSkin(skeletonData->findSkin("eyes/eyelids-girly"));
skin.addSkin(skeletonData->findSkin("eyes/violet"));
skin.addSkin(skeletonData->findSkin("hair/brown"));
skin.addSkin(skeletonData->findSkin("clothes/hoodie-orange"));
skin.addSkin(skeletonData->findSkin("legs/pants-jeans"));
skin.addSkin(skeletonData->findSkin("accessories/bag"));
skin.addSkin(skeletonData->findSkin("accessories/hat-red-yellow"));
skeleton->setSkin(&skin);
skeleton->setSlotsToSetupPose();
skeleton->setPosition(320, 590);
skeleton->updateWorldTransform();
drawable.state->setAnimation(0, "dance", true);
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - goblins");
window.setFramerateLimit(60);
sf::Event event;
sf::Clock deltaClock;
while (window.isOpen()) {
while (window.pollEvent(event))
if (event.type == sf::Event::Closed) window.close();
float delta = deltaClock.getElapsedTime().asSeconds();
deltaClock.restart();
drawable.update(delta);
window.clear();
window.draw(drawable);
window.display();
}
}
/** /**
* Used for debugging purposes during runtime development * Used for debugging purposes during runtime development
*/ */
@ -472,6 +517,7 @@ int main () {
DebugExtension dbgExtension(SpineExtension::getInstance()); DebugExtension dbgExtension(SpineExtension::getInstance());
SpineExtension::setInstance(&dbgExtension); SpineExtension::setInstance(&dbgExtension);
testcase(mixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f); testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f); testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f);
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f); testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);