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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

Q&A

解決済

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

Yanai
Yanai

総合スコア27

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

3回答

0グッド

0クリップ

2946閲覧

投稿2015/01/09 22:21

現在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ページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

回答3

0

自己解決

回答者様参照

投稿2015/08/22 06:44

Yanai

総合スコア27

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

privateの変数を取得/変更するにはゲッタ/セッタを用います。

lang

1/*Player.h*/ 2private: 3 int playerWidth; 4public: 5 int getPlayerWidth(); 6 void setPlayerWidth(int w);

lang

1/*Player.cpp*/ 2int Player::getPlayerWidth(){ 3 return this->playerWidth; 4} 5 6void Player::setPlayerWidth(int w){ 7 this->playerWidth = w; 8}

これでprivateの変数playerWidthをゲット/セットすることができます。
また、cocos2dxには便利なマクロがありますので

lang

1/*Player.h*/ 2 CC_SYNTHESIZE(int,playerWidth,PlayerWidth);

これで変数定義とゲッタ、セッタの定義が同時に行えます。
使い方は
CC_SYNTHESIZE([変数型],[変数名],[ゲッタ/セッタメソッド名]);
です。メソッド名は自動的に頭にget/setがついてget____,set____の形で定義されます。

投稿2015/06/16 10:34

negiiro

総合スコア50

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

Yanai

2015/06/16 21:18

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

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/03/05 05:12

k_yosi

総合スコア12

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

Yanai

2015/06/16 21:16

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

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

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。