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

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

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

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

COCOS2D-X

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

Q&A

解決済

3回答

3365閲覧

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

Yanai

総合スコア27

Cocos2d

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

COCOS2D-X

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

0グッド

0クリップ

投稿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が見えるわけねーだろ
という問題はどこかで解決したとして
こういうことは出来るのでしょうか?
出来るのであればぜひ教えていただけたらと思います

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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というマクロは知りませんでした ありがとうございます
guest

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

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yanai

2015/06/16 21:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問