忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 20:05 】 |
無題
RenderTexture のインスタンスを作る

texture->begin();
node->visit();
texture->end();

RenderTextureは、「ノード」を描画する。「画面」を描画するわけではない。
描画したい「ノード」(以降、ターゲットノードと呼ぶ)を、通常のdrawと同様に行うだけ。
だから、ターゲットノードに、setPosition()が入っていると、その分描画がずれてしまう。

これをRenderTextureのメソッドで修正するのは、ちょっと考え方が違うし、やりにくい
(setVirtualViewport()で変更できるが。後述)

簡単な対処として、
描画前にターゲットノードにsetPosition(0,0)を行い、
描画が終わってから元の座標を再代入することが考えられる…(A)

少しスマートな方法として、ターゲットノードは、その上にダミーノードを作り、
ダミーノードにsetPosition()をしておき、描画したいノードそのものにはsetPosition()しないのが良いと思われる…(B)

が、このやり方でも問題が。
renderするとなぜか、ノードが画面(親ノードではない)の左下隅に移動してしまうという問題が起きた

原因は詳しく追っていないが、
想像できるのは
OpenGLのビューポート指定が(0,0,w,h)の形であり、
これだと画面の左下を切り取って描画する形になっている。
それに合わせるため、ノードを画面左下に配置して描画しているということだろうか
実際、上記の(A)の時は、この問題が起きていない。描画後にsetPosition()をしているからだろうか。


結局、
「ターゲットノードと同じものをもう一度作り、それを描画する」
という形に落ち着いた。一番無駄な形に…



RenderTexture.cpp

//calculate viewport
{
Rect viewport;
viewport.size.width = _fullviewPort.size.width;
viewport.size.height = _fullviewPort.size.height;
float viewPortRectWidthRatio = float(viewport.size.width)/_fullRect.size.width;
float viewPortRectHeightRatio = float(viewport.size.height)/_fullRect.size.height;
viewport.origin.x = (_fullRect.origin.x - _rtTextureRect.origin.x) * viewPortRectWidthRatio;
viewport.origin.y = (_fullRect.origin.y - _rtTextureRect.origin.y) * viewPortRectHeightRatio;
//glViewport(_fullviewPort.origin.x, _fullviewPort.origin.y, (GLsizei)_fullviewPort.size.width, (GLsizei)_fullviewPort.size.height);
glViewport(viewport.origin.x, viewport.origin.y, (GLsizei)viewport.size.width, (GLsizei)viewport.size.height);
}

PR
【2016/02/04 17:22 】 | cocos2d-x | 有り難いご意見(0)
アドフリ君実装感
なぜか広告がいつまでも取得されない(AdsFetchCompletedがいつまでも呼び出されない)という現象。
どうやらライブラリの追加もれがあったようだ。
コンパイルエラーとかリンクエラーとか起きないこともあるのか。
沈黙の臓器。

全部直したらちゃんと取得された。


次の問題。
maioが再生できない。
エラーとして以下のようなものが出た

UIAlertControllerに動画ビューを載せようとしているようだ。
なぜそんなことをするのか。
確かに、再生命令の直前までアラートを出している(アラートで「はい」を選択したら動画を再生している)
それのせいなのか。
その時点で最前面にあるコントローラに載せて再生しようとしているのか。

アラートから直接でなく、アラートの直後(0コンマ数秒後)に再生するように変えてみた。
まだダメだ。同じワーニングが出る。
まだUIAlertControllerのインスタンスが残っているからか。

アラートを出さずに再生してみた。
問題なく再生された。

うーむ。再生するビューコントローラを指定できないのか?

adfurikun自体のメソッド(ADFMovieReward.framework)には、再生するときにビューコントローラを指定する方法がない。
しかしmaioにはあったはずだ。以下の2種類の指定ができる。
[Maio show];
[Maio showWithViewController:viewController];
そこで、adfurikunからmaioを呼び出す部分を見てみる。
MovieReward6004.h/m だ。
見てみると、確かに

