From 93352ff06f2bceeb7576f11222e72a4ce35999e7 Mon Sep 17 00:00:00 2001 From: RH Date: Mon, 6 Jan 2020 12:35:52 +1100 Subject: [PATCH] V4 bmfont improved api (#20406) * Merged improved BM font API from Cocos2d-x V3. Code based on #20309 and #20300 * Added missing test resources. --- cocos/2d/CCFontAtlas.cpp | 2 + cocos/2d/CCFontAtlas.h | 1 + cocos/2d/CCFontAtlasCache.cpp | 60 +- cocos/2d/CCFontAtlasCache.h | 10 +- cocos/2d/CCFontCharMap.cpp | 1 + cocos/2d/CCFontFNT.cpp | 206 +++---- cocos/2d/CCFontFNT.h | 129 ++++- cocos/2d/CCLabel.cpp | 142 ++++- cocos/2d/CCLabel.h | 65 ++- .../lua-bindings/auto/lua_cocos2dx_auto.cpp | 539 ++++++++++-------- .../auto/lua_cocos2dx_extension_auto.cpp | 300 +++++----- .../auto/lua_cocos2dx_studio_auto.cpp | 96 ++-- .../Classes/LabelTest/LabelTestNew.cpp | 53 ++ .../Classes/LabelTest/LabelTestNew.h | 21 + .../Resources/fonts/bmfont-rotated-test.plist | 56 ++ .../Resources/fonts/bmfont-rotated-test.png | Bin 0 -> 111610 bytes .../Resources/fonts/geneva-regular-32.fnt | 99 ++++ .../Resources/fonts/helvetica-regular-32.fnt | 99 ++++ 18 files changed, 1306 insertions(+), 573 deletions(-) create mode 100644 tests/cpp-tests/Resources/fonts/bmfont-rotated-test.plist create mode 100644 tests/cpp-tests/Resources/fonts/bmfont-rotated-test.png create mode 100644 tests/cpp-tests/Resources/fonts/geneva-regular-32.fnt create mode 100644 tests/cpp-tests/Resources/fonts/helvetica-regular-32.fnt diff --git a/cocos/2d/CCFontAtlas.cpp b/cocos/2d/CCFontAtlas.cpp index 37a8be8b6d..5e1b89a57e 100644 --- a/cocos/2d/CCFontAtlas.cpp +++ b/cocos/2d/CCFontAtlas.cpp @@ -445,6 +445,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u32string& utf32Text) tempDef.height = tempDef.height / scaleFactor; tempDef.U = tempDef.U / scaleFactor; tempDef.V = tempDef.V / scaleFactor; + tempDef.rotated = false; } else{ if(bitmap) @@ -461,6 +462,7 @@ bool FontAtlas::prepareLetterDefinitions(const std::u32string& utf32Text) tempDef.offsetX = 0; tempDef.offsetY = 0; tempDef.textureID = 0; + tempDef.rotated = false; _currentPageOrigX += 1; } diff --git a/cocos/2d/CCFontAtlas.h b/cocos/2d/CCFontAtlas.h index cb9930cbb3..d24a708d11 100644 --- a/cocos/2d/CCFontAtlas.h +++ b/cocos/2d/CCFontAtlas.h @@ -55,6 +55,7 @@ struct FontLetterDefinition int textureID; bool validDefinition; int xAdvance; + bool rotated; }; class CC_DLL FontAtlas : public Ref diff --git a/cocos/2d/CCFontAtlasCache.cpp b/cocos/2d/CCFontAtlasCache.cpp index 6240c16a3d..f9ab164096 100644 --- a/cocos/2d/CCFontAtlasCache.cpp +++ b/cocos/2d/CCFontAtlasCache.cpp @@ -88,22 +88,53 @@ FontAtlas* FontAtlasCache::getFontAtlasTTF(const _ttfConfig* config) return nullptr; } -FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset /* = Vec2::ZERO */) +FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName) { - auto realFontFilename = FileUtils::getInstance()->getNewFilename(fontFileName); // resolves real file path, to prevent storing multiple atlases for the same file. + return getFontAtlasFNT(fontFileName, Rect::ZERO, false); +} + +FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName, const std::string& subTextureKey) +{ + const auto realFontFilename = FileUtils::getInstance()->getNewFilename(fontFileName); // resolves real file path, to prevent storing multiple atlases for the same file. + std::string atlasName = subTextureKey + " " + realFontFilename; + + const auto it = _atlasMap.find(atlasName); + if (it == _atlasMap.end()) + { + const auto font = FontFNT::create(realFontFilename, subTextureKey); + + if (font) + { + const auto tempAtlas = font->createFontAtlas(); + if (tempAtlas) + { + _atlasMap[atlasName] = tempAtlas; + return _atlasMap[atlasName]; + } + } + } + else + return it->second; + + return nullptr; +} + +FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName, const Rect& imageRect, bool imageRotated) +{ + const auto realFontFilename = FileUtils::getInstance()->getNewFilename(fontFileName); // resolves real file path, to prevent storing multiple atlases for the same file. char keyPrefix[ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE]; - snprintf(keyPrefix, ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE, "%.2f %.2f ", imageOffset.x, imageOffset.y); + snprintf(keyPrefix, ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE, "%.2f %.2f ", imageRect.origin.x, imageRect.origin.y); std::string atlasName(keyPrefix); atlasName += realFontFilename; - auto it = _atlasMap.find(atlasName); + const auto it = _atlasMap.find(atlasName); if ( it == _atlasMap.end() ) { - auto font = FontFNT::create(realFontFilename, imageOffset); + const auto font = FontFNT::create(realFontFilename, imageRect, imageRotated); if(font) { - auto tempAtlas = font->createFontAtlas(); + const auto tempAtlas = font->createFontAtlas(); if (tempAtlas) { _atlasMap[atlasName] = tempAtlas; @@ -117,9 +148,14 @@ FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName, cons return nullptr; } +FontAtlas* FontAtlasCache::getFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset) +{ + return getFontAtlasFNT(fontFileName, Rect(imageOffset.x, imageOffset.y, 0, 0), false); +} + FontAtlas* FontAtlasCache::getFontAtlasCharMap(const std::string& plistFile) { - std::string atlasName = plistFile; + const std::string& atlasName = plistFile; auto it = _atlasMap.find(atlasName); if ( it == _atlasMap.end() ) @@ -220,10 +256,10 @@ bool FontAtlasCache::releaseFontAtlas(FontAtlas *atlas) return false; } -void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset/* = Vec2::ZERO*/) +void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const Rect& imageRect, bool imageRotated) { char keyPrefix[ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE]; - snprintf(keyPrefix, ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE, "%.2f %.2f ", imageOffset.x, imageOffset.y); + snprintf(keyPrefix, ATLAS_MAP_KEY_PREFIX_BUFFER_SIZE, "%.2f %.2f ", imageRect.origin.x, imageRect.origin.y); std::string atlasName(keyPrefix); atlasName += fontFileName; @@ -234,7 +270,7 @@ void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const V _atlasMap.erase(it); } FontFNT::reloadBMFontResource(fontFileName); - auto font = FontFNT::create(fontFileName, imageOffset); + auto font = FontFNT::create(fontFileName, imageRect, imageRotated); if (font) { auto tempAtlas = font->createFontAtlas(); @@ -243,7 +279,11 @@ void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const V _atlasMap[atlasName] = tempAtlas; } } +} +void FontAtlasCache::reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset) +{ + reloadFontAtlasFNT(fontFileName, Rect(imageOffset.x, imageOffset.y, 0, 0), false); } void FontAtlasCache::unloadFontAtlasTTF(const std::string& fontFileName) diff --git a/cocos/2d/CCFontAtlasCache.h b/cocos/2d/CCFontAtlasCache.h index 9ef267651b..2479d80c86 100644 --- a/cocos/2d/CCFontAtlasCache.h +++ b/cocos/2d/CCFontAtlasCache.h @@ -42,7 +42,11 @@ class CC_DLL FontAtlasCache { public: static FontAtlas* getFontAtlasTTF(const _ttfConfig* config); - static FontAtlas* getFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset = Vec2::ZERO); + + static FontAtlas* getFontAtlasFNT(const std::string& fontFileName); + static FontAtlas* getFontAtlasFNT(const std::string& fontFileName, const std::string& subTextureKey); + static FontAtlas* getFontAtlasFNT(const std::string& fontFileName, const Rect& imageRect, bool imageRotated); + CC_DEPRECATED_ATTRIBUTE static FontAtlas* getFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset); static FontAtlas* getFontAtlasCharMap(const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap); static FontAtlas* getFontAtlasCharMap(Texture2D* texture, int itemWidth, int itemHeight, int startCharMap); @@ -59,7 +63,9 @@ public: CAUTION : All component use this font texture should be reset font name, though the file name is same! otherwise, it will cause program crash! */ - static void reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset = Vec2::ZERO); + static void reloadFontAtlasFNT(const std::string& fontFileName, const Rect& imageRect, bool imageRotated); + + CC_DEPRECATED_ATTRIBUTE static void reloadFontAtlasFNT(const std::string& fontFileName, const Vec2& imageOffset = Vec2::ZERO); /** Unload all texture atlas texture create by special file name. CAUTION : All component use this font texture should be reset font name, though the file name is same! diff --git a/cocos/2d/CCFontCharMap.cpp b/cocos/2d/CCFontCharMap.cpp index ee4f1b796b..10b5a4eb7e 100644 --- a/cocos/2d/CCFontCharMap.cpp +++ b/cocos/2d/CCFontCharMap.cpp @@ -126,6 +126,7 @@ FontAtlas * FontCharMap::createFontAtlas() tempDefinition.width = _itemWidth / contentScaleFactor; tempDefinition.height = _itemHeight / contentScaleFactor; tempDefinition.xAdvance = _itemWidth; + tempDefinition.rotated = false; int charId = _mapStartChar; for (int row = 0; row < itemsPerColumn; ++row) diff --git a/cocos/2d/CCFontFNT.cpp b/cocos/2d/CCFontFNT.cpp index 4724e13450..8d1fc34d1e 100644 --- a/cocos/2d/CCFontFNT.cpp +++ b/cocos/2d/CCFontFNT.cpp @@ -26,6 +26,7 @@ #include "2d/CCFontFNT.h" #include "2d/CCFontAtlas.h" +#include "2d/CCSpriteFrameCache.h" #include "platform/CCFileUtils.h" #include "base/CCConfiguration.h" #include "base/CCDirector.h" @@ -34,8 +35,6 @@ #include "renderer/CCTextureCache.h" #include -#include -#include NS_CC_BEGIN @@ -52,99 +51,6 @@ enum { struct _FontDefHashElement; -/** -@struct BMFontDef -BMFont definition -*/ -typedef struct _BMFontDef { - //! ID of the character - unsigned int charID; - //! origin and size of the font - Rect rect; - //! The X amount the image should be offset when drawing the image (in pixels) - short xOffset; - //! The Y amount the image should be offset when drawing the image (in pixels) - short yOffset; - //! The amount to move the current position after drawing the character (in pixels) - short xAdvance; -} BMFontDef; - -/** @struct BMFontPadding -BMFont padding -@since v0.8.2 -*/ -typedef struct _BMFontPadding { - /// padding left - int left; - /// padding top - int top; - /// padding right - int right; - /// padding bottom - int bottom; -} BMFontPadding; - -/** @brief BMFontConfiguration has parsed configuration of the .fnt file -@since v0.8 -*/ -class CC_DLL BMFontConfiguration : public Ref -{ - // FIXME: Creating a public interface so that the bitmapFontArray[] is accessible -public://@public - // BMFont definitions - std::unordered_map _fontDefDictionary; - - //! FNTConfig: Common Height Should be signed (issue #1343) - int _commonHeight; - //! Padding - BMFontPadding _padding; - //! atlas name - std::string _atlasName; - //! values for kerning - std::unordered_map _kerningDictionary; - - // Character Set defines the letters that actually exist in the font - std::set *_characterSet; - //! Font Size - int _fontSize; -public: - /** - * @js ctor - */ - BMFontConfiguration(); - /** - * @js NA - * @lua NA - */ - virtual ~BMFontConfiguration(); - /** - * @js NA - * @lua NA - */ - std::string description() const; - - /** allocates a BMFontConfiguration with a FNT file */ - static BMFontConfiguration * create(const std::string& FNTfile); - - /** initializes a BitmapFontConfiguration with a FNT file */ - bool initWithFNTfile(const std::string& FNTfile); - - const std::string& getAtlasName() { return _atlasName; } - void setAtlasName(const std::string& atlasName) { _atlasName = atlasName; } - - std::set* getCharacterSet() const; -private: - std::set* parseConfigFile(const std::string& controlFile); - std::set* parseBinaryConfigFile(unsigned char* pData, unsigned long size, const std::string& controlFile); - unsigned int parseCharacterDefinition(const char* line); - void parseInfoArguments(const char* line); - void parseCommonArguments(const char* line); - void parseImageFileName(const char* line, const std::string& fntFile); - void parseKerningEntry(const char* line); - void purgeKerningDictionary(); - void purgeFontDefDictionary(); -}; - // //FNTConfig Cache - free functions // @@ -488,9 +394,10 @@ void BMFontConfiguration::parseImageFileName(const char* line, const std::string int pageId; sscanf(line, "page id=%d", &pageId); CCASSERT(pageId == 0, "LabelBMFont file could not be found"); + // file char fileName[255]; - sscanf(strchr(line,'"') + 1, "%[^\"]", fileName); + sscanf(strstr(line, "file=\"") + 6, "%[^\"]", fileName); _atlasName = FileUtils::getInstance()->fullPathFromRelativeFile(fileName, fntFile); } @@ -603,20 +510,59 @@ void BMFontConfiguration::parseKerningEntry(const char* line) _kerningDictionary[key] = amount; } -FontFNT * FontFNT::create(const std::string& fntFilePath, const Vec2& imageOffset /* = Vec2::ZERO */) +FontFNT * FontFNT::create(const std::string& fntFilePath, const Rect& imageRect, bool imageRotated) { - BMFontConfiguration *newConf = FNTConfigLoadFile(fntFilePath); + const auto newConf = FNTConfigLoadFile(fntFilePath); if (!newConf) return nullptr; + const auto tempFont = new FontFNT(newConf, imageRect, imageRotated); + + if (!tempFont) + { + return nullptr; + } + tempFont->setFontSize((float)newConf->_fontSize); + tempFont->autorelease(); + return tempFont; +} + +FontFNT* FontFNT::create(const std::string& fntFilePath, const std::string& subTextureKey) +{ + const auto newConf = FNTConfigLoadFile(fntFilePath); + if (!newConf) + return nullptr; + + const auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(subTextureKey); + if (!frame) + { + return nullptr; + } + auto tempFont = new FontFNT(newConf, frame->getRectInPixels(), frame->isRotated()); + + if (!tempFont) + { + return nullptr; + } + tempFont->setFontSize((float)newConf->_fontSize); + tempFont->autorelease(); + return tempFont; +} + +FontFNT* FontFNT::create(const std::string& fntFilePath) +{ + const auto newConf = FNTConfigLoadFile(fntFilePath); + if (!newConf) + return nullptr; + // add the texture - Texture2D *tempTexture = Director::getInstance()->getTextureCache()->addImage(newConf->getAtlasName()); + const auto tempTexture = Director::getInstance()->getTextureCache()->addImage(newConf->getAtlasName()); if (!tempTexture) { return nullptr; } - - FontFNT *tempFont = new FontFNT(newConf,imageOffset); + FontFNT* tempFont = new FontFNT(newConf); + tempFont->setFontSize((float)newConf->_fontSize); if (!tempFont) { @@ -626,13 +572,26 @@ FontFNT * FontFNT::create(const std::string& fntFilePath, const Vec2& imageOffse return tempFont; } -FontFNT::FontFNT(BMFontConfiguration *theContfig, const Vec2& imageOffset /* = Vec2::ZERO */) -:_configuration(theContfig) -,_imageOffset(CC_POINT_PIXELS_TO_POINTS(imageOffset)) +FontFNT* FontFNT::create(const std::string& fntFilePath, const Vec2& imageOffset) +{ + return create(fntFilePath, Rect(imageOffset.x, imageOffset.y, 0, 0), false); +} + +FontFNT::FontFNT(BMFontConfiguration *theContfig, const Rect& imageRect, bool imageRotated) +: _configuration(theContfig) +, _imageRectInPoints(CC_RECT_PIXELS_TO_POINTS(imageRect)) +, _imageRotated(imageRotated) { _configuration->retain(); } +FontFNT::FontFNT(BMFontConfiguration* theContfig) +: _configuration(theContfig) +, _imageRectInPoints(Rect::ZERO) +, _imageRotated(false) +{ +} + FontFNT::~FontFNT() { _configuration->release(); @@ -722,24 +681,39 @@ FontAtlas * FontFNT::createFontAtlas() } tempAtlas->setLineHeight(originalLineHeight * factor); - + + auto rw = _imageRectInPoints.size.width; + auto rh = _imageRectInPoints.size.height; + + if (_imageRotated) + std::swap(rw, rh); + + const auto left = _imageRectInPoints.origin.x; + const auto right = _imageRectInPoints.origin.x + rw; + const auto top = _imageRectInPoints.origin.y; + for (auto&& e : _configuration->_fontDefDictionary) { BMFontDef& fontDef = e.second; - + FontLetterDefinition tempDefinition; - Rect tempRect; - - tempRect = fontDef.rect; - tempRect = CC_RECT_PIXELS_TO_POINTS(tempRect); + const auto tempRect = CC_RECT_PIXELS_TO_POINTS(fontDef.rect); tempDefinition.offsetX = fontDef.xOffset; tempDefinition.offsetY = fontDef.yOffset; - - tempDefinition.U = tempRect.origin.x + _imageOffset.x; - tempDefinition.V = tempRect.origin.y + _imageOffset.y; - + + if (_imageRotated) + { + tempDefinition.U = right - tempRect.origin.y - tempRect.size.height; + tempDefinition.V = tempRect.origin.x + top; + } + else + { + tempDefinition.U = tempRect.origin.x + left; + tempDefinition.V = tempRect.origin.y + top; + } + tempDefinition.width = tempRect.size.width; tempDefinition.height = tempRect.size.height; @@ -748,6 +722,8 @@ FontAtlas * FontFNT::createFontAtlas() tempDefinition.validDefinition = true; tempDefinition.xAdvance = fontDef.xAdvance; + tempDefinition.rotated = _imageRotated; + // add the new definition if (65535 < fontDef.charID) { CCLOGWARN("Warning: 65535 < fontDef.charID (%u), ignored", fontDef.charID); @@ -783,12 +759,12 @@ void FontFNT::reloadBMFontResource(const std::string& fntFilePath) { s_configurations->erase(fntFilePath); } + ret = BMFontConfiguration::create(fntFilePath); if (ret) { s_configurations->insert(fntFilePath, ret); Director::getInstance()->getTextureCache()->reloadTexture(ret->getAtlasName()); - } } diff --git a/cocos/2d/CCFontFNT.h b/cocos/2d/CCFontFNT.h index d0b932fd4f..83a07f1634 100644 --- a/cocos/2d/CCFontFNT.h +++ b/cocos/2d/CCFontFNT.h @@ -30,43 +30,154 @@ /// @cond DO_NOT_SHOW #include "2d/CCFont.h" +#include +#include NS_CC_BEGIN -class BMFontConfiguration; +/** +@struct BMFontDef +BMFont definition +*/ +typedef struct _BMFontDef { + //! ID of the character + unsigned int charID; + //! origin and size of the font + Rect rect; + //! The X amount the image should be offset when drawing the image (in pixels) + short xOffset; + //! The Y amount the image should be offset when drawing the image (in pixels) + short yOffset; + //! The amount to move the current position after drawing the character (in pixels) + short xAdvance; +} BMFontDef; + +/** @struct BMFontPadding +BMFont padding +@since v0.8.2 +*/ +typedef struct _BMFontPadding { + /// padding left + int left; + /// padding top + int top; + /// padding right + int right; + /// padding bottom + int bottom; +} BMFontPadding; + +/** @brief BMFontConfiguration has parsed configuration of the .fnt file +@since v0.8 +*/ +class CC_DLL BMFontConfiguration : public Ref +{ + // FIXME: Creating a public interface so that the bitmapFontArray[] is accessible +public://@public + // BMFont definitions + std::unordered_map _fontDefDictionary; + + //! FNTConfig: Common Height Should be signed (issue #1343) + int _commonHeight; + + //! Padding + BMFontPadding _padding; + + //! atlas name + std::string _atlasName; + + //! values for kerning + std::unordered_map _kerningDictionary; + + // Character Set defines the letters that actually exist in the font + std::set* _characterSet; + + //! Font Size + int _fontSize; +public: + /** + * @js ctor + */ + BMFontConfiguration(); + /** + * @js NA + * @lua NA + */ + virtual ~BMFontConfiguration(); + /** + * @js NA + * @lua NA + */ + std::string description() const; + + /** allocates a BMFontConfiguration with a FNT file */ + static BMFontConfiguration* create(const std::string& FNTfile); + + /** initializes a BitmapFontConfiguration with a FNT file */ + bool initWithFNTfile(const std::string& FNTfile); + + const std::string& getAtlasName() { return _atlasName; } + void setAtlasName(const std::string& atlasName) { _atlasName = atlasName; } + + std::set* getCharacterSet() const; + +protected: + virtual std::set* parseConfigFile(const std::string& controlFile); + virtual std::set* parseBinaryConfigFile(unsigned char* pData, unsigned long size, const std::string& controlFile); + +private: + unsigned int parseCharacterDefinition(const char* line); + void parseInfoArguments(const char* line); + void parseCommonArguments(const char* line); + void parseImageFileName(const char* line, const std::string& fntFile); + void parseKerningEntry(const char* line); + void purgeKerningDictionary(); + void purgeFontDefDictionary(); +}; class CC_DLL FontFNT : public Font { public: - static FontFNT * create(const std::string& fntFilePath, const Vec2& imageOffset = Vec2::ZERO); + static FontFNT* create(const std::string& fntFilePath, const Rect& imageRect, bool imageRotated); + static FontFNT* create(const std::string& fntFilePath, const std::string& subTextureKey); + static FontFNT* create(const std::string& fntFilePath); + + CC_DEPRECATED_ATTRIBUTE static FontFNT* create(const std::string& fntFilePath, const Vec2& imageOffset = Vec2::ZERO); + /** Purges the cached data. Removes from memory the cached configurations and the atlas name dictionary. */ static void purgeCachedData(); virtual int* getHorizontalKerningForTextUTF32(const std::u32string& text, int &outNumLetters) const override; virtual FontAtlas *createFontAtlas() override; + void setFontSize(float fontSize); + float getFontSize() const { return _fontSize; } + int getOriginalFontSize()const; static void reloadBMFontResource(const std::string& fntFilePath); protected: - FontFNT(BMFontConfiguration *theContfig, const Vec2& imageOffset = Vec2::ZERO); + FontFNT(BMFontConfiguration* theContfig, const Rect& imageRect, bool imageRotated); + FontFNT(BMFontConfiguration* theContfig); + /** * @js NA * @lua NA */ virtual ~FontFNT(); - -private: - + + BMFontConfiguration* _configuration; + int getHorizontalKerningForChars(char32_t firstChar, char32_t secondChar) const; - - BMFontConfiguration * _configuration; - Vec2 _imageOffset; + + Rect _imageRectInPoints; + bool _imageRotated; + //User defined font size float _fontSize; }; diff --git a/cocos/2d/CCLabel.cpp b/cocos/2d/CCLabel.cpp index 43ed0b4469..aa99487826 100644 --- a/cocos/2d/CCLabel.cpp +++ b/cocos/2d/CCLabel.cpp @@ -280,11 +280,11 @@ Label* Label::createWithTTF(const TTFConfig& ttfConfig, const std::string& text, return nullptr; } -Label* Label::createWithBMFont(const std::string& bmfontFilePath, const std::string& text,const TextHAlignment& hAlignment /* = TextHAlignment::LEFT */, int maxLineWidth /* = 0 */, const Vec2& imageOffset /* = Vec2::ZERO */) +Label* Label::createWithBMFont(const std::string& bmfontPath, const std::string& text, const TextHAlignment& hAlignment, int maxLineWidth) { auto ret = new (std::nothrow) Label(hAlignment); - if (ret && ret->setBMFontFilePath(bmfontFilePath,imageOffset)) + if (ret && ret->setBMFontFilePath(bmfontPath)) { ret->setMaxLineWidth(maxLineWidth); ret->setString(text); @@ -292,11 +292,50 @@ Label* Label::createWithBMFont(const std::string& bmfontFilePath, const std::str return ret; } - + delete ret; return nullptr; } +Label* Label::createWithBMFont(const std::string& bmfontPath, const std::string& text, const TextHAlignment& hAlignment, int maxLineWidth, const Rect& imageRect, bool imageRotated) +{ + auto ret = new (std::nothrow) Label(hAlignment); + + if (ret && ret->setBMFontFilePath(bmfontPath, imageRect, imageRotated)) + { + ret->setMaxLineWidth(maxLineWidth); + ret->setString(text); + ret->autorelease(); + + return ret; + } + + delete ret; + return nullptr; +} + +Label* Label::createWithBMFont(const std::string& bmfontPath, const std::string& text, const TextHAlignment& hAlignment, int maxLineWidth, const std::string& subTextureKey) +{ + auto ret = new (std::nothrow) Label(hAlignment); + + if (ret && ret->setBMFontFilePath(bmfontPath, subTextureKey)) + { + ret->setMaxLineWidth(maxLineWidth); + ret->setString(text); + ret->autorelease(); + + return ret; + } + + delete ret; + return nullptr; +} + +Label* Label::createWithBMFont(const std::string& bmfontPath, const std::string& text, const TextHAlignment& hAlignment, int maxLineWidth, const Vec2& imageOffset) +{ + return createWithBMFont(bmfontPath, text, hAlignment, maxLineWidth, Rect(imageOffset.x, imageOffset.y, 0, 0), false); +} + Label* Label::createWithCharMap(const std::string& plistFile) { auto ret = new (std::nothrow) Label(); @@ -521,7 +560,12 @@ void Label::reset() TTFConfig temp; _fontConfig = temp; _outlineSize = 0.f; + _bmFontPath = ""; + _bmSubTextureKey = ""; + _bmRect = Rect::ZERO; + _bmRotated = false; + _systemFontDirty = false; _systemFont = "Helvetica"; _systemFontSize = CC_DEFAULT_FONT_LABEL_SIZE; @@ -780,9 +824,40 @@ bool Label::setTTFConfig(const TTFConfig& ttfConfig) return setTTFConfigInternal(ttfConfig); } -bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& imageOffset, float fontSize) +bool Label::setBMFontFilePath(const std::string& bmfontFilePath, float fontSize) { - FontAtlas *newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath,imageOffset); + FontAtlas* newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath); + + if (!newAtlas) + { + reset(); + return false; + } + + //assign the default fontSize + if (std::abs(fontSize) < FLT_EPSILON) { + FontFNT* bmFont = (FontFNT*)newAtlas->getFont(); + if (bmFont) { + float originalFontSize = bmFont->getOriginalFontSize(); + _bmFontSize = originalFontSize / CC_CONTENT_SCALE_FACTOR(); + } + } + + if (fontSize > 0.0f) { + _bmFontSize = fontSize; + } + + _bmFontPath = bmfontFilePath; + + _currentLabelType = LabelType::BMFONT; + setFontAtlas(newAtlas); + + return true; +} + +bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Rect& imageRect, bool imageRotated, float fontSize) +{ + FontAtlas *newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath, imageRect, imageRotated); if (!newAtlas) { @@ -804,6 +879,8 @@ bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& ima } _bmFontPath = bmfontFilePath; + _bmRect = imageRect; + _bmRotated = imageRotated; _currentLabelType = LabelType::BMFONT; setFontAtlas(newAtlas); @@ -811,6 +888,43 @@ bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& ima return true; } +bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const std::string& subTextureKey, float fontSize) +{ + FontAtlas* newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath, subTextureKey); + + if (!newAtlas) + { + reset(); + return false; + } + + //assign the default fontSize + if (std::abs(fontSize) < FLT_EPSILON) { + FontFNT* bmFont = (FontFNT*)newAtlas->getFont(); + if (bmFont) { + float originalFontSize = bmFont->getOriginalFontSize(); + _bmFontSize = originalFontSize / CC_CONTENT_SCALE_FACTOR(); + } + } + + if (fontSize > 0.0f) { + _bmFontSize = fontSize; + } + + _bmFontPath = bmfontFilePath; + _bmSubTextureKey = subTextureKey; + + _currentLabelType = LabelType::BMFONT; + setFontAtlas(newAtlas); + + return true; +} + +bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& imageOffset, float fontSize) +{ + return setBMFontFilePath(bmfontFilePath, Rect(imageOffset.x, imageOffset.y, 0, 0), false); +} + void Label::setString(const std::string& text) { if (text.compare(_utf8Text)) @@ -929,7 +1043,7 @@ void Label::updateLabelLetters() } else { - letterSprite->setTextureRect(uvRect, false, uvRect.size); + letterSprite->setTextureRect(uvRect, letterDef.rotated, uvRect.size); letterSprite->setTextureAtlas(_batchNodes.at(letterDef.textureID)->getTextureAtlas()); letterSprite->setAtlasIndex(_lettersInfo[letterIndex].atlasIndex); } @@ -1110,7 +1224,7 @@ bool Label::updateQuads() if (_reusedRect.size.height > 0.f && _reusedRect.size.width > 0.f) { - _reusedLetter->setTextureRect(_reusedRect, false, _reusedRect.size); + _reusedLetter->setTextureRect(_reusedRect, letterDef.rotated, _reusedRect.size); float letterPositionX = _lettersInfo[ctr].positionX + _linesOffsetX[_lettersInfo[ctr].lineIndex]; _reusedLetter->setPosition(letterPositionX, py); auto index = static_cast(_batchNodes.at(letterDef.textureID)->getTextureAtlas()->getTotalQuads()); @@ -1170,8 +1284,16 @@ bool Label::setTTFConfigInternal(const TTFConfig& ttfConfig) void Label::setBMFontSizeInternal(float fontSize) { - if(_currentLabelType == LabelType::BMFONT){ - this->setBMFontFilePath(_bmFontPath, Vec2::ZERO, fontSize); + if(_currentLabelType == LabelType::BMFONT) + { + if (!_bmSubTextureKey.empty()) + { + this->setBMFontFilePath(_bmFontPath, _bmSubTextureKey, fontSize); + } + else + { + this->setBMFontFilePath(_bmFontPath, _bmRect, _bmRotated, fontSize); + } _contentDirty = true; } } @@ -1969,7 +2091,7 @@ Sprite* Label::getLetter(int letterIndex) else { this->updateBMFontScale(); - letter = LabelLetter::createWithTexture(_fontAtlas->getTexture(textureID), uvRect); + letter = LabelLetter::createWithTexture(_fontAtlas->getTexture(textureID), uvRect, letterDef.rotated); letter->setTextureAtlas(_batchNodes.at(textureID)->getTextureAtlas()); letter->setAtlasIndex(letterInfo.atlasIndex); auto px = letterInfo.positionX + _bmfontScale * uvRect.size.width / 2 + _linesOffsetX[letterInfo.lineIndex]; diff --git a/cocos/2d/CCLabel.h b/cocos/2d/CCLabel.h index 5dab114f3e..cbb027d462 100644 --- a/cocos/2d/CCLabel.h +++ b/cocos/2d/CCLabel.h @@ -198,14 +198,58 @@ public: * @param text The initial text. * @param hAlignment Text horizontal alignment. * @param maxLineWidth The max line width. - * @param imageOffset * * @return An automatically released Label object. * @see setBMFontFilePath setMaxLineWidth */ static Label* createWithBMFont(const std::string& bmfontPath, const std::string& text, - const TextHAlignment& hAlignment = TextHAlignment::LEFT, int maxLineWidth = 0, - const Vec2& imageOffset = Vec2::ZERO); + const TextHAlignment& hAlignment = TextHAlignment::LEFT, int maxLineWidth = 0); + + /** + * Allocates and initializes a Label, with a bitmap font file. + * + * @param bmfontPath A bitmap font file, it's a FNT format. + * @param text The initial text. + * @param hAlignment Text horizontal alignment. + * @param maxLineWidth The max line width. + * @param imageRect + * @param imageRotated + * + * @return An automatically released Label object. + * @see setBMFontFilePath setMaxLineWidth + */ + static Label* createWithBMFont(const std::string& bmfontPath, const std::string& text, + const TextHAlignment& hAlignment, int maxLineWidth, const Rect& imageRect, bool imageRotated); + + /** + * Allocates and initializes a Label, with a bitmap font file. + * + * @param bmfontPath A bitmap font file, it's a FNT format. + * @param text The initial text. + * @param hAlignment Text horizontal alignment. + * @param maxLineWidth The max line width. + * @param subTextureKey Name of entry in PLIST texture atlas/sprite sheet + * + * @return An automatically released Label object. + * @see setBMFontFilePath setMaxLineWidth + */ + static Label* createWithBMFont(const std::string& bmfontPath, const std::string& text, + const TextHAlignment& hAlignment, int maxLineWidth, const std::string& subTextureKey); + + /** + * Allocates and initializes a Label, with a bitmap font file. + * + * @param bmfontPath A bitmap font file, it's a FNT format. + * @param text The initial text. + * @param hAlignment Text horizontal alignment. + * @param maxLineWidth The max line width. + * @param imageOffset Offset into larger texture + * + * @return An automatically released Label object. + * @see setBMFontFilePath setMaxLineWidth + */ + CC_DEPRECATED_ATTRIBUTE static Label* createWithBMFont(const std::string& bmfontPath, const std::string& text, + const TextHAlignment& hAlignment, int maxLineWidth, const Vec2& imageOffset); /** * Allocates and initializes a Label, with char map configuration. @@ -259,7 +303,16 @@ public: virtual const TTFConfig& getTTFConfig() const { return _fontConfig;} /** Sets a new bitmap font to Label */ - virtual bool setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& imageOffset = Vec2::ZERO, float fontSize = 0); + virtual bool setBMFontFilePath(const std::string& bmfontFilePath, float fontSize = 0); + + /** Sets a new bitmap font to Label */ + virtual bool setBMFontFilePath(const std::string& bmfontFilePath, const Rect& imageRect, bool imageRotated, float fontSize = 0); + + /** Sets a new bitmap font to Label */ + virtual bool setBMFontFilePath(const std::string& bmfontFilePath, const std::string& subTextureKey, float fontSize = 0); + + /** Sets a new bitmap font to Label */ + CC_DEPRECATED_ATTRIBUTE virtual bool setBMFontFilePath(const std::string& bmfontFilePath, const Vec2& imageOffset, float fontSize = 0); /** Returns the bitmap font used by the Label.*/ const std::string& getBMFontFilePath() const { return _bmFontPath;} @@ -718,6 +771,10 @@ protected: int _numberOfLines; std::string _bmFontPath; + std::string _bmSubTextureKey; + Rect _bmRect; + bool _bmRotated; + TTFConfig _fontConfig; float _outlineSize; diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp index 9219f95f6f..224bd5e18d 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp @@ -49458,7 +49458,7 @@ int lua_register_cocos2dx_ActionTween(lua_State* tolua_S) return 1; } -int lua_cocos2dx_AtlasNode_updateAtlasValues(lua_State* tolua_S) +int lua_cocos2dx_AtlasNode_getBlendFunc(lua_State* tolua_S) { int argc = 0; cocos2d::AtlasNode* cobj = nullptr; @@ -49478,7 +49478,7 @@ int lua_cocos2dx_AtlasNode_updateAtlasValues(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_AtlasNode_getBlendFunc'", nullptr); return 0; } #endif @@ -49488,19 +49488,19 @@ int lua_cocos2dx_AtlasNode_updateAtlasValues(lua_State* tolua_S) { if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_AtlasNode_getBlendFunc'", nullptr); return 0; } - cobj->updateAtlasValues(); - lua_settop(tolua_S, 1); + const cocos2d::BlendFunc& ret = cobj->getBlendFunc(); + blendfunc_to_luaval(tolua_S, ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AtlasNode:updateAtlasValues",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AtlasNode:getBlendFunc",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_AtlasNode_getBlendFunc'.",&tolua_err); #endif return 0; @@ -49758,7 +49758,7 @@ int lua_cocos2dx_AtlasNode_getTextureAtlas(lua_State* tolua_S) return 0; } -int lua_cocos2dx_AtlasNode_getBlendFunc(lua_State* tolua_S) +int lua_cocos2dx_AtlasNode_updateAtlasValues(lua_State* tolua_S) { int argc = 0; cocos2d::AtlasNode* cobj = nullptr; @@ -49778,7 +49778,7 @@ int lua_cocos2dx_AtlasNode_getBlendFunc(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_AtlasNode_getBlendFunc'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'", nullptr); return 0; } #endif @@ -49788,19 +49788,19 @@ int lua_cocos2dx_AtlasNode_getBlendFunc(lua_State* tolua_S) { if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_AtlasNode_getBlendFunc'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'", nullptr); return 0; } - const cocos2d::BlendFunc& ret = cobj->getBlendFunc(); - blendfunc_to_luaval(tolua_S, ret); + cobj->updateAtlasValues(); + lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AtlasNode:getBlendFunc",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.AtlasNode:updateAtlasValues",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_AtlasNode_getBlendFunc'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_AtlasNode_updateAtlasValues'.",&tolua_err); #endif return 0; @@ -50103,13 +50103,13 @@ int lua_register_cocos2dx_AtlasNode(lua_State* tolua_S) tolua_beginmodule(tolua_S,"AtlasNode"); tolua_function(tolua_S,"new",lua_cocos2dx_AtlasNode_constructor); - tolua_function(tolua_S,"updateAtlasValues",lua_cocos2dx_AtlasNode_updateAtlasValues); + tolua_function(tolua_S,"getBlendFunc",lua_cocos2dx_AtlasNode_getBlendFunc); tolua_function(tolua_S,"initWithTileFile",lua_cocos2dx_AtlasNode_initWithTileFile); tolua_function(tolua_S,"setBlendFunc",lua_cocos2dx_AtlasNode_setBlendFunc); tolua_function(tolua_S,"setTextureAtlas",lua_cocos2dx_AtlasNode_setTextureAtlas); tolua_function(tolua_S,"getTexture",lua_cocos2dx_AtlasNode_getTexture); tolua_function(tolua_S,"getTextureAtlas",lua_cocos2dx_AtlasNode_getTextureAtlas); - tolua_function(tolua_S,"getBlendFunc",lua_cocos2dx_AtlasNode_getBlendFunc); + tolua_function(tolua_S,"updateAtlasValues",lua_cocos2dx_AtlasNode_updateAtlasValues); tolua_function(tolua_S,"setTexture",lua_cocos2dx_AtlasNode_setTexture); tolua_function(tolua_S,"initWithTexture",lua_cocos2dx_AtlasNode_initWithTexture); tolua_function(tolua_S,"getQuadsToDraw",lua_cocos2dx_AtlasNode_getQuadsToDraw); @@ -53282,79 +53282,131 @@ int lua_cocos2dx_Label_setBMFontFilePath(lua_State* tolua_S) int argc = 0; cocos2d::Label* cobj = nullptr; bool ok = true; - #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif - #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; #endif - cobj = (cocos2d::Label*)tolua_tousertype(tolua_S,1,0); - #if COCOS2D_DEBUG >= 1 - if (!cobj) + if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Label_setBMFontFilePath'", nullptr); return 0; } #endif - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; + do{ + if (argc == 3) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_setBMFontFilePath'", nullptr); - return 0; + if (!ok) { break; } + cocos2d::Rect arg1; + ok &= luaval_to_rect(tolua_S, 3, &arg1, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool arg2; + ok &= luaval_to_boolean(tolua_S, 4,&arg2, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0, arg1, arg2); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; } - bool ret = cobj->setBMFontFilePath(arg0); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - if (argc == 2) - { - std::string arg0; - cocos2d::Vec2 arg1; + }while(0); + ok = true; + do{ + if (argc == 4) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); + if (!ok) { break; } + cocos2d::Rect arg1; + ok &= luaval_to_rect(tolua_S, 3, &arg1, "cc.Label:setBMFontFilePath"); - ok &= luaval_to_vec2(tolua_S, 3, &arg1, "cc.Label:setBMFontFilePath"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_setBMFontFilePath'", nullptr); - return 0; + if (!ok) { break; } + bool arg2; + ok &= luaval_to_boolean(tolua_S, 4,&arg2, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + double arg3; + ok &= luaval_to_number(tolua_S, 5,&arg3, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0, arg1, arg2, arg3); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; } - bool ret = cobj->setBMFontFilePath(arg0, arg1); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - if (argc == 3) - { - std::string arg0; - cocos2d::Vec2 arg1; - double arg2; + }while(0); + ok = true; + do{ + if (argc == 1) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); - - ok &= luaval_to_vec2(tolua_S, 3, &arg1, "cc.Label:setBMFontFilePath"); - - ok &= luaval_to_number(tolua_S, 4,&arg2, "cc.Label:setBMFontFilePath"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_setBMFontFilePath'", nullptr); - return 0; + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; } - bool ret = cobj->setBMFontFilePath(arg0, arg1, arg2); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Label:setBMFontFilePath",argc, 1); + }while(0); + ok = true; + do{ + if (argc == 2) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + double arg1; + ok &= luaval_to_number(tolua_S, 3,&arg1, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 2) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0, arg1); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 3) { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + double arg2; + ok &= luaval_to_number(tolua_S, 4,&arg2, "cc.Label:setBMFontFilePath"); + + if (!ok) { break; } + bool ret = cobj->setBMFontFilePath(arg0, arg1, arg2); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.Label:setBMFontFilePath",argc, 2); return 0; #if COCOS2D_DEBUG >= 1 @@ -55708,7 +55760,6 @@ int lua_cocos2dx_Label_createWithBMFont(lua_State* tolua_S) { int argc = 0; bool ok = true; - #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif @@ -55717,81 +55768,119 @@ int lua_cocos2dx_Label_createWithBMFont(lua_State* tolua_S) if (!tolua_isusertable(tolua_S,1,"cc.Label",0,&tolua_err)) goto tolua_lerror; #endif - argc = lua_gettop(tolua_S) - 1; + argc = lua_gettop(tolua_S)-1; - if (argc == 2) + do { - std::string arg0; - std::string arg1; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); - if(!ok) + if (argc == 6) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_createWithBMFont'", nullptr); - return 0; + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::TextHAlignment arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); + if (!ok) { break; } + int arg3; + ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Rect arg4; + ok &= luaval_to_rect(tolua_S, 6, &arg4, "cc.Label:createWithBMFont"); + if (!ok) { break; } + bool arg5; + ok &= luaval_to_boolean(tolua_S, 7,&arg5, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2, arg3, arg4, arg5); + object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); + return 1; } - cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1); - object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); - return 1; - } - if (argc == 3) + } while (0); + ok = true; + do { - std::string arg0; - std::string arg1; - cocos2d::TextHAlignment arg2; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); - if(!ok) + if (argc == 2) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_createWithBMFont'", nullptr); - return 0; + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1); + object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); + return 1; } - cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2); - object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); - return 1; - } - if (argc == 4) + } while (0); + ok = true; + do { - std::string arg0; - std::string arg1; - cocos2d::TextHAlignment arg2; - int arg3; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); - ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "cc.Label:createWithBMFont"); - if(!ok) + if (argc == 3) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_createWithBMFont'", nullptr); - return 0; + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::TextHAlignment arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2); + object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); + return 1; } - cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2, arg3); - object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); - return 1; - } - if (argc == 5) + } while (0); + ok = true; + do { - std::string arg0; - std::string arg1; - cocos2d::TextHAlignment arg2; - int arg3; - cocos2d::Vec2 arg4; - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); - ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); - ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); - ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "cc.Label:createWithBMFont"); - ok &= luaval_to_vec2(tolua_S, 6, &arg4, "cc.Label:createWithBMFont"); - if(!ok) + if (argc == 4) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Label_createWithBMFont'", nullptr); - return 0; + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::TextHAlignment arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); + if (!ok) { break; } + int arg3; + ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2, arg3); + object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); + return 1; } - cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2, arg3, arg4); - object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "cc.Label:createWithBMFont",argc, 2); + } while (0); + ok = true; + do + { + if (argc == 5) + { + std::string arg0; + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg1; + ok &= luaval_to_std_string(tolua_S, 3,&arg1, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::TextHAlignment arg2; + ok &= luaval_to_int32(tolua_S, 4,(int *)&arg2, "cc.Label:createWithBMFont"); + if (!ok) { break; } + int arg3; + ok &= luaval_to_int32(tolua_S, 5,(int *)&arg3, "cc.Label:createWithBMFont"); + if (!ok) { break; } + std::string arg4; + ok &= luaval_to_std_string(tolua_S, 6,&arg4, "cc.Label:createWithBMFont"); + if (!ok) { break; } + cocos2d::Label* ret = cocos2d::Label::createWithBMFont(arg0, arg1, arg2, arg3, arg4); + object_to_luaval(tolua_S, "cc.Label",(cocos2d::Label*)ret); + return 1; + } + } while (0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d", "cc.Label:createWithBMFont",argc, 5); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: @@ -62195,7 +62284,7 @@ int lua_cocos2dx_MotionStreak_reset(lua_State* tolua_S) return 0; } -int lua_cocos2dx_MotionStreak_setTexture(lua_State* tolua_S) +int lua_cocos2dx_MotionStreak_getBlendFunc(lua_State* tolua_S) { int argc = 0; cocos2d::MotionStreak* cobj = nullptr; @@ -62215,32 +62304,29 @@ int lua_cocos2dx_MotionStreak_setTexture(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_MotionStreak_setTexture'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_MotionStreak_getBlendFunc'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 1) + if (argc == 0) { - cocos2d::Texture2D* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.Texture2D",&arg0, "cc.MotionStreak:setTexture"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_MotionStreak_setTexture'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_MotionStreak_getBlendFunc'", nullptr); return 0; } - cobj->setTexture(arg0); - lua_settop(tolua_S, 1); + const cocos2d::BlendFunc& ret = cobj->getBlendFunc(); + blendfunc_to_luaval(tolua_S, ret); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.MotionStreak:setTexture",argc, 1); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.MotionStreak:getBlendFunc",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_MotionStreak_setTexture'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_MotionStreak_getBlendFunc'.",&tolua_err); #endif return 0; @@ -62442,7 +62528,7 @@ int lua_cocos2dx_MotionStreak_setStartingPositionInitialized(lua_State* tolua_S) return 0; } -int lua_cocos2dx_MotionStreak_getBlendFunc(lua_State* tolua_S) +int lua_cocos2dx_MotionStreak_setTexture(lua_State* tolua_S) { int argc = 0; cocos2d::MotionStreak* cobj = nullptr; @@ -62462,29 +62548,32 @@ int lua_cocos2dx_MotionStreak_getBlendFunc(lua_State* tolua_S) #if COCOS2D_DEBUG >= 1 if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_MotionStreak_getBlendFunc'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_MotionStreak_setTexture'", nullptr); return 0; } #endif argc = lua_gettop(tolua_S)-1; - if (argc == 0) + if (argc == 1) { + cocos2d::Texture2D* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.Texture2D",&arg0, "cc.MotionStreak:setTexture"); if(!ok) { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_MotionStreak_getBlendFunc'", nullptr); + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_MotionStreak_setTexture'", nullptr); return 0; } - const cocos2d::BlendFunc& ret = cobj->getBlendFunc(); - blendfunc_to_luaval(tolua_S, ret); + cobj->setTexture(arg0); + lua_settop(tolua_S, 1); return 1; } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.MotionStreak:getBlendFunc",argc, 0); + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.MotionStreak:setTexture",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_MotionStreak_getBlendFunc'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_MotionStreak_setTexture'.",&tolua_err); #endif return 0; @@ -62940,12 +63029,12 @@ int lua_register_cocos2dx_MotionStreak(lua_State* tolua_S) tolua_beginmodule(tolua_S,"MotionStreak"); tolua_function(tolua_S,"new",lua_cocos2dx_MotionStreak_constructor); tolua_function(tolua_S,"reset",lua_cocos2dx_MotionStreak_reset); - tolua_function(tolua_S,"setTexture",lua_cocos2dx_MotionStreak_setTexture); + tolua_function(tolua_S,"getBlendFunc",lua_cocos2dx_MotionStreak_getBlendFunc); tolua_function(tolua_S,"setBlendFunc",lua_cocos2dx_MotionStreak_setBlendFunc); tolua_function(tolua_S,"tintWithColor",lua_cocos2dx_MotionStreak_tintWithColor); tolua_function(tolua_S,"getTexture",lua_cocos2dx_MotionStreak_getTexture); tolua_function(tolua_S,"setStartingPositionInitialized",lua_cocos2dx_MotionStreak_setStartingPositionInitialized); - tolua_function(tolua_S,"getBlendFunc",lua_cocos2dx_MotionStreak_getBlendFunc); + tolua_function(tolua_S,"setTexture",lua_cocos2dx_MotionStreak_setTexture); tolua_function(tolua_S,"isStartingPositionInitialized",lua_cocos2dx_MotionStreak_isStartingPositionInitialized); tolua_function(tolua_S,"isFastMode",lua_cocos2dx_MotionStreak_isFastMode); tolua_function(tolua_S,"getStroke",lua_cocos2dx_MotionStreak_getStroke); @@ -98643,56 +98732,6 @@ int lua_cocos2dx_TMXMapInfo_setTileSize(lua_State* tolua_S) return 0; } -int lua_cocos2dx_TMXMapInfo_initWithTMXFile(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::TMXMapInfo* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.TMXMapInfo",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::TMXMapInfo*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - std::string arg0; - - ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.TMXMapInfo:initWithTMXFile"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'", nullptr); - return 0; - } - bool ret = cobj->initWithTMXFile(arg0); - tolua_pushboolean(tolua_S,(bool)ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TMXMapInfo:initWithTMXFile",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_TMXMapInfo_getOrientation(lua_State* tolua_S) { int argc = 0; @@ -99181,49 +99220,52 @@ int lua_cocos2dx_TMXMapInfo_setHexSideLength(lua_State* tolua_S) return 0; } -int lua_cocos2dx_TMXMapInfo_getTilesets(lua_State* tolua_S) +int lua_cocos2dx_TMXMapInfo_initWithTMXFile(lua_State* tolua_S) { int argc = 0; cocos2d::TMXMapInfo* cobj = nullptr; bool ok = true; + #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif + #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"cc.TMXMapInfo",0,&tolua_err)) goto tolua_lerror; #endif + cobj = (cocos2d::TMXMapInfo*)tolua_tousertype(tolua_S,1,0); + #if COCOS2D_DEBUG >= 1 - if (!cobj) + if (!cobj) { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_TMXMapInfo_getTilesets'", nullptr); + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'", nullptr); return 0; } #endif + argc = lua_gettop(tolua_S)-1; - do{ - if (argc == 0) { - cocos2d::Vector& ret = cobj->getTilesets(); - ccvector_to_luaval(tolua_S, ret); - return 1; + if (argc == 1) + { + std::string arg0; + + ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.TMXMapInfo:initWithTMXFile"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'", nullptr); + return 0; } - }while(0); - ok = true; - do{ - if (argc == 0) { - const cocos2d::Vector& ret = cobj->getTilesets(); - ccvector_to_luaval(tolua_S, ret); - return 1; - } - }while(0); - ok = true; - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TMXMapInfo:getTilesets",argc, 0); + bool ret = cobj->initWithTMXFile(arg0); + tolua_pushboolean(tolua_S,(bool)ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TMXMapInfo:initWithTMXFile",argc, 1); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TMXMapInfo_getTilesets'.",&tolua_err); + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TMXMapInfo_initWithTMXFile'.",&tolua_err); #endif return 0; @@ -99275,6 +99317,53 @@ int lua_cocos2dx_TMXMapInfo_getParentGID(lua_State* tolua_S) return 0; } +int lua_cocos2dx_TMXMapInfo_getTilesets(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::TMXMapInfo* cobj = nullptr; + bool ok = true; +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.TMXMapInfo",0,&tolua_err)) goto tolua_lerror; +#endif + cobj = (cocos2d::TMXMapInfo*)tolua_tousertype(tolua_S,1,0); +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_TMXMapInfo_getTilesets'", nullptr); + return 0; + } +#endif + argc = lua_gettop(tolua_S)-1; + do{ + if (argc == 0) { + cocos2d::Vector& ret = cobj->getTilesets(); + ccvector_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + do{ + if (argc == 0) { + const cocos2d::Vector& ret = cobj->getTilesets(); + ccvector_to_luaval(tolua_S, ret); + return 1; + } + }while(0); + ok = true; + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TMXMapInfo:getTilesets",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TMXMapInfo_getTilesets'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_TMXMapInfo_setParentElement(lua_State* tolua_S) { int argc = 0; @@ -100522,7 +100611,6 @@ int lua_register_cocos2dx_TMXMapInfo(lua_State* tolua_S) tolua_function(tolua_S,"setCurrentString",lua_cocos2dx_TMXMapInfo_setCurrentString); tolua_function(tolua_S,"getHexSideLength",lua_cocos2dx_TMXMapInfo_getHexSideLength); tolua_function(tolua_S,"setTileSize",lua_cocos2dx_TMXMapInfo_setTileSize); - tolua_function(tolua_S,"initWithTMXFile",lua_cocos2dx_TMXMapInfo_initWithTMXFile); tolua_function(tolua_S,"getOrientation",lua_cocos2dx_TMXMapInfo_getOrientation); tolua_function(tolua_S,"setObjectGroups",lua_cocos2dx_TMXMapInfo_setObjectGroups); tolua_function(tolua_S,"setLayers",lua_cocos2dx_TMXMapInfo_setLayers); @@ -100533,8 +100621,9 @@ int lua_register_cocos2dx_TMXMapInfo(lua_State* tolua_S) tolua_function(tolua_S,"getLayers",lua_cocos2dx_TMXMapInfo_getLayers); tolua_function(tolua_S,"getStaggerAxis",lua_cocos2dx_TMXMapInfo_getStaggerAxis); tolua_function(tolua_S,"setHexSideLength",lua_cocos2dx_TMXMapInfo_setHexSideLength); - tolua_function(tolua_S,"getTilesets",lua_cocos2dx_TMXMapInfo_getTilesets); + tolua_function(tolua_S,"initWithTMXFile",lua_cocos2dx_TMXMapInfo_initWithTMXFile); tolua_function(tolua_S,"getParentGID",lua_cocos2dx_TMXMapInfo_getParentGID); + tolua_function(tolua_S,"getTilesets",lua_cocos2dx_TMXMapInfo_getTilesets); tolua_function(tolua_S,"setParentElement",lua_cocos2dx_TMXMapInfo_setParentElement); tolua_function(tolua_S,"initWithXML",lua_cocos2dx_TMXMapInfo_initWithXML); tolua_function(tolua_S,"setParentGID",lua_cocos2dx_TMXMapInfo_setParentGID); @@ -106056,8 +106145,6 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_ShakyTiles3D(tolua_S); lua_register_cocos2dx_PageTurn3D(tolua_S); lua_register_cocos2dx_PolygonInfo(tolua_S); - lua_register_cocos2dx_TransitionSlideInL(tolua_S); - lua_register_cocos2dx_TransitionSlideInT(tolua_S); lua_register_cocos2dx_Grid3D(tolua_S); lua_register_cocos2dx_EventListenerController(tolua_S); lua_register_cocos2dx_TransitionProgressInOut(tolua_S); @@ -106097,6 +106184,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_ComponentLua(tolua_S); lua_register_cocos2dx_MotionStreak3D(tolua_S); lua_register_cocos2dx_EaseOut(tolua_S); + lua_register_cocos2dx_TransitionSlideInL(tolua_S); lua_register_cocos2dx_MenuItemFont(tolua_S); lua_register_cocos2dx_TransitionFadeUp(tolua_S); lua_register_cocos2dx_LayerRadialGradient(tolua_S); @@ -106110,6 +106198,7 @@ TOLUA_API int register_all_cocos2dx(lua_State* tolua_S) lua_register_cocos2dx_RotateBy(tolua_S); lua_register_cocos2dx_FileUtils(tolua_S); lua_register_cocos2dx_Sprite(tolua_S); + lua_register_cocos2dx_TransitionSlideInT(tolua_S); lua_register_cocos2dx_ProgressTo(tolua_S); lua_register_cocos2dx_TransitionProgressOutIn(tolua_S); lua_register_cocos2dx_AnimationFrame(tolua_S); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp index ff7773308d..b973fd800e 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_extension_auto.cpp @@ -4861,53 +4861,6 @@ int lua_cocos2dx_extension_ControlPotentiometer_getValue(lua_State* tolua_S) return 0; } -int lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::extension::ControlPotentiometer* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.ControlPotentiometer",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::extension::ControlPotentiometer*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'", nullptr); - return 0; - } - cocos2d::Vec2 ret = cobj->getPreviousLocation(); - vec2_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.ControlPotentiometer:getPreviousLocation",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_extension_ControlPotentiometer_distanceBetweenPointAndPoint(lua_State* tolua_S) { int argc = 0; @@ -5011,6 +4964,53 @@ int lua_cocos2dx_extension_ControlPotentiometer_potentiometerEnded(lua_State* to return 0; } +int lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::extension::ControlPotentiometer* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.ControlPotentiometer",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::extension::ControlPotentiometer*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'", nullptr); + return 0; + } + cocos2d::Vec2 ret = cobj->getPreviousLocation(); + vec2_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.ControlPotentiometer:getPreviousLocation",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_extension_ControlPotentiometer_setProgressTimer(lua_State* tolua_S) { int argc = 0; @@ -5364,9 +5364,9 @@ int lua_register_cocos2dx_extension_ControlPotentiometer(lua_State* tolua_S) tolua_function(tolua_S,"getMinimumValue",lua_cocos2dx_extension_ControlPotentiometer_getMinimumValue); tolua_function(tolua_S,"setThumbSprite",lua_cocos2dx_extension_ControlPotentiometer_setThumbSprite); tolua_function(tolua_S,"getValue",lua_cocos2dx_extension_ControlPotentiometer_getValue); - tolua_function(tolua_S,"getPreviousLocation",lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation); tolua_function(tolua_S,"distanceBetweenPointAndPoint",lua_cocos2dx_extension_ControlPotentiometer_distanceBetweenPointAndPoint); tolua_function(tolua_S,"potentiometerEnded",lua_cocos2dx_extension_ControlPotentiometer_potentiometerEnded); + tolua_function(tolua_S,"getPreviousLocation",lua_cocos2dx_extension_ControlPotentiometer_getPreviousLocation); tolua_function(tolua_S,"setProgressTimer",lua_cocos2dx_extension_ControlPotentiometer_setProgressTimer); tolua_function(tolua_S,"setMinimumValue",lua_cocos2dx_extension_ControlPotentiometer_setMinimumValue); tolua_function(tolua_S,"getThumbSprite",lua_cocos2dx_extension_ControlPotentiometer_getThumbSprite); @@ -5380,56 +5380,6 @@ int lua_register_cocos2dx_extension_ControlPotentiometer(lua_State* tolua_S) return 1; } -int lua_cocos2dx_extension_ControlSlider_setBackgroundSprite(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::extension::ControlSlider* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.ControlSlider",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::extension::ControlSlider*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::Sprite* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.Sprite",&arg0, "cc.ControlSlider:setBackgroundSprite"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'", nullptr); - return 0; - } - cobj->setBackgroundSprite(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.ControlSlider:setBackgroundSprite",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_extension_ControlSlider_getMaximumAllowedValue(lua_State* tolua_S) { int argc = 0; @@ -6328,6 +6278,56 @@ int lua_cocos2dx_extension_ControlSlider_setSelectedThumbSprite(lua_State* tolua return 0; } +int lua_cocos2dx_extension_ControlSlider_setBackgroundSprite(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::extension::ControlSlider* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.ControlSlider",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::extension::ControlSlider*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::Sprite* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.Sprite",&arg0, "cc.ControlSlider:setBackgroundSprite"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'", nullptr); + return 0; + } + cobj->setBackgroundSprite(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.ControlSlider:setBackgroundSprite",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_ControlSlider_setBackgroundSprite'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_extension_ControlSlider_setMaximumAllowedValue(lua_State* tolua_S) { int argc = 0; @@ -6532,7 +6532,6 @@ int lua_register_cocos2dx_extension_ControlSlider(lua_State* tolua_S) tolua_beginmodule(tolua_S,"ControlSlider"); tolua_function(tolua_S,"new",lua_cocos2dx_extension_ControlSlider_constructor); - tolua_function(tolua_S,"setBackgroundSprite",lua_cocos2dx_extension_ControlSlider_setBackgroundSprite); tolua_function(tolua_S,"getMaximumAllowedValue",lua_cocos2dx_extension_ControlSlider_getMaximumAllowedValue); tolua_function(tolua_S,"initWithSprites",lua_cocos2dx_extension_ControlSlider_initWithSprites); tolua_function(tolua_S,"getMinimumAllowedValue",lua_cocos2dx_extension_ControlSlider_getMinimumAllowedValue); @@ -6551,6 +6550,7 @@ int lua_register_cocos2dx_extension_ControlSlider(lua_State* tolua_S) tolua_function(tolua_S,"setMinimumAllowedValue",lua_cocos2dx_extension_ControlSlider_setMinimumAllowedValue); tolua_function(tolua_S,"getProgressSprite",lua_cocos2dx_extension_ControlSlider_getProgressSprite); tolua_function(tolua_S,"setSelectedThumbSprite",lua_cocos2dx_extension_ControlSlider_setSelectedThumbSprite); + tolua_function(tolua_S,"setBackgroundSprite",lua_cocos2dx_extension_ControlSlider_setBackgroundSprite); tolua_function(tolua_S,"setMaximumAllowedValue",lua_cocos2dx_extension_ControlSlider_setMaximumAllowedValue); tolua_function(tolua_S,"create", lua_cocos2dx_extension_ControlSlider_create); tolua_endmodule(tolua_S); @@ -10231,56 +10231,6 @@ int lua_cocos2dx_extension_TableView_setVerticalFillOrder(lua_State* tolua_S) return 0; } -int lua_cocos2dx_extension_TableView_scrollViewDidZoom(lua_State* tolua_S) -{ - int argc = 0; - cocos2d::extension::TableView* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"cc.TableView",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocos2d::extension::TableView*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 1) - { - cocos2d::extension::ScrollView* arg0; - - ok &= luaval_to_object(tolua_S, 2, "cc.ScrollView",&arg0, "cc.TableView:scrollViewDidZoom"); - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'", nullptr); - return 0; - } - cobj->scrollViewDidZoom(arg0); - lua_settop(tolua_S, 1); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TableView:scrollViewDidZoom",argc, 1); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_extension_TableView__updateContentSize(lua_State* tolua_S) { int argc = 0; @@ -10589,6 +10539,56 @@ int lua_cocos2dx_extension_TableView_reloadData(lua_State* tolua_S) return 0; } +int lua_cocos2dx_extension_TableView_scrollViewDidZoom(lua_State* tolua_S) +{ + int argc = 0; + cocos2d::extension::TableView* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"cc.TableView",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocos2d::extension::TableView*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 1) + { + cocos2d::extension::ScrollView* arg0; + + ok &= luaval_to_object(tolua_S, 2, "cc.ScrollView",&arg0, "cc.TableView:scrollViewDidZoom"); + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'", nullptr); + return 0; + } + cobj->scrollViewDidZoom(arg0); + lua_settop(tolua_S, 1); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.TableView:scrollViewDidZoom",argc, 1); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_extension_TableView_scrollViewDidZoom'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_extension_TableView_insertCellAtIndex(lua_State* tolua_S) { int argc = 0; @@ -10788,13 +10788,13 @@ int lua_register_cocos2dx_extension_TableView(lua_State* tolua_S) tolua_function(tolua_S,"new",lua_cocos2dx_extension_TableView_constructor); tolua_function(tolua_S,"updateCellAtIndex",lua_cocos2dx_extension_TableView_updateCellAtIndex); tolua_function(tolua_S,"setVerticalFillOrder",lua_cocos2dx_extension_TableView_setVerticalFillOrder); - tolua_function(tolua_S,"scrollViewDidZoom",lua_cocos2dx_extension_TableView_scrollViewDidZoom); tolua_function(tolua_S,"_updateContentSize",lua_cocos2dx_extension_TableView__updateContentSize); tolua_function(tolua_S,"getVerticalFillOrder",lua_cocos2dx_extension_TableView_getVerticalFillOrder); tolua_function(tolua_S,"removeCellAtIndex",lua_cocos2dx_extension_TableView_removeCellAtIndex); tolua_function(tolua_S,"initWithViewSize",lua_cocos2dx_extension_TableView_initWithViewSize); tolua_function(tolua_S,"scrollViewDidScroll",lua_cocos2dx_extension_TableView_scrollViewDidScroll); tolua_function(tolua_S,"reloadData",lua_cocos2dx_extension_TableView_reloadData); + tolua_function(tolua_S,"scrollViewDidZoom",lua_cocos2dx_extension_TableView_scrollViewDidZoom); tolua_function(tolua_S,"insertCellAtIndex",lua_cocos2dx_extension_TableView_insertCellAtIndex); tolua_function(tolua_S,"cellAtIndex",lua_cocos2dx_extension_TableView_cellAtIndex); tolua_function(tolua_S,"dequeueCell",lua_cocos2dx_extension_TableView_dequeueCell); diff --git a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp index e4d7dba95e..29481a4450 100644 --- a/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp +++ b/cocos/scripting/lua-bindings/auto/lua_cocos2dx_studio_auto.cpp @@ -9530,53 +9530,6 @@ int lua_register_cocos2dx_studio_ArmatureAnimation(lua_State* tolua_S) return 1; } -int lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas(lua_State* tolua_S) -{ - int argc = 0; - cocostudio::ArmatureDataManager* cobj = nullptr; - bool ok = true; - -#if COCOS2D_DEBUG >= 1 - tolua_Error tolua_err; -#endif - - -#if COCOS2D_DEBUG >= 1 - if (!tolua_isusertype(tolua_S,1,"ccs.ArmatureDataManager",0,&tolua_err)) goto tolua_lerror; -#endif - - cobj = (cocostudio::ArmatureDataManager*)tolua_tousertype(tolua_S,1,0); - -#if COCOS2D_DEBUG >= 1 - if (!cobj) - { - tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'", nullptr); - return 0; - } -#endif - - argc = lua_gettop(tolua_S)-1; - if (argc == 0) - { - if(!ok) - { - tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'", nullptr); - return 0; - } - const cocos2d::Map& ret = cobj->getAnimationDatas(); - ccmap_string_key_to_luaval(tolua_S, ret); - return 1; - } - luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ArmatureDataManager:getAnimationDatas",argc, 0); - return 0; - -#if COCOS2D_DEBUG >= 1 - tolua_lerror: - tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'.",&tolua_err); -#endif - - return 0; -} int lua_cocos2dx_studio_ArmatureDataManager_removeAnimationData(lua_State* tolua_S) { int argc = 0; @@ -10350,6 +10303,53 @@ int lua_cocos2dx_studio_ArmatureDataManager_addTextureData(lua_State* tolua_S) return 0; } +int lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas(lua_State* tolua_S) +{ + int argc = 0; + cocostudio::ArmatureDataManager* cobj = nullptr; + bool ok = true; + +#if COCOS2D_DEBUG >= 1 + tolua_Error tolua_err; +#endif + + +#if COCOS2D_DEBUG >= 1 + if (!tolua_isusertype(tolua_S,1,"ccs.ArmatureDataManager",0,&tolua_err)) goto tolua_lerror; +#endif + + cobj = (cocostudio::ArmatureDataManager*)tolua_tousertype(tolua_S,1,0); + +#if COCOS2D_DEBUG >= 1 + if (!cobj) + { + tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'", nullptr); + return 0; + } +#endif + + argc = lua_gettop(tolua_S)-1; + if (argc == 0) + { + if(!ok) + { + tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'", nullptr); + return 0; + } + const cocos2d::Map& ret = cobj->getAnimationDatas(); + ccmap_string_key_to_luaval(tolua_S, ret); + return 1; + } + luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccs.ArmatureDataManager:getAnimationDatas",argc, 0); + return 0; + +#if COCOS2D_DEBUG >= 1 + tolua_lerror: + tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas'.",&tolua_err); +#endif + + return 0; +} int lua_cocos2dx_studio_ArmatureDataManager_isAutoLoadSpriteFile(lua_State* tolua_S) { int argc = 0; @@ -10550,7 +10550,6 @@ int lua_register_cocos2dx_studio_ArmatureDataManager(lua_State* tolua_S) tolua_cclass(tolua_S,"ArmatureDataManager","ccs.ArmatureDataManager","cc.Ref",nullptr); tolua_beginmodule(tolua_S,"ArmatureDataManager"); - tolua_function(tolua_S,"getAnimationDatas",lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas); tolua_function(tolua_S,"removeAnimationData",lua_cocos2dx_studio_ArmatureDataManager_removeAnimationData); tolua_function(tolua_S,"addArmatureData",lua_cocos2dx_studio_ArmatureDataManager_addArmatureData); tolua_function(tolua_S,"addArmatureFileInfo",lua_cocos2dx_studio_ArmatureDataManager_addArmatureFileInfo); @@ -10565,6 +10564,7 @@ int lua_register_cocos2dx_studio_ArmatureDataManager(lua_State* tolua_S) tolua_function(tolua_S,"getArmatureDatas",lua_cocos2dx_studio_ArmatureDataManager_getArmatureDatas); tolua_function(tolua_S,"removeTextureData",lua_cocos2dx_studio_ArmatureDataManager_removeTextureData); tolua_function(tolua_S,"addTextureData",lua_cocos2dx_studio_ArmatureDataManager_addTextureData); + tolua_function(tolua_S,"getAnimationDatas",lua_cocos2dx_studio_ArmatureDataManager_getAnimationDatas); tolua_function(tolua_S,"isAutoLoadSpriteFile",lua_cocos2dx_studio_ArmatureDataManager_isAutoLoadSpriteFile); tolua_function(tolua_S,"addSpriteFrameFromFile",lua_cocos2dx_studio_ArmatureDataManager_addSpriteFrameFromFile); tolua_function(tolua_S,"destroyInstance", lua_cocos2dx_studio_ArmatureDataManager_destroyInstance); diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp index 0d21487228..2e8d688b7c 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.cpp @@ -74,6 +74,8 @@ NewLabelTests::NewLabelTests() ADD_TEST_CASE(LabelFNTHundredLabels); ADD_TEST_CASE(LabelFNTPadding); ADD_TEST_CASE(LabelFNTOffset); + ADD_TEST_CASE(LabelFNTMultiFontAtlasNoRotation); + ADD_TEST_CASE(LabelFNTMultiFontAtlasWithRotation); ADD_TEST_CASE(LabelTTFFontsTestNew); ADD_TEST_CASE(LabelTTFLongLineWrapping); @@ -933,6 +935,57 @@ std::string LabelFNTBounds::subtitle() const return "Testing bounding-box"; } +LabelFNTMultiFontAtlasNoRotation::LabelFNTMultiFontAtlasNoRotation() +{ + auto s = Director::getInstance()->getWinSize(); + + auto label1 = Label::createWithBMFont("fonts/helvetica-32.fnt", "This is Helvetica"); + addChild(label1); + label1->setPosition(Vec2(s.width / 2, s.height / 3 * 2)); + + auto label2 = Label::createWithBMFont("fonts/geneva-32.fnt", "And this is Geneva", TextHAlignment::LEFT, 0, Rect(0, 128, 0, 0), false); + addChild(label2); + label2->setPosition(Vec2(s.width / 2, s.height / 3 * 1)); +} + +std::string LabelFNTMultiFontAtlasNoRotation::title() const +{ + return "New Label + Multi-BM Font Atlas Test1"; +} + +std::string LabelFNTMultiFontAtlasNoRotation::subtitle() const +{ + return "Using 2 .fnt definitions that share the same texture atlas."; +} + +LabelFNTMultiFontAtlasWithRotation::LabelFNTMultiFontAtlasWithRotation() +{ + auto s = Director::getInstance()->getWinSize(); + + auto spriteCache = SpriteFrameCache::getInstance(); + spriteCache->addSpriteFramesWithFile("fonts/bmfont-rotated-test.plist"); + + // Label BMFont + auto label1 = Label::createWithBMFont("fonts/helvetica-regular-32.fnt", "Helvetica with SubTextureKey", TextHAlignment::CENTER, 0, "helvetica-regular-32.png"); + label1->setPosition(Vec2(s.width / 2, s.height / 3 * 2)); + this->addChild(label1); + + const auto frame = spriteCache->getSpriteFrameByName("geneva-regular-32.png"); + auto label2 = Label::createWithBMFont("fonts/geneva-regular-32.fnt", "Geneva with Rect and Rotated", TextHAlignment::CENTER, 0, frame->getRectInPixels(), frame->isRotated()); + label2->setPosition(Vec2(s.width / 2, s.height / 3 * 1)); + this->addChild(label2); +} + +std::string LabelFNTMultiFontAtlasWithRotation::title() const +{ + return "New Label + Multi-BM Font Atlas Test2"; +} + +std::string LabelFNTMultiFontAtlasWithRotation::subtitle() const +{ + return "Using 2 .fnt definitions that share a PLIST texture atlas (rotated)."; +} + LabelTTFLongLineWrapping::LabelTTFLongLineWrapping() { auto size = Director::getInstance()->getWinSize(); diff --git a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h index f1bd5621b2..9c416ef1f0 100644 --- a/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h +++ b/tests/cpp-tests/Classes/LabelTest/LabelTestNew.h @@ -223,6 +223,27 @@ public: virtual std::string subtitle() const override; }; +class LabelFNTMultiFontAtlasNoRotation : public AtlasDemoNew +{ +public: + CREATE_FUNC(LabelFNTMultiFontAtlasNoRotation); + + LabelFNTMultiFontAtlasNoRotation(); + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + + +class LabelFNTMultiFontAtlasWithRotation : public AtlasDemoNew +{ +public: + CREATE_FUNC(LabelFNTMultiFontAtlasWithRotation); + + LabelFNTMultiFontAtlasWithRotation(); + virtual std::string title() const override; + virtual std::string subtitle() const override; +}; + class LabelTTFLongLineWrapping : public AtlasDemoNew { public: diff --git a/tests/cpp-tests/Resources/fonts/bmfont-rotated-test.plist b/tests/cpp-tests/Resources/fonts/bmfont-rotated-test.plist new file mode 100644 index 0000000000..f38a0d3279 --- /dev/null +++ b/tests/cpp-tests/Resources/fonts/bmfont-rotated-test.plist @@ -0,0 +1,56 @@ + + + + + frames + + geneva-regular-32.png + + aliases + + spriteOffset + {-2,3} + spriteSize + {508,122} + spriteSourceSize + {512,128} + textureRect + {{2,2},{508,122}} + textureRotated + + + helvetica-regular-32.png + + aliases + + spriteOffset + {-7,4} + spriteSize + {498,120} + spriteSourceSize + {512,128} + textureRect + {{128,2},{498,120}} + textureRotated + + + + metadata + + format + 3 + pixelFormat + RGBA4444 + premultiplyAlpha + + realTextureFileName + bmfont-rotated-test.png + size + {250,512} + smartupdate + $TexturePacker:SmartUpdate:404120629fe631b449a08b9b19e69a2c:65dfae55236043f04822a4b3d14d288d:b41d4ffccc5285d084f64abded57400d$ + textureFileName + bmfont-rotated-test.png + + + diff --git a/tests/cpp-tests/Resources/fonts/bmfont-rotated-test.png b/tests/cpp-tests/Resources/fonts/bmfont-rotated-test.png new file mode 100644 index 0000000000000000000000000000000000000000..874f1d6cd25d8fab51ffa7cbd3a7faee270fc036 GIT binary patch literal 111610 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