投稿

6月, 2014の投稿を表示しています

cocos2dx 3.1.1のiosにAdMobを入れた時に表示されない。(Must set the rootViewController property of GADBannerView before calling loadRequest エラー)

http://stackoverflow.com/questions/21846346/admob-with-cocos-2d-v3/21859218#21859218?newreg=3f939ceefd2e4dde88d6c3cf3c1c7f39 上記のサイトの回答のリンク先からダウンロードできるサンプルプロジェクトを見て解決しました。 AdMobをcocos2dxに追加するのは、 公式ドキュメント といつもお世話になっているLady Wendyさんの Cocos2d-x:AdMobを表示させる(iOS) を見て大体わかったのですが、 Must set the rootViewController property of GADBannerView before calling loadRequest というエラーが出て、広告が表示されませんでした。 公式ドキュメントの通りに bannerView_.rootViewController = self; [self.view addSubview:bannerView_]; とすると、selfのところでエラーが出てしまいます。 結論としては、これを bannerView_.rootViewController = self.viewController; [self.viewController.view addSubview:bannerView_]; としたら解決しました。 コードも載せておきます、関係有るところだけ。 bannerView_ = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; bannerView_.adUnitID = @"ca-app-pub-xxxxxxxxxxxx"; [viewController.view addSubview: bannerView_]; bannerView_.rootViewController = self.viewController; [self.viewController.view addSubview:bannerView_];

ScoreBoard導入時のthrown while initializing AsyncTaskエラー

マニュアル通りに実装したのですが、thrown while initializing AsyncTask、というエラーが出てしまいました。 http://stackoverflow.com/questions/13267711/android-why-i-get-these-asynctask-error 上記のサイトを見て解決しました。 そのまま実装すると、こんなかんじになります。 private static Activity mya =null; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mya = this; } public static void sendScore(double score){ String[] gameIds = {"ゲームモードID"}; String[] scores = {""+score}; GFRankingController appController = GFRankingController.getIncetance(mya); appController.sendScore(gameIds, scores); } これを、上記のサイトとeclipseの警告を頼りに、 private static Activity mya =null; //これを追加 private static Handler handler = new Handler(Looper.getMainLooper()); protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); mya = this; } public static void sendScore(final double score){//finalにする handler.post(new Runnable() { @Override public void run(

GameCenterがDoneボタンで終了できない

cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装 ここ見て、GameCenterの実装は出来たのですが、openRankingでGameCenterを開いた時に、右上のDoneボタンを押しても反応がなく、元の画面に戻れなくなってしまいました。 http://programming-ios.com/cocos2dx-gamecenter-crash/ ここを見たら解決できたのですが、「データベース接続確立エラー」と表示されてしまい見れなかったので、 Googleのキャッシュ を使って見ました。 消えてしまうかもしれないので、ほとんど同じ内容ですが、ここに書いておきます。 RootViewController.hに #import <UIKit/UIKit.h> #import <GameKit/GameKit.h>//これを追記 @interface RootViewController : UIViewController <GKLeaderboardViewControllerDelegate>{ //上記のように変更 } - (BOOL) prefersStatusBarHidden; @end また、RootViewController.mmに以下を追記します。 // GKLeaderboardViewControllerのDelegate -(void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController { [self dismissViewControllerAnimated:YES completion:nil]; } // GKAchievementViewControllerのDelegate -(void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController { [self dismissViewControllerAnimated:YES completion:nil]; } また「AppControlle

ラベルボタンを作った時にAnchorPointを設定できない::cocos2d-x v3.1.1

以下のようにラベルボタンを作った時にアンカーポイントを変更してsetPositionしたいときに、 auto label = Label::createWithSystemFont("labelButton", "Arial", 20); auto menu = MenuItemLabel::create(labelabel, CC_CALLBACK_1(HelloWorld::labelBtnCallback, this)); auto button = Menu::create(menu, NULL); button->setPosition(Vec2(float x,float y)); this->addChild(button); Menuに対して button->setAnchorPoint(Vec2(0,0)); としても効かなかった。 代わりにMenuItemLabelに対して以下のように設定したところ、 auto label = Label::createWithSystemFont("labelButton", "Arial", 20); auto menu = MenuItemLabel::create(label, CC_CALLBACK_1(HelloWorld::labelBtnCallback, this)); menu->setAnchorPoint(Vec2(1,1)); auto button = Menu::create(menu, NULL); button->setPosition(Vec2(float x,float y)); this->addChild(button); なぜかうまくいった。

