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

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

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

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

COCOS2D-X

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

Q&A

解決済

1回答

1634閲覧

Cocos2d-xのsdkbox::pluginAdColonyのイベントリスナー実装について

退会済みユーザー

退会済みユーザー

総合スコア0

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

COCOS2D-X

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

0グッド

0クリップ

投稿2017/01/19 21:45

cocos2d-x 3系にsdkboxを利用してAdColonyの動画広告を導入しています。

以下に従って導入を進めております。
https://github.com/glossom-dev/AdColony-Cocos2dx-sdkbox-JP-Support-v3.x

しかし、3.3 Catch AdColony events (optional)のところで、リワード発生のコールバック実装方法がよくわからず詰まっております。

下記のように、sdkbox::AdColonyListenerを継承して実装してください。

#include "PluginAdColony/PluginAdColony.h" class MyClass : public sdkbox::AdColonyListener { private: void onAdColonyChange(const sdkbox::AdColonyAdInfo& info, bool available); void onAdColonyReward(const sdkbox::AdColonyAdInfo& info, const std::string& currencyName, int amount, bool success); void onAdColonyStarted(const sdkbox::AdColonyAdInfo& info); void onAdColonyFinished(const sdkbox::AdColonyAdInfo& info); };

上記そのままのコードをAdColonyHleperクラス名で実装しました。

コールバックを処理するリスナーを作成してください。

sdkbox::PluginAdColony::setListener(this);

このリスナーはどこに設置するのでしょうか。
試しに、メインのゲームシーンに実装したところ、エラーが発生しました。

#include "PluginAdColony/PluginAdColony.h" : : bool GameScene::init() { if (Layer::init() == false) { return false; } sdkbox::PluginAdColony::setListener(this); : :
jni/../../../Classes/Scene/GameScene.cpp: In member function 'virtual bool GameScene::init()': jni/../../../Classes/Scene/GameScene.cpp:47:45: error: no matching function for call to 'sdkbox::PluginAdColony::setListener(GameScene*)' sdkbox::PluginAdColony::setListener(this); ^ jni/../../../Classes/Scene/GameScene.cpp:47:45: note: candidate is: In file included from jni/../../../Classes/Component/AdColonyHelper.h:4:0, from jni/../../../Classes/Scene/GameScene.cpp:5: jni/PluginAdColony/PluginAdColony.h:78:21: note: static void sdkbox::PluginAdColony::setListener(sdkbox::AdColonyListener*) static void setListener(AdColonyListener* listener);

thisには「AdColonyListener* listener」が期待されているので、設置する場所が異なる、というのはなんとなくわかります。

このsetListenerをどこに埋め込めば良いのか、、、ご教示をお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

GameScene::init()で、sdkbox::PluginAdColony::setListener(this); と書いているのに、
GameSceneにsdkbox::AdColonyListenerを実装していないのが問題ですよね。

やり方は2つあります。

  • GameSceneに実装する(簡単)
  • AdColonyHelperなどの別クラスへ実装する

(std::functionなどC++のコールバック利用の知識があれば可能)

どちらも説明できますが、とりあえず簡単な方法を回答します。

C++では多重継承が可能ですので、同時に複数のクラスから継承する事が出来ます。
従って、GameSceneをcocos2d::Layer, sdkbox::AdColonyListenerの2つから継承するように書きます。
そうすれば、GameScene::init()の中で、
sdkbox::PluginAdColony::setListener(this); と書けます。

cpp

1#include "cocos2d.h" 2#include "PluginAdColony/PluginAdColony.h" 3 4class GameScene : public cocos2d::Layer, sdkbox::AdColonyListener { 5public: 6... 7 bool init() override; 8 ... 9 10 void playAdMovie(); 11 12 void onAdColonyChange(const sdkbox::AdColonyAdInfo& info, bool available); 13 void onAdColonyReward(const sdkbox::AdColonyAdInfo& info, 14 const std::string& currencyName, int amount, bool success); 15 void onAdColonyStarted(const sdkbox::AdColonyAdInfo& info); 16 void onAdColonyFinished(const sdkbox::AdColonyAdInfo& info); 17}; 18 19bool GameScene::init(){ 20 if(!Layer::init()){ 21 return false; 22 } 23 24 sdkbox::PluginAdColony::setListener(this); 25 ... 26 27 return true; 28} 29 30void GameScene::playAdMovie() { 31 sdkbox::PluginAdColony::show("v4vc"); 32} 33 34void GameScene::onAdColonyChange(const sdkbox::AdColonyAdInfo& info, bool available) { 35} 36 37void GameScene::onAdColonyReward(const sdkbox::AdColonyAdInfo& info, const std::string& currencyName, int amount, bool success) { 38 // 動画を最後まで再生したので、報酬を付与する 39 if (success) { 40 // 具体的な処理 41 } 42} 43 44void GameScene::onAdColonyStarted(const sdkbox::AdColonyAdInfo& info) { 45} 46 47void GameScene::onAdColonyFinished(const sdkbox::AdColonyAdInfo& info) { 48} 49

投稿2017/01/20 01:48

編集2017/01/20 01:56
mingos

総合スコア4025

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

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

退会済みユーザー

退会済みユーザー

2017/01/20 13:13

大変わかりやすいソースまでご提供くださりありがとうございました。 ズバリそのもののご回答でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問