mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-04 14:24:53 +08:00
port spine-sfml to cocos2dx
This commit is contained in:
parent
60d70e3a87
commit
fb671c3ce9
42
spine-cpp/includes/spine-cc/Atlas.h
Normal file
42
spine-cpp/includes/spine-cc/Atlas.h
Normal file
@ -0,0 +1,42 @@
|
||||
#ifndef SPINE_ATLAS_H_
|
||||
#define SPINE_ATLAS_H_
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include <spine/BaseAtlas.h>
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
namespace spine {
|
||||
|
||||
class AtlasPage: public BaseAtlasPage {
|
||||
public:
|
||||
~AtlasPage ();
|
||||
|
||||
CCTexture2D *texture;
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
class AtlasRegion: public BaseAtlasRegion {
|
||||
public:
|
||||
AtlasPage *page;
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
class Atlas: public BaseAtlas {
|
||||
public:
|
||||
Atlas (std::ifstream &file);
|
||||
Atlas (std::istream &input);
|
||||
Atlas (const std::string &text);
|
||||
Atlas (const char *begin, const char *end);
|
||||
|
||||
AtlasRegion* findRegion (const std::string &name);
|
||||
|
||||
private:
|
||||
virtual BaseAtlasPage* newAtlasPage (const std::string &name);
|
||||
virtual BaseAtlasRegion* newAtlasRegion (BaseAtlasPage* page);
|
||||
};
|
||||
|
||||
} /* namespace spine */
|
||||
#endif /* SPINE_ATLAS_H_ */
|
||||
20
spine-cpp/includes/spine-cc/AtlasAttachmentLoader.h
Normal file
20
spine-cpp/includes/spine-cc/AtlasAttachmentLoader.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef SPINE_ATLASATTACHMENTLOADER_H_
|
||||
#define SPINE_ATLASATTACHMENTLOADER_H_
|
||||
|
||||
#include <spine/BaseAttachmentLoader.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
class Atlas;
|
||||
|
||||
class AtlasAttachmentLoader: public BaseAttachmentLoader {
|
||||
public:
|
||||
Atlas *atlas;
|
||||
|
||||
AtlasAttachmentLoader (Atlas *atlas);
|
||||
|
||||
virtual Attachment* newAttachment (AttachmentType type, const std::string &name);
|
||||
};
|
||||
|
||||
} /* namespace spine */
|
||||
#endif /* SPINE_ATLASATTACHMENTLOADER_H_ */
|
||||
26
spine-cpp/includes/spine-cc/RegionAttachment.h
Normal file
26
spine-cpp/includes/spine-cc/RegionAttachment.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef SPINE_REGIONATTACHMENT_H_
|
||||
#define SPINE_REGIONATTACHMENT_H_
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include <spine/BaseRegionAttachment.h>
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
namespace spine {
|
||||
|
||||
class Bone;
|
||||
class AtlasRegion;
|
||||
|
||||
class RegionAttachment: public BaseRegionAttachment {
|
||||
public:
|
||||
ccV3F_C4B_T2F_Quad vertices;
|
||||
CCTexture2D *texture;
|
||||
|
||||
RegionAttachment (AtlasRegion *region);
|
||||
|
||||
virtual void updateWorldVertices (Bone *bone);
|
||||
virtual void draw (Slot *slot);
|
||||
};
|
||||
|
||||
} /* namespace spine */
|
||||
#endif /* SPINE_REGIONATTACHMENT_H_ */
|
||||
23
spine-cpp/includes/spine-cc/Skeleton.h
Normal file
23
spine-cpp/includes/spine-cc/Skeleton.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef SPINE_SKELETON_H_
|
||||
#define SPINE_SKELETON_H_
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include <spine/BaseSkeleton.h>
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
namespace spine {
|
||||
|
||||
class Skeleton: public BaseSkeleton {
|
||||
public:
|
||||
std::vector<ccV3F_C4B_T2F_Quad> vertexArray;
|
||||
CCTexture2D *texture; // This is a bit ugly and means all region attachments must use the same textures.
|
||||
CCTextureAtlas* texAtlas;
|
||||
|
||||
Skeleton (SkeletonData *skeletonData);
|
||||
|
||||
virtual void draw () ;
|
||||
};
|
||||
|
||||
} /* namespace spine */
|
||||
#endif /* SPINE_SKELETON_H_ */
|
||||
18
spine-cpp/includes/spine-cc/SkeletonJson.h
Normal file
18
spine-cpp/includes/spine-cc/SkeletonJson.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef SKELETONJSON_H_
|
||||
#define SKELETONJSON_H_
|
||||
|
||||
#include <spine/BaseSkeletonJson.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
class Atlas;
|
||||
|
||||
class SkeletonJson: public BaseSkeletonJson {
|
||||
public:
|
||||
SkeletonJson (Atlas *atlas);
|
||||
/** The SkeletonJson owns the attachmentLoader */
|
||||
SkeletonJson (BaseAttachmentLoader *attachmentLoader);
|
||||
};
|
||||
|
||||
} /* namespace spine */
|
||||
#endif /* SKELETONJSON_H_ */
|
||||
19
spine-cpp/includes/spine-cc/spine.h
Normal file
19
spine-cpp/includes/spine-cc/spine.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef SPINE_SPINE_H_
|
||||
#define SPINE_SPINE_H_
|
||||
|
||||
#include <spine/SkeletonData.h>
|
||||
#include <spine/BoneData.h>
|
||||
#include <spine/SlotData.h>
|
||||
#include <spine/Skin.h>
|
||||
#include <spine/Attachment.h>
|
||||
#include <spine/Animation.h>
|
||||
#include <spine/Slot.h>
|
||||
#include <spine/Bone.h>
|
||||
|
||||
#include <spine-cc/RegionAttachment.h>
|
||||
#include <spine-cc/Atlas.h>
|
||||
#include <spine-cc/AtlasAttachmentLoader.h>
|
||||
#include <spine-cc/SkeletonJson.h>
|
||||
#include <spine-cc/Skeleton.h>
|
||||
|
||||
#endif /* SF_SPINE_H_ */
|
||||
84
spine-cpp/src/cocos2dx/CCSpineNode.cpp
Normal file
84
spine-cpp/src/cocos2dx/CCSpineNode.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
//
|
||||
// CCSpineNode.cpp
|
||||
// SpineExample
|
||||
//
|
||||
// Created by wu shengjin on 13-3-18.
|
||||
//
|
||||
//
|
||||
|
||||
#include "CCSpineNode.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#define FULL_PATH(a) CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(a)
|
||||
|
||||
|
||||
CCSpineNode* CCSpineNode::createWithFileNames(const char* skeletonFileName, const char* atlasFileName)
|
||||
{
|
||||
CCSpineNode* node = new CCSpineNode();
|
||||
if (node && node->initWithFiles(skeletonFileName, atlasFileName)) {
|
||||
node->autorelease();
|
||||
return node;
|
||||
}
|
||||
|
||||
CC_SAFE_DELETE(node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool CCSpineNode::initWithFiles(const char* skeletonFileName, const char* atlasFileName)
|
||||
{
|
||||
std::ifstream atlasFile(FULL_PATH(atlasFileName));
|
||||
Atlas *atlas = new Atlas(atlasFile);
|
||||
|
||||
m_skeletonJson = new SkeletonJson(atlas);
|
||||
|
||||
std::ifstream skeletonFile(FULL_PATH(skeletonFileName));
|
||||
SkeletonData *skeletonData = m_skeletonJson->readSkeletonData(skeletonFile);
|
||||
|
||||
|
||||
m_skeleton = new Skeleton(skeletonData);
|
||||
m_skeleton->setToBindPose();
|
||||
m_skeleton->updateWorldTransform();
|
||||
|
||||
m_animTimer = 0.0f;
|
||||
m_animation = 0;
|
||||
m_loop = true;
|
||||
|
||||
setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor));
|
||||
|
||||
scheduleUpdate();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCSpineNode::playAnimation(const char* fileName, bool loop)
|
||||
{
|
||||
CC_SAFE_DELETE(m_animation);
|
||||
|
||||
std::ifstream animationFile(FULL_PATH(fileName));
|
||||
m_animation = m_skeletonJson->readAnimation(animationFile, m_skeleton->data);
|
||||
|
||||
m_animTimer = 0.0f;
|
||||
m_loop = loop;
|
||||
}
|
||||
|
||||
void CCSpineNode::update(float dt)
|
||||
{
|
||||
if (m_animation && m_skeleton)
|
||||
{
|
||||
m_animTimer += dt;
|
||||
|
||||
m_animation->apply(m_skeleton, m_animTimer, m_loop);
|
||||
m_skeleton->updateWorldTransform();
|
||||
}
|
||||
}
|
||||
|
||||
void CCSpineNode::draw()
|
||||
{
|
||||
CC_NODE_DRAW_SETUP();
|
||||
|
||||
if (m_skeleton)
|
||||
m_skeleton->draw();
|
||||
|
||||
CCNode::draw();
|
||||
}
|
||||
38
spine-cpp/src/cocos2dx/CCSpineNode.h
Normal file
38
spine-cpp/src/cocos2dx/CCSpineNode.h
Normal file
@ -0,0 +1,38 @@
|
||||
//
|
||||
// CCSpineNode.h
|
||||
// SpineExample
|
||||
//
|
||||
// Created by wu shengjin on 13-3-18.
|
||||
//
|
||||
//
|
||||
|
||||
#ifndef __CCSpineNode__
|
||||
#define __CCSpineNode__
|
||||
|
||||
#include "cocos2d.h"
|
||||
#include <spine-cc/spine.h>
|
||||
|
||||
using namespace spine;
|
||||
|
||||
|
||||
USING_NS_CC;
|
||||
|
||||
class CCSpineNode : public CCNode {
|
||||
public:
|
||||
static CCSpineNode* createWithFileNames(const char* skeletonFileName, const char* atlasFileName);
|
||||
bool initWithFiles(const char* skeletonFileName, const char* atlasFileName);
|
||||
|
||||
void playAnimation(const char* fileName, bool loop = true);
|
||||
|
||||
void update(float dt);
|
||||
void draw();
|
||||
private:
|
||||
SkeletonJson* m_skeletonJson;
|
||||
Skeleton* m_skeleton;
|
||||
Animation* m_animation;
|
||||
|
||||
float m_animTimer;
|
||||
bool m_loop;
|
||||
};
|
||||
|
||||
#endif /* defined(__SpineExample__CCSpineNode__) */
|
||||
45
spine-cpp/src/cocos2dx/HelloWorldScene.cpp
Executable file
45
spine-cpp/src/cocos2dx/HelloWorldScene.cpp
Executable file
@ -0,0 +1,45 @@
|
||||
#include "HelloWorldScene.h"
|
||||
#include "SimpleAudioEngine.h"
|
||||
#include "CCSpineNode.h"
|
||||
|
||||
using namespace cocos2d;
|
||||
using namespace CocosDenshion;
|
||||
|
||||
CCScene* HelloWorld::scene()
|
||||
{
|
||||
// 'scene' is an autorelease object
|
||||
CCScene *scene = CCScene::create();
|
||||
|
||||
// 'layer' is an autorelease object
|
||||
HelloWorld *layer = HelloWorld::create();
|
||||
|
||||
// add layer as a child to scene
|
||||
scene->addChild(layer);
|
||||
|
||||
// return the scene
|
||||
return scene;
|
||||
}
|
||||
|
||||
// on "init" you need to initialize your instance
|
||||
bool HelloWorld::init()
|
||||
{
|
||||
//////////////////////////////
|
||||
// 1. super init first
|
||||
if ( !CCLayer::init() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CCSpineNode* spineNode = CCSpineNode::createWithFileNames("./data/spineboy-skeleton.json", "./data/spineboy.atlas");
|
||||
|
||||
spineNode->playAnimation("./data/spineboy-walk.json");
|
||||
|
||||
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
|
||||
spineNode->setPosition(ccp(winSize.width/2, 0));
|
||||
|
||||
|
||||
addChild(spineNode);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
20
spine-cpp/src/cocos2dx/HelloWorldScene.h
Executable file
20
spine-cpp/src/cocos2dx/HelloWorldScene.h
Executable file
@ -0,0 +1,20 @@
|
||||
#ifndef __HELLOWORLD_SCENE_H__
|
||||
#define __HELLOWORLD_SCENE_H__
|
||||
|
||||
#include "cocos2d.h"
|
||||
|
||||
class HelloWorld : public cocos2d::CCLayer
|
||||
{
|
||||
public:
|
||||
// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
|
||||
virtual bool init();
|
||||
|
||||
// there's no 'id' in cpp, so we recommend to return the class instance pointer
|
||||
static cocos2d::CCScene* scene();
|
||||
|
||||
// preprocessor macro for "static create()" constructor ( node() deprecated )
|
||||
CREATE_FUNC(HelloWorld);
|
||||
|
||||
};
|
||||
|
||||
#endif // __HELLOWORLD_SCENE_H__
|
||||
43
spine-cpp/src/spine-cc/Atlas.cpp
Normal file
43
spine-cpp/src/spine-cc/Atlas.cpp
Normal file
@ -0,0 +1,43 @@
|
||||
#include <spine-cc/Atlas.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
AtlasPage::~AtlasPage () {
|
||||
CC_SAFE_RELEASE(texture);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Atlas::Atlas (std::ifstream &file) {
|
||||
load(file);
|
||||
}
|
||||
|
||||
Atlas::Atlas (std::istream &input) {
|
||||
load(input);
|
||||
}
|
||||
|
||||
Atlas::Atlas (const std::string &text) {
|
||||
load(text);
|
||||
}
|
||||
|
||||
Atlas::Atlas (const char *begin, const char *end) {
|
||||
load(begin, end);
|
||||
}
|
||||
|
||||
BaseAtlasPage* Atlas::newAtlasPage (const std::string &name) {
|
||||
AtlasPage *page = new AtlasPage();
|
||||
page->texture = CCTextureCache::sharedTextureCache()->addImage(name.c_str());
|
||||
return page;
|
||||
}
|
||||
|
||||
BaseAtlasRegion* Atlas::newAtlasRegion (BaseAtlasPage* page) {
|
||||
AtlasRegion *region = new AtlasRegion();
|
||||
region->page = reinterpret_cast<AtlasPage*>(page);
|
||||
return region;
|
||||
}
|
||||
|
||||
AtlasRegion* Atlas::findRegion (const std::string &name) {
|
||||
return reinterpret_cast<AtlasRegion*>(BaseAtlas::findRegion(name));
|
||||
}
|
||||
|
||||
} /* namespace spine */
|
||||
24
spine-cpp/src/spine-cc/AtlasAttachmentLoader.cpp
Normal file
24
spine-cpp/src/spine-cc/AtlasAttachmentLoader.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include <stdexcept>
|
||||
#include <spine-cc/AtlasAttachmentLoader.h>
|
||||
#include <spine-cc/Atlas.h>
|
||||
#include <spine-cc/RegionAttachment.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
AtlasAttachmentLoader::AtlasAttachmentLoader (Atlas *atlas) :
|
||||
atlas(atlas) {
|
||||
}
|
||||
|
||||
Attachment* AtlasAttachmentLoader::newAttachment (AttachmentType type, const std::string &name) {
|
||||
switch (type) {
|
||||
case region: {
|
||||
AtlasRegion *region = atlas->findRegion(name);
|
||||
if (!region) throw std::runtime_error("Atlas region not found: " + name);
|
||||
return new RegionAttachment(region);
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error("Unknown attachment type: " + type);
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace spine */
|
||||
84
spine-cpp/src/spine-cc/RegionAttachment.cpp
Normal file
84
spine-cpp/src/spine-cc/RegionAttachment.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
#include <iostream>
|
||||
#include <spine-cc/RegionAttachment.h>
|
||||
#include <spine-cc/Atlas.h>
|
||||
#include <spine-cc/Skeleton.h>
|
||||
#include <spine/Bone.h>
|
||||
#include <spine/Slot.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
RegionAttachment::RegionAttachment (AtlasRegion *region) {
|
||||
texture = region->page->texture;
|
||||
const CCSize& texSize = texture->getContentSizeInPixels();
|
||||
float u = region->x / texSize.width;
|
||||
float u2 = (region->x + region->width) / texSize.width;
|
||||
float v = region->y / texSize.height;
|
||||
float v2 = (region->y + region->height) / texSize.height;
|
||||
if (region->rotate) {
|
||||
vertices.tl.texCoords.u = u;
|
||||
vertices.tl.texCoords.v = v2;
|
||||
vertices.tr.texCoords.u = u;
|
||||
vertices.tr.texCoords.v = v;
|
||||
vertices.br.texCoords.u = u2;
|
||||
vertices.br.texCoords.v = v;
|
||||
vertices.bl.texCoords.u = u2;
|
||||
vertices.bl.texCoords.v = v2;
|
||||
} else {
|
||||
vertices.bl.texCoords.u = u;
|
||||
vertices.bl.texCoords.v = v2;
|
||||
vertices.tl.texCoords.u = u;
|
||||
vertices.tl.texCoords.v = v;
|
||||
vertices.tr.texCoords.u = u2;
|
||||
vertices.tr.texCoords.v = v;
|
||||
vertices.br.texCoords.u = u2;
|
||||
vertices.br.texCoords.v = v2;
|
||||
}
|
||||
}
|
||||
|
||||
void RegionAttachment::draw (Slot *slot) {
|
||||
Skeleton* skeleton = (Skeleton*)slot->skeleton;
|
||||
|
||||
GLubyte r = skeleton->r * slot->r * 255;
|
||||
GLubyte g = skeleton->g * slot->g * 255;
|
||||
GLubyte b = skeleton->b * slot->b * 255;
|
||||
GLubyte a = skeleton->a * slot->a * 255;
|
||||
vertices.bl.colors.r = r;
|
||||
vertices.bl.colors.g = g;
|
||||
vertices.bl.colors.b = b;
|
||||
vertices.bl.colors.a = a;
|
||||
vertices.tl.colors.r = r;
|
||||
vertices.tl.colors.g = g;
|
||||
vertices.tl.colors.b = b;
|
||||
vertices.tl.colors.a = a;
|
||||
vertices.tr.colors.r = r;
|
||||
vertices.tr.colors.g = g;
|
||||
vertices.tr.colors.b = b;
|
||||
vertices.tr.colors.a = a;
|
||||
vertices.br.colors.r = r;
|
||||
vertices.br.colors.g = g;
|
||||
vertices.br.colors.b = b;
|
||||
vertices.br.colors.a = a;
|
||||
|
||||
updateWorldVertices(slot->bone);
|
||||
|
||||
// SMFL doesn't handle batching for us, so we'll just force a single texture per skeleton.
|
||||
skeleton->texture = texture;
|
||||
skeleton->vertexArray.push_back(vertices);
|
||||
}
|
||||
|
||||
void RegionAttachment::updateWorldVertices (spine::Bone *bone) {
|
||||
vertices.bl.vertices.x = offset[0] * bone->m00 + offset[1] * bone->m01 + bone->worldX;
|
||||
vertices.bl.vertices.y = offset[0] * bone->m10 + offset[1] * bone->m11 + bone->worldY;
|
||||
vertices.bl.vertices.z = 0;
|
||||
vertices.tl.vertices.x = offset[2] * bone->m00 + offset[3] * bone->m01 + bone->worldX;
|
||||
vertices.tl.vertices.y = offset[2] * bone->m10 + offset[3] * bone->m11 + bone->worldY;
|
||||
vertices.tl.vertices.z = 0;
|
||||
vertices.tr.vertices.x = offset[4] * bone->m00 + offset[5] * bone->m01 + bone->worldX;
|
||||
vertices.tr.vertices.y = offset[4] * bone->m10 + offset[5] * bone->m11 + bone->worldY;
|
||||
vertices.tr.vertices.z = 0;
|
||||
vertices.br.vertices.x = offset[6] * bone->m00 + offset[7] * bone->m01 + bone->worldX;
|
||||
vertices.br.vertices.y = offset[6] * bone->m10 + offset[7] * bone->m11 + bone->worldY;
|
||||
vertices.br.vertices.z = 0;
|
||||
}
|
||||
|
||||
} /* namespace spine */
|
||||
39
spine-cpp/src/spine-cc/Skeleton.cpp
Normal file
39
spine-cpp/src/spine-cc/Skeleton.cpp
Normal file
@ -0,0 +1,39 @@
|
||||
#include <iostream>
|
||||
#include <spine-cc/Skeleton.h>
|
||||
#include <spine/SkeletonData.h>
|
||||
#include <spine/Slot.h>
|
||||
#include <spine/Attachment.h>
|
||||
|
||||
|
||||
namespace spine {
|
||||
|
||||
Skeleton::Skeleton (SkeletonData *skeletonData) :
|
||||
BaseSkeleton(skeletonData),
|
||||
texAtlas(0),
|
||||
texture(0) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Skeleton::draw () {
|
||||
const_cast<Skeleton*>(this)->vertexArray.clear();
|
||||
for (int i = 0, n = slots.size(); i < n; i++)
|
||||
if (slots[i]->attachment) slots[i]->attachment->draw(slots[i]);
|
||||
|
||||
if (texture == 0)
|
||||
return;
|
||||
|
||||
if (texAtlas == 0)
|
||||
{
|
||||
texAtlas = CCTextureAtlas::createWithTexture(texture, vertexArray.size());
|
||||
texAtlas->retain();
|
||||
}
|
||||
|
||||
for (int i=0; i<vertexArray.size(); i++) {
|
||||
texAtlas->updateQuad(&vertexArray[i], i);
|
||||
}
|
||||
|
||||
texAtlas->drawQuads();
|
||||
}
|
||||
|
||||
} /* namespace spine */
|
||||
16
spine-cpp/src/spine-cc/SkeletonJson.cpp
Normal file
16
spine-cpp/src/spine-cc/SkeletonJson.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
#include <spine-cc/SkeletonJson.h>
|
||||
#include <spine-cc/AtlasAttachmentLoader.h>
|
||||
|
||||
namespace spine {
|
||||
|
||||
SkeletonJson::SkeletonJson (BaseAttachmentLoader *attachmentLoader) :
|
||||
BaseSkeletonJson(attachmentLoader) {
|
||||
yDown = false;
|
||||
}
|
||||
|
||||
SkeletonJson::SkeletonJson (Atlas *atlas) :
|
||||
BaseSkeletonJson(new AtlasAttachmentLoader(atlas)) {
|
||||
yDown = false;
|
||||
}
|
||||
|
||||
} /* namespace spine */
|
||||
Loading…
x
Reference in New Issue
Block a user