-(void)showAd
{
if ([Maio canShow]) {
[Maio show];
}
}



とだけ書いて有る。

そんなら、こっちから指定できるようにしちゃおう、ということで

MovieReward6004.h

@interface MovieReward6004 : ADFmyMovieRewardInterface

+(void) setViewController:(UIViewController*)vc;

@end




MovieReward6004.m

@implementation MovieReward6004

static UIViewController* viewController;

+(void) setViewController:(UIViewController*)vc{
viewController = vc;
}


:
:


-(void)showAd
{
if ([Maio canShow]) {
if (viewController) {
[Maio showWithViewController:viewController];
}
else{
[Maio show];
}
}
}





という感じで追記してみた。

で、adfurikunの初期化のときに

[MovieReward6004 setViewController:self.viewController];



を追加。


ビルドして実行してみると…いい感じ!
アラートがあってもちゃんと再生された!


というわけで、maioは解決。

だが…ほかの広告も対応が必要になってくると面倒。

vungleで試したが、こちらは指定がviewやviewControllerでなく、windowになっている。
同じ要領で
[UIApplication shareApplication].keyWindow
を渡そうとしたが、なぜか実行時に盛大に落ちる。

面倒になってきたので、
「アラートと一緒にadfurikunは再生しない」
というのが現状の結論。



#######################

別件。

アドフリ君には、以下の2つのdelegateが用意されている(他にもあるが)
AdsDidCompleteShow
AdsDidHide
動画の再生が終了した時と、動画を閉じた時だ。

動画広告は通常、動画が流れ終わると静止画になって、ダウンロードページに行くか、広告を閉じるボタンかを選ぶ。
静止画になった時に呼ばれるのがAdsDidCompleteShow、広告を閉じたらAdsDidHideが呼ばれるべきだ。

だが、必ずしもそうなってない。
検証した。

広告種類AdsDidCompleteShowAdsDidHide
appLovin再生終わった時広告閉じた時
maio再生終わった時広告閉じた時
adColony広告閉じた時広告閉じた時
vungle広告閉じた時広告閉じた時
UnityAds未確認未確認

ということだ。
appLovinとmaio優秀。
adColonyとvungleトラップ。

元のSDKに対応するコールバックがないのかもしれないが、通知タイミングが名前と違うのは罠だ。

本来、インセンティブを付与するのはAdsDidCompleteShow
ゲームを再開する処理はAdsDidHide
と別々になっているべきだ。


adColonyとvungleなんかは、コールバックの名前を信じて実装してると、
広告を閉じないとインセンティブがもらえなくなる。

これがどういう問題かというと、
広告を見て、ユーザがその広告先に遷移し、そのままゲームアプリがメモリから消えてしまうと、広告を見たのにインセンティブがもらえない、ということが起きてしまう。

これはクレームがついても仕方がない。
対応したほうが良いだろう。

方法として考えられるのは
・その広告を使わない
・広告再生中にアプリがバックグラウンドに行ったら、付与する
・再生開始時にもうインセンティブ付与しちゃう
・ストック型のインセンティブにしない(本末転倒)
などなど…
【2016/02/01 15:13 】 | 広告 | 有り難いご意見(0)
サウンド読み込み

読み込み処理をしている場所
どうも同期的に読んでいるように見える


