mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-22 01:36:42 +08:00
[c] Fix frame and curve array initialization in timelines, add debugging methods.
This commit is contained in:
parent
315ad0e523
commit
a71d73928d
@ -112,6 +112,7 @@ void _spTimeline_init (spTimeline* self,
|
|||||||
) {
|
) {
|
||||||
int i, n;
|
int i, n;
|
||||||
self->frames = spFloatArray_create(frameCount * frameEntries);
|
self->frames = spFloatArray_create(frameCount * frameEntries);
|
||||||
|
self->frames->size = frameCount * frameEntries;
|
||||||
self->frameCount = frameCount;
|
self->frameCount = frameCount;
|
||||||
self->frameEntries = frameEntries;
|
self->frameEntries = frameEntries;
|
||||||
self->vtable.dispose = dispose;
|
self->vtable.dispose = dispose;
|
||||||
@ -120,6 +121,7 @@ void _spTimeline_init (spTimeline* self,
|
|||||||
|
|
||||||
for (i = 0, n = propertyIdsCount; i < n; i++)
|
for (i = 0, n = propertyIdsCount; i < n; i++)
|
||||||
self->propertyIds[i] = propertyIds[i];
|
self->propertyIds[i] = propertyIds[i];
|
||||||
|
self->propertyIdsCount = propertyIdsCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spTimeline_dispose (spTimeline* self) {
|
void spTimeline_dispose (spTimeline* self) {
|
||||||
@ -139,7 +141,7 @@ void spTimeline_setBezier(spTimeline* self, int bezier, int frame, float value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int spTimeline_getFrameCount (const spTimeline* self) {
|
int spTimeline_getFrameCount (const spTimeline* self) {
|
||||||
return self->frameCount / self->frameEntries;
|
return self->frameCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
float spTimeline_getDuration (const spTimeline* self) {
|
float spTimeline_getDuration (const spTimeline* self) {
|
||||||
@ -166,6 +168,7 @@ void _spCurveTimeline_init (spCurveTimeline* self,
|
|||||||
float cx2, float cy2, float time2, float value2)) {
|
float cx2, float cy2, float time2, float value2)) {
|
||||||
_spTimeline_init(SUPER(self), frameCount, frameEntries, propertyIds, propertyIdsCount, dispose, apply, setBezier);
|
_spTimeline_init(SUPER(self), frameCount, frameEntries, propertyIds, propertyIdsCount, dispose, apply, setBezier);
|
||||||
self->curves = spFloatArray_create(frameCount + bezierCount * BEZIER_SIZE);
|
self->curves = spFloatArray_create(frameCount + bezierCount * BEZIER_SIZE);
|
||||||
|
self->curves->size = frameCount + bezierCount * BEZIER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _spCurveTimeline_dispose (spTimeline* self) {
|
void _spCurveTimeline_dispose (spTimeline* self) {
|
||||||
|
|||||||
@ -94,12 +94,12 @@ void testcase (void func(spSkeletonData* skeletonData, spAtlas* atlas),
|
|||||||
const char* jsonName, const char* binaryName, const char* atlasName,
|
const char* jsonName, const char* binaryName, const char* atlasName,
|
||||||
float scale) {
|
float scale) {
|
||||||
spAtlas* atlas = spAtlas_createFromFile(atlasName, 0);
|
spAtlas* atlas = spAtlas_createFromFile(atlasName, 0);
|
||||||
|
UNUSED(jsonName);
|
||||||
spSkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas, scale);
|
/*spSkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas, scale);
|
||||||
func(skeletonData, atlas);
|
func(skeletonData, atlas);
|
||||||
spSkeletonData_dispose(skeletonData);
|
spSkeletonData_dispose(skeletonData);*/
|
||||||
|
|
||||||
skeletonData = readSkeletonBinaryData(binaryName, atlas, scale);
|
spSkeletonData *skeletonData = readSkeletonBinaryData(binaryName, atlas, scale);
|
||||||
func(skeletonData, atlas);
|
func(skeletonData, atlas);
|
||||||
spSkeletonData_dispose(skeletonData);
|
spSkeletonData_dispose(skeletonData);
|
||||||
|
|
||||||
@ -289,8 +289,8 @@ void raptor (spSkeletonData* skeletonData, spAtlas* atlas) {
|
|||||||
skeleton->y = 590;
|
skeleton->y = 590;
|
||||||
spSkeleton_updateWorldTransform(skeleton);
|
spSkeleton_updateWorldTransform(skeleton);
|
||||||
|
|
||||||
spAnimationState_setAnimationByName(drawable->state, 0, "walk", true);
|
spAnimationState_setAnimationByName(drawable->state, 0, "walk", true);
|
||||||
spAnimationState_addAnimationByName(drawable->state, 1, "gun-grab", false, 2);
|
spAnimationState_addAnimationByName(drawable->state, 1, "gun-grab", false, 2);
|
||||||
|
|
||||||
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - raptor");
|
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - raptor");
|
||||||
window.setFramerateLimit(60);
|
window.setFramerateLimit(60);
|
||||||
@ -438,7 +438,7 @@ void coin (spSkeletonData* skeletonData, spAtlas* atlas) {
|
|||||||
float delta = deltaClock.getElapsedTime().asSeconds();
|
float delta = deltaClock.getElapsedTime().asSeconds();
|
||||||
deltaClock.restart();
|
deltaClock.restart();
|
||||||
|
|
||||||
drawable->update(delta);
|
drawable->update(delta - delta);
|
||||||
|
|
||||||
window.clear();
|
window.clear();
|
||||||
window.draw(*drawable);
|
window.draw(*drawable);
|
||||||
@ -625,17 +625,17 @@ void testMixAndMatch(spSkeletonData* skeletonData, spAtlas* atlas) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main () {
|
int main () {
|
||||||
testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
// testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
||||||
testcase(testMixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
|
// testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
||||||
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
|
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
|
||||||
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
|
testcase(testMixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
|
||||||
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
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(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
|
||||||
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
|
testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f);
|
||||||
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
|
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
|
||||||
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);
|
testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -151,11 +151,21 @@ SkeletonDrawable::~SkeletonDrawable () {
|
|||||||
spColorArray_dispose(tempColors);
|
spColorArray_dispose(tempColors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printSkeleton(spSkeleton* skeleton) {
|
||||||
|
int i, n;
|
||||||
|
printf("===== Skeleton\n");
|
||||||
|
for (i = 0, n = skeleton->bonesCount; i < n; i++) {
|
||||||
|
spBone *bone = skeleton->bones[i];
|
||||||
|
printf("%s: %f, %f, %f, %f, %f, %f\n", bone->data->name, bone->a, bone->b, bone->c, bone->d, bone->worldX, bone->worldY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SkeletonDrawable::update (float deltaTime) {
|
void SkeletonDrawable::update (float deltaTime) {
|
||||||
spSkeleton_update(skeleton, deltaTime);
|
spSkeleton_update(skeleton, deltaTime);
|
||||||
spAnimationState_update(state, deltaTime * timeScale);
|
spAnimationState_update(state, deltaTime * timeScale);
|
||||||
spAnimationState_apply(state, skeleton);
|
spAnimationState_apply(state, skeleton);
|
||||||
spSkeleton_updateWorldTransform(skeleton);
|
spSkeleton_updateWorldTransform(skeleton);
|
||||||
|
printSkeleton(skeleton);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const {
|
void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const {
|
||||||
|
|||||||
@ -462,7 +462,7 @@ void coin (SkeletonData* skeletonData, Atlas* atlas) {
|
|||||||
skeleton->setPosition(320, 320);
|
skeleton->setPosition(320, 320);
|
||||||
skeleton->updateWorldTransform();
|
skeleton->updateWorldTransform();
|
||||||
|
|
||||||
drawable.state->setAnimation(0, "animation", true);
|
// drawable.state->setAnimation(0, "animation", true);
|
||||||
|
|
||||||
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - coin");
|
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - coin");
|
||||||
window.setFramerateLimit(60);
|
window.setFramerateLimit(60);
|
||||||
@ -477,7 +477,7 @@ void coin (SkeletonData* skeletonData, Atlas* atlas) {
|
|||||||
float delta = deltaClock.getElapsedTime().asSeconds();
|
float delta = deltaClock.getElapsedTime().asSeconds();
|
||||||
deltaClock.restart();
|
deltaClock.restart();
|
||||||
|
|
||||||
drawable.update(delta);
|
drawable.update(delta - delta);
|
||||||
|
|
||||||
window.clear();
|
window.clear();
|
||||||
window.draw(drawable);
|
window.draw(drawable);
|
||||||
@ -615,13 +615,13 @@ DebugExtension dbgExtension(SpineExtension::getInstance());
|
|||||||
int main () {
|
int main () {
|
||||||
SpineExtension::setInstance(&dbgExtension);
|
SpineExtension::setInstance(&dbgExtension);
|
||||||
|
|
||||||
|
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
|
||||||
testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
|
||||||
testcase(mixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
|
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);
|
||||||
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(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
|
|
||||||
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
|
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
|
||||||
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);
|
||||||
|
|||||||
@ -77,11 +77,21 @@ SkeletonDrawable::~SkeletonDrawable() {
|
|||||||
delete skeleton;
|
delete skeleton;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printSkeleton(Skeleton* skeleton) {
|
||||||
|
int i, n;
|
||||||
|
printf("===== Skeleton\n");
|
||||||
|
for (i = 0, n = skeleton->getBones().size(); i < n; i++) {
|
||||||
|
Bone *bone = skeleton->getBones()[i];
|
||||||
|
printf("%s: %f, %f, %f, %f, %f, %f\n", bone->getData().getName().buffer(), bone->getA(), bone->getB(), bone->getC(), bone->getD(), bone->getWorldX(), bone->getWorldY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SkeletonDrawable::update(float deltaTime) {
|
void SkeletonDrawable::update(float deltaTime) {
|
||||||
skeleton->update(deltaTime);
|
skeleton->update(deltaTime);
|
||||||
state->update(deltaTime * timeScale);
|
state->update(deltaTime * timeScale);
|
||||||
state->apply(*skeleton);
|
state->apply(*skeleton);
|
||||||
skeleton->updateWorldTransform();
|
skeleton->updateWorldTransform();
|
||||||
|
printSkeleton(skeleton);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonDrawable::draw(RenderTarget &target, RenderStates states) const {
|
void SkeletonDrawable::draw(RenderTarget &target, RenderStates states) const {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user