投稿

ラベル(Cocos2d-x)が付いた投稿を表示しています

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-iOS編その2

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-iOS編その1 の続き。 前回Twitterにログインしたので、今回はシングルツイートの取得とユーザタイムラインの取得をします。 シングルツイートの取得 std::string NativeLauncher::showTweet(){ NSURLRequest *request = [[[Twitter sharedInstance] APIClient] URLRequestWithMethod:@"GET" URL:@"https://api.twitter.com/1.1/statuses/show.json" parameters:@{@"id":@"xxxxxxxxxxxxxxxxxx"} error:nil]; NSURLResponse *response; NSError *err; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; std::string tweet_text = [[jsonObject valueForKey:@"text"] UTF8String]; return tweet_text; }; xxxxxxxxxxとなっている所にツイートIDを入れてください。 NSDataが帰ってくるので、NSJSONSerializationでNSDictionaryに変換します。 valueForKeyの"text"のところを変えると他の情報も取得できます。 他のパラメータや、データの構造は、 GET statuses/show/:id を見て...

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-iOS編その1

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その4 の続き。 Twitterにログインするところまで。 Fabric のXcode用プラグインをインストール fabricユーザー登録から、プラグインのインストールまで このページが丁寧に説明してあって分かりやすいと思います。 すでにユーザ登録してある人は、そこは飛ばしてください。 プロジェクトにSDKを追加する [iOS] Fabric 入門 #1 アカウント登録 & Twitter Kit を使ってログインする 今度はこのページを見ながら。ネット上の資産は有効活用しましょう。 Run Script Build Phaseについては、公式 How to Add a Run Script Build Phase で解説されています。 Run Scriptを追加した後に、以前NativeLauncher.hで宣言した関数が無いとビルドできないので、 NativeLauncher.mmに #include "NativeLauncher.h" void NativeLauncher::loginTwitter(){ }; std::string NativeLauncher::showTweet(){ std::string tweet_text; return tweet_text; }; std::vector<std::string> NativeLauncher::showUserTimeline(){ std::vector<std::string> userTimeline_text; return userTimeline_text; }; と空の関数を用意しておきます。 Twitterにログインする AppDelegate.mに記述ところはCocosだとAppDelegateがcppファイルなので、NativeLauncher.mmのloginTwitter()に書きます。 TwitterLoginButtonもNativeLauncher.mmのloginTwitter()に書きますが、viewには...

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その4

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その3 の続き ではいよいよ最終目標のユーザタイムラインの取得をします。 今回もまたAppActivityでメソッドを作ってNativeLauncherにjniを追加します。 AppActivity.java static String userTimeline_text[]; public static String[] showUserTimeline() throws InterruptedException{ final CountDownLatch cdl = new CountDownLatch(1); final int count = 5; StatusesService statusesService = Twitter.getApiClient().getStatusesService(); statusesService.userTimeline(null,null,count, null, null, true, false, true, true, new Callback<List<Tweet>>() { @Override public void success(Result<List<Tweet>> listResult) { String text[] = new String[count]; int tweetNum = 0; for (Tweet tweet : listResult.data) { text[tweetNum] = tweet.text; tweetNum++; } userTimeline_text = text; cdl.countDown(...

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その3

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その2 の続き。 前回Twitterにログイン出来たので、 Rest API が使えるようになります。 今回はシングルツイートの取得をします。 AppActivity.java AppActivityでツイートのテキストを返すメソッドを作ります。 まずはコード static String tweet_text; public static String showTweet() throws InterruptedException{ final CountDownLatch cdl = new CountDownLatch(1); tweet_text = null; StatusesService statusesService = Twitter.getApiClient().getStatusesService(); statusesService.show(xxxxxxxxxxxxxxxxxL, null, null, null, new Callback<Tweet>() { @Override public void success(Result<Tweet> result) { tweet_text = result.data.text; cdl.countDown(); } public void failure(TwitterException exception) { System.out.println("failure"); } } ); cdl.await(); return tweet_text; } xxx...

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その2

イメージ
Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その1 の続き。 今回は前回作ったloginTwitter()をjniを使ってcocos2d-xから呼び出します。 jniを使える環境を整える まずはjniを使えるようにします。 Xcodeでやったほうが楽だと思います。 ここのサイトがとてもわかり易いので見てください。 cocos2d-xでiOSとAndroidの処理を分ける ※Android.mkはproj.android>jniに有ります。 jniを使ってloginTwitter()を呼び出す cocos2d-xでjniを使ってみる を参考にしながら進めていきます。 jniを使ったことがある人は特に迷うことは無いと思います。 NativeLauncher.h #ifndef helloWorld_NativeLauncher_h #define helloWorld_NativeLauncher_h class NativeLauncher{ public: static void loginTwitter(); }; #endif NativeLauncher.cpp #include <jni.h> #include "NativeLauncher.h" #include "platform/android/jni/JniHelper.h" using namespace cocos2d; #define CLASS_NAME "org.cocos2dx.cpp.AppActivity" void NativeLauncher::loginTwitter(){ JniMethodInfo JMI; if (JniHelper::getStaticMethodInfo(JMI, CLASS_NAME, "loginTwitter", "()V")) { JMI.env->CallStaticVoidMethod(JMI.classID, JMI.methodID); JMI...

Cocos2d-xとTwitter Kitを使ってOAuth認証&ユーザタイムライン取得-Android編その1

イメージ
ツイートを使ったゲームをCocos2d-xで作りたかったので、 Twitter Kit(Fabric) を使って、ツイッターのユーザタイムラインの取得をやってみました。 事前にAndroidネイティブでTwitterにログインするところまでやっておくと分かりやすいと思います。 まずはCocos2d-xのプロジェクトを作ってEclipseにインポート。 わからない人は、こことか Cocos2d-x 3.4でandroid向けにビルドする 次に、FabricをEclipseにインストール こことかを参考にしながら、 fabricユーザー登録から、プラグインのインストールまで ここで登録をして、 https://get.fabric.io/ ここを見てください。 Fabricの導入(Twitter SDK) 出来ましたでしょうか。 こんなかんじにツールバーに追加されていて、ログインできていれば成功です。 Twitter Kitの導入とログイン 先ほどのFabricの画面で、追加したいプロジェクトを選択して、Next Checking...がUnknownになるのを待ってから、TwitterのUnknownをクリック。 一番下のLog in with Twitterをselect AndroidManifestに関しては、指示通りにコードを追加してください。 次のStartActivityはAppActivityに書きます。 onCreateメソッドが無いので、そこは丸々コピペしますが、setContentViewの行は使わないので消します。 Bundleをimportしたりして、最終的にはこんなかんじになります。 アラートが沢山出ますが、導入が終わると消えるので気にしないでください。 package org.cocos2dx.cpp; import org.cocos2dx.lib.Cocos2dxActivity; import io.fabric.sdk.android.Fabric; import android.os.Bundle; import com.twitter.sdk.android.core.TwitterAuthConfig; import com.twitter.sdk.and...

Cocos2d-x 3.4でandroid向けにビルドする

プロジェクトすでに作られている前提で。 eclipseを開く File>import Existing android code into workspaceで、 プロジェクトファイル/cocos2d/cocos/platform/android/javaを指定してimportする。 import したlibcocos2dxのsrc/org.cocos2dx.lib/Cocos2dxWebViewの中の import android.annotation.SuppressLint;でエラーが出てたら、 libcocos2dxのプロパティ>androidで、APIレベルが16以上のTarget Nameを選択してOKするとエラーが消える。 もう一度、File>import>Existing android code into workspaceで プロジェクトファイル/proj.androidを指定してimportする。 こっちもAppActivity.javaでエラーが出るなら プロパティでAPIレベルが16以上のTargetを指定する。 それでもダメなら、プロパティ>android>libralyのところが赤い×になっていないか確認 なっていたら、一旦RemoveしてからAddして、先ほどのlibcocos2dxを選択する。 RunAs>android application ver3.1の時よりも簡単になった気がする。

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で指定。 数字が大きいほうが手前に来る。(右手系)

Cocos2d-xの勉強の参考にしたサイト(随時追加していきます)

Cocos2d-x|Lady Wendy 検索に必ず引っかかってくるサイト。コンテンツが非常に豊富だが、少し内容が古くなっている。 Cocos2d-x v3|Lady Wendy 上のサイトのver3版。まだそこまでページは多くない。 Cocos2d-x 3.0でスプライトの生成、移動、削除、イベント タッチイベントの使い方がわかりやすい OpenCV 備忘録: std::stringをchar*に変換する UserDefaultを使ってデータを保存するときに、Keyを動的に生成するのに使った。 C++11の文法と機能(C++11: Syntax and Feature) C++についての解説。簡潔で非常にわかりやすい。 cocos2d-xでiOSとAndroidの処理を分ける ツイートやレビューページへの誘導に使いました。 cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装 タイトルの通りです。上のサイトと組み合わせて、簡単に出来ました。

Cocos2d-x 3.0 beta2をMacにインストール&iOS,AndroidでHelloWorldまで

Cocos2d-x v3.0beta2をインストール OSは10.9.1 http://d.hatena.ne.jp/b-koba5525/20121207/1354856144 基本的にここをみながらやる。日本語化はしなかった。 64bitか32bitかわからなかったので、ここを見た http://support.apple.com/kb/HT3696?viewlocale=ja_JP Eclipseが全画面表示できなかったので、ここを見てできるようにする。 http://d.hatena.ne.jp/ks0608/20110729/1311924247 途中でviを使うが、わからない人は、この辺を見る http://net-newbie.com/linux/commands/vi.html ターミナルも使うが、わからない人はググるか友達に聞く。 3:ターミナルを起動しcocos2d-xのフォルダへ移動後、以下のコマンドを実行の所だが、3.0ではテンプレートをxcodeから読み込めないらしいので、 cd /Applications/eclipse/cocos2d-x-3.0beta2/tools/project-creator で ./create_project.py -n <PROJECT_NAME> -k <PACKAGE_NAME> -l <cpp|lua|javascript> -p <PROJECT_PATH> ./create_project.py -n HelloWorld -k com.example.HelloWorld -l cpp -p パス を実行 すると指定したパスにプロジェクトができている。 できたファイルの中のproj.ios.macの中にxcodeのプロジェクトが入っているのでそれを開いて、 RunするとHelloworldができる。 けっこうコンパイルに時間がかかる。 そりゃC++から変換してるんだから当然かもしれないけど。 で、次はeclipseの方 ターミナルで、 proj.androidの場所に移動して、 ./build_native.pyすると NDK_ROOT not de...