マルチタッチ::cocos2d-x v3.1.1

Cocos2d-x 3.0 beta2 シングルタッチ&マルチタッチイベント取得まとめ 大体はここを見ればできるのですが、v3.1.1ではいくつか記法が異なっている部分がありました。 まずはヘッダファイルに public: void onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); void onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); void onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event); そして、cppファイルの,HelloWorld::init()に auto listener = EventListenerTouchAllAtOnce::create(); listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this); listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this); listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this); this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this); と書いて、リスナーを設定します。そして、関数を追加。 void HelloWorld::onTouchesBegan(const std::vector<cocos2d::Touch *> &touches, cocos2d::Event *event){ std::vect

androidでビルドする時につまづいた事::cocos2d-x v3.1.1

./build_native.pyでのundefined referenceエラー jni/../../Classes/HelloWorldScene.cpp:64: error: undefined reference to 'newClass::createScene()' というような感じのエラーが出ていた。 proj.android/jni/Android.mkを編集して、直接クラス情報を書いたら通った。 LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../Classes/AppDelegate.cpp \ ../../Classes/HelloWorldScene.cpp こんな感じになっっている所に、同じように追記した。 区切りのバックスラッシュ(\)を忘れないように。 Eclipseにプロジェクトを追加するとAppActivity.javaでエラーが出る cocos2d-x-3.1.1/cocos/platform/android/javaを Android project from existing codeからインポートして、srcの中のorg.cocos2dx.libを追加したプロジェクトのsrcにコピペするとエラーが消える。 これでやっと心安らかにxcodeで開発できる。

子スプライトの数(存在しているか)を調べる::cocos2d-x v3.1.1

getChildrenCount()を使います。 同時にスプライトを複数(一定数以上)出したくない時などに。 タップした所にスプライトが表示され、中心まで移動した後消えます。 ただし、前のスプライトが消えないうちは、新しいスプライトが生成されないようにしています。 bool HelloWorld::init() { if ( !Layer::init() ) { return false; } //touchListner auto listner = EventListenerTouchOneByOne::create(); listner->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this); this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listner, this); return true; }; bool HelloWorld::onTouchBegan(Touch *touch, Event *event) { //タッチ位置取得 auto location = touch->getLocation(); //画面サイズ取得 auto visibleSize = Director::getInstance()->getVisibleSize(); //中心に移動 auto centerPoint = Point(visibleSize.width/2,visibleSize.height/2); auto moveToCenter = MoveTo::create(0.5f, centerPoint); //this以下のスプライトの数を調べる auto count = this->getChildrenCount(); //0個だったら実行 if(count == 0){ auto homuhomu = Sprite::create("

ボタンを作る::cocos2d-x v3.1.1

画像を使ったボタン(MenuItemImage) プロジェクトを作成した時に最初からある終了ボタンがそれ auto imgBtn = MenuItemImage::create( "通常時のボタンの画像", "押された時のボタンの画像", CC_CALLBACK_1(HelloWorld::imgBtnCallback, this));//imgBtnCallbackが関数名 imgBtn->setPosition(Vec2(x座標, y座標)); auto btn_1 = Menu::create(imgBtn, NULL); btn_1->setPosition(Vec2::ZERO);//ゼロ点を画面右下にしているっぽい。消すと中央が(0,0)になる this->addChild(btn_1, 1); そして、コールバック作成 void HelloWorld::imgBtnCallback(Ref* pSender){ //ここにボタンが押された時の操作を書く return; } ヘッダファイルで宣言しておくのも忘れないように void imgBtnCallback(cocos2d::Ref* pSender); ラベルを使ったボタン(MenuItemLabel) //ラベルを用意 auto labelBtnLabel = LabelTTF::create("ラベルボタン", "Arial", 24); auto labelBtn = MenuItemLabel::create(labelBtnLabel, CC_CALLBACK_1(HelloWorld::menuBtnCallback, this)); labelBtn->setPosition(Vec2(x座標, y座標)); auto btn_2 = Menu::create(labelBtn, NULL); btn_2->setPosition(Vec2::ZERO); this->addChild(btn_2, 1

シーンの切り替え(画面遷移)::cocos2d-x v3.1.1

HelloWorldSceneからnewClassSceneに移動する場合。 まず、HelloWorldScene.cppに #include "newClassScene.h" 移動先のヘッダファイルをインクルードする。 そしてボタン等で呼ばれる関数に Director::getInstance()->replaceScene(newClass::createScene()); を書く。 次に、移動先のnewClassScene.hが #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass : public cocos2d::Layer{ static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(newClass); }; #endif /* defined(__HelloWorld__newClassScene__) */ このようになっているのを #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass : public cocos2d::Layer{ public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(newClass); }; #endif /* defined(__HelloWorld__newClassScene__) */ publicにする。しないと怒られました。

新しいクラスの作り方::cocos2d-x v3.1.1

NewFile>iOS>C and C++>C++ Classを選択してNext ファイル名を入力してCreate ヘッダファイル(ファイル名.h)を修正 #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include <iostream> #endif /* defined(__HelloWorld__newClassScene__) */ こうなっているのを(プロジェクト名HelloWorld,クラス名newClassの場合) #ifndef __HelloWorld__newClassScene__ #define __HelloWorld__newClassScene__ #include "cocos2d.h" class newClass: public cocos2d::Layer { static cocos2d::Scene* createScene(); virtual bool init(); //初期化 }; #endif /* defined(__HelloWorld__newClassScene__) */ というようにする。 次に、cppファイルの編集 初期状態では、 #include "mainScene.h" しか書いていないので、 #include "newClassScene.h" USING_NS_CC; Scene* newClass::createScene() { auto scene = Scene::create(); auto layer = newClass::create(); scene->addChild(layer); return scene; } bool newClass::init() { if ( !Layer::init() ) { return false; } return true; }; というようにする

図形描画::cocos2d-x v3.1.1

右下が(0,0)なので注意 直線 DrawNode *node = CCDrawNode::create(); node->drawSegment(Vec2(始点x, 始点y), Vec2(終点x, 終点y), 1, Color4F(r, g, b, a)); addChild(node); 円(ドット) DrawNode *dot = CCDrawNode::create(); dot->drawDot(Vec2(座標x, 座標y), 直径, Color4F(r, g, b, a)); addChild(dot); 重なり(ZOrder) addChild(node, zOrder); intで指定。 数字が大きいほうが手前に来る。(右手系)

iframeの利点と欠点

以前からiframeって理想的なタグなのでは無いかと思っていたが、非推奨だとかSEO的に良くないとかいう話を聞いてなんとなく使っていなかった。(HTML5では非推奨ではない) cssが大好きなので擬似フレームを使っていたというのもあるが。 そこでメリットとデメリットについて考えてみた。 まずメリットから 通信量が少なくなる。 -メニューをメイン、中身をフレームにすれば中身だけが変わるときは通信量が少なくなる。 コード量が少なくなる。 -コードを使いまわせるので書くコードが少なくなる。 デメリット 初回でのロード時間が長くなる -リクエスト数が増えるので多分ロード時間も増える。 iframeへのリンクを新しいタブで開いた時に、iframeの先しか表示されない。 リンクを張れない -frameのリンク先をurlに含むことが出来ないのでリンクを張ることが出来ない。 seo -よく知らないが良くは無いらしい。 結局、メニューからiframeの中身を変えるようなデザインだと、その特定の中身のページヘのリンクが張れないというデメリットが大きすぎるのではないかという結論に至った。 このデメリットはcssでcheckboxを使ってメニューとかを作る時にも発生する問題で、今解決方法を模索している。 また、通信速度がどんどん早くなっている今、そこまで通信量を気にする必要は無いではないかと。 コードの使い回しはフレームワークを使えばいい。

cocos2d-x v3.1.1にアップデート>>プロジェクトの作り方

まず、公式からダウンロード 解凍してeclipseがある場所に入れる(わかりやすいように。) readme.mdに書いてあるとおりだが、 cocos2d-xのディレクトリに移動して、 $ ./setup.py すると まだ設定していなかった場合、いろんな_ROOTを聞かれる Please execute command: "source [.bashのパス]" to make added system variables take effect 設定し終わったら、 と最後の方に書いてあるので、そのままコピペして設定を反映させる。 $cocos new プロジェクト名 -p com.example.プロジェクト名等 -l cpp -d プロジェクトのディレクトリ で、指定した場所に生成されるはず。