cocos2d-x 背景画像表示

cocos2d-xは左下がX0 Y0座標で右上に行くほど数字が増える為

背景画像表示は画像の基準位置を左下に設定することで簡単に表示できる

Sprite* bgsprite = Sprite::create("background.png");
bgsprite->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
this->addChild(bgsprite);

 

cocos2d-x Tagが一致している物をオブジェクトを一括で削除

Tagが一致している物をオブジェクトを一括で削除する

for (int i=0; i < 10; i++) {

Label* label = Label::createWithBMFont("フォント名", "文字");
label->setScale(10);
label->setTag(1000);

this->addChild(label);

}

 動的に沢山作成したオブジェクトを一気に消す。

Vector<Node*> childrens = getChildren();
if (childrens.size() > 0) {
    reverse(childrens.begin(), childrens.end());
    for (Node* children : childrens) {
        if (children->getTag() == 1000) {
            children->removeFromParentAndCleanup(true);
        }
    }
}

 

cocos2d-x std::stringにUTF8の文字を入れて 1文字ずつ処理

std::stringにUTF8の文字を入れて 1文字ずつ処理する

WindowsAndroid共通で動作する物

#define UTF8_CHAR_LEN( byte ) ( ( 0xE5000000 >> ( ( byte >> 3 ) & 0x1e ) ) & 3 ) + 1

 int GetUnicodeLength(const char* utf8)
{
    int ByteCount = 0;
    while (*utf8){
        int charlen = UTF8_CHAR_LEN(*utf8);
        ByteCount++;
        utf8 += charlen;
    }
    return ByteCount;
}
void GetUnicodeChar(const char* utf8, int charnum, int& index, int& len)
{
    int ByteIndex = 0;
    int ByteLength = 0;
    for (int i = 0; i <= charnum; i++){
        if (i == 0) {
            ByteLength = UTF8_CHAR_LEN(*utf8);
        }
        else {
            int charlen = UTF8_CHAR_LEN(*utf8);
            ByteIndex += charlen;
            utf8 += charlen;
            ByteLength = UTF8_CHAR_LEN(*utf8);
        }
    }
    index = ByteIndex;
    len = ByteLength;
}

 

std::string moji_text = UTF8Bom無で保存した外部ファイルから読込

//文字数を取得する

int len = GetUnicodeLength(moji_text.c_str() );

int i = 0, charindex = 0, charlength = 0;

for (; i < len; i++) {

//文字のインデックスと長さを取得

        GetUnicodeChar(moji_text.c_str(),i, charindex, charlength);

//moji に1文字読込
        std::string moji = moji_text.substr(charindex, charlength);

//処理を記載

}

cocos2d-x 3.12 Android FullScreen bug

 v3.12 Androidにて勝手にフルスクリーンがデフォルト設定になりました

 

AndroidManifest.xmlにて

@android:style/Theme.NoTitleBar.Fullscreen

@android:style/Theme.Light.NoTitleBar

 でフルスクリーンを切ってるのに勝手になる不具合

修正方法は、

プロジェクト\cocos2d\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxActivity.java 419行目

protected void hideVirtualButton() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

 を

protected void hideVirtualButton() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
/*
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
*/
    }
}

に変更

cocos2d-x Win32 [修正]アプリの二重起動をさせないようにする

Classes\AppDelegate.cpp

glview = GLViewImpl::createの第1引数で使われているアプリ名をまず調べます。

glview = GLViewImpl::create("アプリ名");

 

proj.win32\main.cpp

_tWinMainの最初にチェック処理を追加する

クラス名がGLFWから始まり、タイトルがゲーム名の物があるかチェック

BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)
{
    wchar_t buff[256] = L"";
    GetClassName(hWnd, buff, sizeof(buff));
    if (wcsstr(buff, L"GLFW") != NULL) {
        GetWindowText(hWnd, buff, sizeof(buff));
        if (wcsstr(buff, (wchar_t*)lParam) != NULL) {
            return false;
        }
    }
    return true;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    if (!EnumWindows(EnumWndProc, (LPARAM)L"アプリ名")) {
        return FALSE;
    }
    // create the application instance
    AppDelegate app;
    return Application::getInstance()->run();
}

 

 

cocos2d-x Win32 userSuppliedValueがnullのエラー

f:id:FALStar:20160708121622j:plain

Visual Studio2015

cocos2d-x 3.10のWin32プロジェクトにて

プロジェクトのプロパティを変更しようとすると、userSuppliedValueがNullエラーがでて、プロジェクトのプロパティが変更できない。

 

対処方法

proj.win32\ゲーム名.vcxproj をメモ帳などで開き

<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v120_xp</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
<PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v140_xp</PlatformToolset>

 こういうPlatformToolsetが4行設定してある場所が2つあるので、

<PlatformToolset>v140</PlatformToolset>

両方ともこれに変更した

cocos2d-x sharedUserDefaultが古い形式

UserDefault::sharedUserDefault();で端末内に保存した情報を読み込もうとするとこういうワーニングが出る

warning C4996: 'cocos2d::UserDefault::sharedUserDefault': が古い形式として宣言されました。
note: 'cocos2d::UserDefault::sharedUserDefault' の宣言を確認してください

 

UserDefault* user = UserDefault::sharedUserDefault();

UserDefault* user = UserDefault::getInstance();

 と変更して修正した