mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 01:36:02 +08:00
[sfml] Added mix-and-match example. See #1375.
This commit is contained in:
parent
ee32f30545
commit
76af7851dc
@ -832,16 +832,16 @@ spSkin* spSkeletonBinary_readSkin(spSkeletonBinary* self, _dataInput* input, int
|
||||
|
||||
if (!defaultSkin) {
|
||||
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++)
|
||||
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++)
|
||||
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++)
|
||||
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) {
|
||||
|
||||
@ -487,8 +487,60 @@ void testSkinsApi(SkeletonData* skeletonData, Atlas* atlas) {
|
||||
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 () {
|
||||
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(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);
|
||||
@ -499,5 +551,6 @@ int main () {
|
||||
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(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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
*/
|
||||
@ -472,6 +517,7 @@ int main () {
|
||||
DebugExtension dbgExtension(SpineExtension::getInstance());
|
||||
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(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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user