質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

cocos2d 新規クラスを既存のクラスで呼ぶ場合どうすればいいのか、新規クラスの変数を既存クラスで扱えるか?

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,452

score 28

現在cocos2d-xでアプリ開発をしているものです
開発環境:
OS  Windows
コードはVSで書いています
実機でためすためにEclipse使用

主のスペック:
プログラム歴10ヶ月
専門学生のひよっ子
クラスを初めて1ヶ月、継承なにそれおいしいの?

問題点1:
cocos2dで新規のクラスを追加する場合
今回はPlayerクラスを追加することとします
/*-------ヘッダー----------*/
class Player : public cocos2d::Layer{
private:

public:
  static cocos2d::Scene* createScene();
  bool init();
  CREATE_FUNC(Player);

}

↑のように書くと思います
このPlayerクラスのinit();の中で
矩形を描画させる機能をもたせたとします

/*-------ヘッダー----------*/
private:
  int x, y;
  int width, height;

/*-------.cpp----------*/
bool Player::init(){

  if ( !Layer::init() ){
    return false;
  }

  Rect rect = (0, 0, width, height);
  auto sprite = Sprite::create();
  sprite->setTextureRect(rect);
  sprite->setPosition(x, y);
  sprite->setColor(Color3B::WHITE);
  this->addChild(sprite);
}

↑これで白色の四角い矩形が描画できたとします
*x, y, width, heightの数値は他で代入したとします

コレをもとからあった
HelloWorldクラスで呼ぶ場合どういう手順を踏むとよいのでしょうか?

一応自分が確認した方法では

/*-------HelloWorld.ヘッダー----------*/
// プレイヤーヘッダーの呼び込み
#include "Player.h"

/*-------HelloWorld.cpp----------*/
Scene* HelloWorld::createScene(){
  auto scene = Scene::create();
  auto layer = HelloWorld::create();

  /* ↓ここから */
  auto layer2 = Player::create();
  scene->addChild(layer2);
  /* ↑ここまでを追加 */

  scene->addChild(layer);
  return scene;
}

↑のようにすればHelloWorldクラスでPlayerクラスを呼ぶことが出来ました
HelloWorldクラスで描画しているものと
Playerクラスで作成した矩形が同時に描画されている状態です

もし他にイイ(?)方法があれば教えていただけると嬉しいです


問題点2:
*上の内容をそのまま使います
次に問題になるのが
HelloWorldクラスでPlayerクラスで宣言しているメソッドを見たいときや
弄りたいときどうすればいいか、です

Playerクラスにx, y, width, height;がありますが
HelloWorldクラスで

/*-------HelloWorld.ヘッダー----------*/
private:
  // クラスの宣言
  Player* player;

/*-------HelloWorld.cpp----------*/
bool Player::init(){

  if ( !Layer::init() ){
    return false;
  }

  // 条件文を満たしたら矩形のサイズを変更したい!
  if (条件文){
    // player.width  = 100;
    // player.height = 100;

    // ポインターで宣言したからこうかな?
    player->width  = 100;
    player->height = 100;
  }
}

プライベートのwidth, heightが見えるわけねーだろ
という問題はどこかで解決したとして
こういうことは出来るのでしょうか?
出来るのであればぜひ教えていただけたらと思います

一応自分でもいろいろ弄ってはみたのですが理解できず
質問させていただきました

初めての投稿なので至らないところはありますがよろしくお願いします
なお、ご不明な点がございましたらその都度ご連絡を・・・って
普段つかわない敬語つかうとこうなる(・ω・`)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

回答者様参照

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

この場合、HelloWorld::createScene() では無く、そこから自動的に呼ばれるinit() の中でレイヤーをAddChildします。
Playerの座標はgetPosition()などで、サイズを指定したいなら、Playerの初期化時に引数で渡すのがいいかと。
※createメソッドを呼び出すCREATE_FUNCはマクロで定義されています。CREATE_FUNCの実装部分をコピーして、自前で引数を渡す処理を作成する必要があります。


//幅と高さを渡して初期化
bool Player::init(int w, int h){

}

-------- 
createじゃなくてinitないでレイヤー作成&追加
HelloWorld::init() {

 if ( !Layer::init() ){ 
    return false; 
  } 

  int w=100;
  int h=50;
  auto layer = Player::create(w,h); 
  this->addChild(layer); 

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/17 06:16

    返答遅くなってすみません
    投稿から今まで放置していました
    無事解決しました
    ありがとうございます

    キャンセル

0

privateの変数を取得/変更するにはゲッタ/セッタを用います。
/*Player.h*/
private:
  int playerWidth;
public:
  int getPlayerWidth();
  void setPlayerWidth(int w);
/*Player.cpp*/
int Player::getPlayerWidth(){
   return this->playerWidth;
}

void Player::setPlayerWidth(int w){
  this->playerWidth = w;
}
これでprivateの変数playerWidthをゲット/セットすることができます。
また、cocos2dxには便利なマクロがありますので
/*Player.h*/
   CC_SYNTHESIZE(int,playerWidth,PlayerWidth);
これで変数定義とゲッタ、セッタの定義が同時に行えます。
使い方は
CC_SYNTHESIZE([変数型],[変数名],[ゲッタ/セッタメソッド名]);
です。メソッド名は自動的に頭にget/setがついてget__,set__の形で定義されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/17 06:18

    返答ありがとうございます
    投稿後問題は解決しました
    CC_SYNTHESIZEというマクロは知りませんでした
    ありがとうございます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Cocos2dに関する質問
  • cocos2d 新規クラスを既存のクラスで呼ぶ場合どうすればいいのか、新規クラスの変数を既存クラスで扱えるか?