facebook twitter hatena line email

「Cocos2dx/property」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
(同じ利用者による、間の9版が非表示)
行1: 行1:
 
==サンプルコード==
 
==サンプルコード==
cpp側にのみ記述、h側には記述不要。
+
SampleModule.h
 +
#ifndef Helloworld_SampleModule_h
 +
#define Helloworld_SampleModule_h
 +
#include "cocos2d.h"
 +
class SampleModule
 +
{
 +
public:
 +
    int level;
 +
    static SampleModule* create();
 +
};
 +
#endif
 +
 
 +
SampleModule.cpp
 +
#include "SampleModule.h"
 +
USING_NS_CC;
 +
SampleModule* SampleModule::create()
 +
{
 +
    return new SampleModule();
 +
}
 +
 
 +
HelloWorldScene.cpp
 
  #include "HelloWorldScene.h"
 
  #include "HelloWorldScene.h"
 
  USING_NS_CC;
 
  USING_NS_CC;
const char* mName = "hoge_property"; // 通常property
 
static const char* mNameStatic = "hoge_property_static"; // static_property
 
 
  Scene* HelloWorld::createScene()
 
  Scene* HelloWorld::createScene()
 
  {
 
  {
行14: 行32:
 
  bool HelloWorld::init()
 
  bool HelloWorld::init()
 
  {
 
  {
    mName = "hoge_property2";
+
      SampleModule* sample = SampleModule::create();
    log("%s", mName);
+
      // SampleModule* sample = new SampleModule();でもできる
    mNameStatic = "hoge_property_static2";
+
      sample->level = 101;
    log("%s", mNameStatic);
+
      log("level=%d", sample->level);
    // 略
+
      CC_SAFE_DELETE(sample);
 
  }
 
  }
  
==セッターゲッターでpropertyにアクセス==
+
参考:https://teratail.com/questions/71179
propertyはpublicにできないと思われるので・・。
+
  
-SampleModule.h
+
==サンプルコード(ゲッターセッターでpropertyにアクセスする場合)==
 +
SampleModule.h
 
  #ifndef Helloworld_SampleModule_h
 
  #ifndef Helloworld_SampleModule_h
 
  #define Helloworld_SampleModule_h
 
  #define Helloworld_SampleModule_h
 +
#include "cocos2d.h"
 
  class SampleModule
 
  class SampleModule
 +
{
 +
public:
 +
    int level;
 +
    static SampleModule* create();
 +
    void setName(const char*);
 +
    const char* getName();
 +
private:
 +
    const char* mName = "hoge_property"; // 通常property
 +
};
 +
#endif
 +
 +
SampleModule.cpp
 +
#include "SampleModule.h"
 +
USING_NS_CC;
 +
SampleModule* SampleModule::create()
 +
{
 +
    return new SampleModule();
 +
}
 +
void SampleModule::setName(const char* name)
 +
{
 +
    mName = name;
 +
    // this->mName = name; // こちらでもよい
 +
}
 +
const char* SampleModule::getName()
 +
{
 +
    return mName;
 +
    // return mName; // こちらでもよい
 +
}
 +
 +
HelloWorldScene.cpp
 +
#include "HelloWorldScene.h"
 +
USING_NS_CC;
 +
Scene* HelloWorld::createScene()
 +
{
 +
    auto scene = Scene::create();
 +
    auto layer = HelloWorld::create();
 +
    scene->addChild(layer);
 +
    return scene;
 +
}
 +
bool HelloWorld::init()
 +
{
 +
    SampleModule* sample = SampleModule::create();
 +
    sample->setName("hoge_setget");
 +
    log("%s", sample->getName());
 +
    CC_SAFE_DELETE(sample);
 +
}
 +
 +
 +
==サンプルコード(staticのセッターゲッターでstatic propertyにアクセス)==
 +
static変数の宣言はcpp側でないとエラーになった。
 +
 +
-SampleModuleStatic.h
 +
#ifndef Helloworld_SampleModuleStatic_h
 +
#define Helloworld_SampleModuleStatic_h
 +
#include "cocos2d.h"
 +
class SampleModuleStatic
 
  {
 
  {
 
  public:
 
  public:
行35: 行110:
 
  #endif
 
  #endif
  
-SampleModule.cpp
+
-SampleModuleStatic.cpp
  #include "SampleModule.h"
+
  #include "SampleModuleStatic.h"
 
  USING_NS_CC;
 
  USING_NS_CC;
 
  static const char* mNameStatic = "hoge_property_static";
 
  static const char* mNameStatic = "hoge_property_static";
  void SampleModule::setName(const char* name)
+
  void SampleModuleStatic::setName(const char* name)
 
  {
 
  {
 
     mNameStatic = name;
 
     mNameStatic = name;
 
  }
 
  }
  const char* SampleModule::getName()
+
  const char* SampleModuleStatic::getName()
 
  {
 
  {
 
     return mNameStatic;
 
     return mNameStatic;
行51: 行126:
 
  bool HelloWorld::init()
 
  bool HelloWorld::init()
 
  {
 
  {
     SampleModule::setName("hoge_setget");
+
     SampleModuleStatic::setName("hoge_setget_static");
     log("%s", SampleModule::getName()); // hoge_setget
+
     log("%s", SampleModuleStatic::getName()); // hoge_setget
 
     // 略
 
     // 略
 
  }
 
  }
行59: 行134:
 
  A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 17727 (Thread-6094)
 
  A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 17727 (Thread-6094)
 
  E/SurfaceComposerClient: update : Can't get IGlobalScreenshot
 
  E/SurfaceComposerClient: update : Can't get IGlobalScreenshot
 +
 +
==error: undefined reference to collect2: error: ld returned 1 exit statusなエラーが出る場合==
 +
androidのコンパイルしようとしてる場合であれば、app/jni/Android.mkにcppファイルを追加してるか確認

2017年4月17日 (月) 18:41時点における最新版

サンプルコード

SampleModule.h

#ifndef Helloworld_SampleModule_h
#define Helloworld_SampleModule_h
#include "cocos2d.h"
class SampleModule
{
public:
   int level;
   static SampleModule* create();
};
#endif

SampleModule.cpp

#include "SampleModule.h"
USING_NS_CC;
SampleModule* SampleModule::create()
{
   return new SampleModule();
}

HelloWorldScene.cpp

#include "HelloWorldScene.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
     SampleModule* sample = SampleModule::create();
     // SampleModule* sample = new SampleModule();でもできる
     sample->level = 101;
     log("level=%d", sample->level);
     CC_SAFE_DELETE(sample);
}

参考:https://teratail.com/questions/71179

サンプルコード(ゲッターセッターでpropertyにアクセスする場合)

SampleModule.h

#ifndef Helloworld_SampleModule_h
#define Helloworld_SampleModule_h
#include "cocos2d.h"
class SampleModule
{
public:
   int level;
   static SampleModule* create();
   void setName(const char*);
   const char* getName();
private:
    const char* mName = "hoge_property"; // 通常property
};
#endif

SampleModule.cpp

#include "SampleModule.h"
USING_NS_CC;
SampleModule* SampleModule::create()
{
   return new SampleModule();
}
void SampleModule::setName(const char* name)
{
    mName = name;
    // this->mName = name; // こちらでもよい
}
const char* SampleModule::getName()
{
    return mName;
    // return mName; // こちらでもよい
}

HelloWorldScene.cpp

#include "HelloWorldScene.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    SampleModule* sample = SampleModule::create();
    sample->setName("hoge_setget");
    log("%s", sample->getName());
    CC_SAFE_DELETE(sample);
}


サンプルコード(staticのセッターゲッターでstatic propertyにアクセス)

static変数の宣言はcpp側でないとエラーになった。

-SampleModuleStatic.h

#ifndef Helloworld_SampleModuleStatic_h
#define Helloworld_SampleModuleStatic_h
#include "cocos2d.h"
class SampleModuleStatic
{
public:
    static void setName(const char*);
    static const char* getName();
};
#endif

-SampleModuleStatic.cpp

#include "SampleModuleStatic.h"
USING_NS_CC;
static const char* mNameStatic = "hoge_property_static";
void SampleModuleStatic::setName(const char* name)
{
    mNameStatic = name;
}
const char* SampleModuleStatic::getName()
{
    return mNameStatic;
}

-HelloWorldScene.cpp

bool HelloWorld::init()
{
    SampleModuleStatic::setName("hoge_setget_static");
    log("%s", SampleModuleStatic::getName()); // hoge_setget
    // 略
}

存在しないプロパティを使った場合のエラーログ

A/libc: Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 17727 (Thread-6094)
E/SurfaceComposerClient: update : Can't get IGlobalScreenshot

error: undefined reference to collect2: error: ld returned 1 exit statusなエラーが出る場合

androidのコンパイルしようとしてる場合であれば、app/jni/Android.mkにcppファイルを追加してるか確認