CDAudioManager.m
audioSourcePlayer = [(AVAudioPlayer*)[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
【2016/02/01 15:02 】 | cocos2d-x | 有り難いご意見(0)
セーブにかかる時間
cocos2dのセーブには2種類ある

Dictionary
UserDefaults

このうち、Dictionary はすでに deprecated になっているので、
UserDefaults を使うことになるのだが
こちらはセーブに時間がかかる

300変数をセーブすると4秒とかかかったりする


ただしこれはセーブのタイミングによっても変わるし、
なんどもセーブしていると段々早くなる。

使うときはよく考えて行うべし

【2016/01/27 15:58 】 | cocos2d-x | 有り難いご意見(0)
admobのアプリ内課金向け広告のフォーマット
以前admobから告知があった(そして本社に行った)、
アプリ内課金と広告をユーザに応じて出しわける例の技術。
名前は「アプリ内課金向け広告」というらしいが。

公式

現時点でまだベータ版なのと、
Android版だけのサービスなので(GooglePlayで検索して出てくるアプリにしか使えないと明記されている)、とりあえず実装は見送り
【2016/01/18 18:06 】 | Android | 有り難いご意見(0)
libchipmunk のduplicateエラー
cocos2dで作ったゲームプロジェクトを
古いシミュレータ対象でビルドすると、以下のようなエラーが出ることがある。



libchipmunk内で、多くのシンボルが多重定義されているというエラー。
おそらく、libchipmunkが2重にビルドされているのだろう。
なぜそういうことが起きるのが、という追求は別にする必要はなく、
libchipmunk自体使っていないので、ビルド対象から外して仕舞えば良い。

その方法は、以下のリンク先にある。
参考

プロジェクトの Build Phases の
Target Dependencies から libchipmunk を削除。
また、
Link Binary With Libraries からも削除。


これでこのエラーは起きなくなる。
【2016/01/18 17:20 】 | cocos2d-x | 有り難いご意見(0)
LG-D620Jをデバッグに使う
後から思い出しながらなので、抜けがあるかもしれないが。
なお結論としては、直接Macとつないでのデバッグは不可。ログを見たりはできない。
ネットワークからapkをダウンロードして動作確認しかできない。


1.
端末を初期化して、Gmailアカウントを設定。
このアカウントは、テスト用(主に課金テスト)に使う物。
自分の普段使うアカウントではない。

2.
設定アプリ→端末情報→ソフトウェア情報→ビルド番号を連打。これで開発者オプションを有効にする

3.
設定アプリ→PC接続→USB接続方法の選択→充電(気持ち的にはテザリングのような気がするが)

4.
http://www.lg.com/jp/support-mobile/lg-D620J
からUSBドライバーをインストール。再起動

5.
USBケーブルで繋いだら、あとは出来る


はずだったのだが、ドライバーがMac OS 10.11 (El Capitan)に対応していない!
そのため

$ adb devices
で表示されない…

$ adb install XXX.apk
ももちろんできない…



○繋いでいるはずのandroid端末がadbから見えない時の対処

ここからは、以下のページを見てやってみる
参考ページ


まずは端末をmacに繋ぐ
左上のリンゴ→このMacについて→システムレポートをクリック
USBの項目を見る
ここの、製造元ID(Vendor ID)をチェック。


この16進数を、以下のファイルに書き込む
$ echo 0x1001 >> ~/.android/adb_usb.ini

これで、adbを再起動し、再度チェック
$ adb kill-server
$ adb devices

これで出る!

はずだが、やはり出なかった

ドライバーが古いせいなのか…


【2016/01/08 16:01 】 | Android | 有り難いご意見(0)
BITCODEのエラーが出たら
BITCODEで以下のエラーが出た場合


以下のように設定する
【2015/12/11 22:29 】 | iPhone | 有り難いご意見(0)
Unityで2dゲームを作成
画面サイズは以下のように設定。

MainCameraでOrthogontal
サイズを5.68にする。


これは、640x1136の想定。
サイズは568じゃないのかと思うところだが、



と、ここで設定している。
Unityの1メートルが100ピクセルになる寸法。


これ、1にしたほうがいいんじゃないかという気がする
表示位置の計算をするときに、毎回100分の1にするとか面倒だ
【2015/12/11 22:24 】 | UNITY | 有り難いご意見(0)
Unityで課金処理
SOOMLAを使うと便利

参考


【2015/12/11 22:20 】 | UNITY | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>