[セットトップ]Cocos 2 d-x使用中に発生したエラー(VS下開発、Androidリリースに移植)(更新ing)
環境:windows 7,VS 2010,cococos 2 d-1.0.1-x-0.12.0,cygwin,eclipse,android sdk 4.0.3, ndk r7b
vsで開発しandroidに移植する
20120718
CCArrayのforeach操作:
cococos 2 d-xローカル通知呼び出しの問題CCNotificationCenter登録されているpostNotificationメッセージ関数でaddObserverを呼び出すことができず、CCNotificationObserverオブジェクトを格納するCCArray拡張を引き起こす可能性があり、CCArrayがメモリアドレスを再newし、CCArrayヘッダが変更され、実行後にpostNotification関数を返すと、元のCCArrayヘッダと一致せず、メモリ読み込みエラーが発生します.
20120719
強制型変換:
カスタムクラスMainSceneはCCLayerから継承され、HelloWorld、MainScene::scene()と直接sceneオブジェクトをnewし、MainSceneのオブジェクトをsceneの下に掛けます.
ただし、後で呼び出されるとエラーが発生します.MainScene*pScene=(MainScene*)(pDirector->getRunningScene();sceneは強制的にCCLayerに変換され、いわゆるMainSceneオブジェクトメンバーに対して操作され、メモリブロック異常を引き起こし、現象はわけのわからないところで掛けられ、毎回異なり、メモリブロック検出も異常を報告した.
危険な強制メモリ変換、覚えておいてください!
20120723
グローバル変数の初期化順序に依存するコードは書かないほうがいい.
最初はVSでデバッグして大丈夫で、Androidに移植して、初期化の時に切りました.
資料を調べてみましたが、初期化順の問題が原因です.(具体的な初期化の手順がはっきりしていません.
PS:静的定数の順序を初期化する文章をいくつか見つけました
1.グローバル変数の初期化順序の制御&&#pragma詳細
2.グローバル変数の初期化順序
3.JAVAで初期化順復習
4.秩序定数を初期化するための小さなテクニック
20120726
playEffect
サウンドを再生する前にpreloadEffectを先にしなければなりません.そうしないと、初めて再生したサウンドは音がしません.一度にpreloadEffectのすべてのサウンドを呼び出すことができ、android側はHashMapストレージのサウンドストレージパスを呼び出します.
vs端はpreloadEffectを書かなくても正常に再生できますが、android端はpreloadEffectを先に書かなければ正常に再生できません.そうしないと、初めて再生して音がしません.バックミュージックはこの問題に気づかなかった.
20120803
CCTargetedTouchDelegateの継承とdynamic_cast
touchに応答できるspriteを書きたい
クラス定義は次のようになります.
そしてtouchメッセージを登録するとき
ここで掛けて、午後調べて、掛けました.
-addTargetedDelegate
-CCTargetedTouchHandler::handlerWithDelegate
-initWithDelegate
-CCTouchHandler::initWithDelegate
-dynamic_cast(pDelegate)->retain();
-void CCObject::retain(void)
ここについて、コンパイラはCCObjectのthisポインタが0だと教えてくれました.めまいがします.変な感じがします.
理由:CCTargetedTouchDelegateは上記の表記ではプライベート継承でありdynamic_によるcastの役割:(演算子は実行期間中に本当のタイプを決定できます.downcastが安全である場合(つまり、ベースクラスポインタまたは参照が派生クラスオブジェクトを指している場合)、この演算子は適切に変換されたポインタに戻ります.downcastが安全でない場合、この演算子は空のポインタを返します(つまり、ベースクラスポインタまたは参照は派生クラスオブジェクトを指していません).上の状況は合理的だ.
今日は2つの知識点を学びました.
1.class B:public A、Cの場合Aはpublic継承、Cはprivate継承;class B:AこのAもprivate継承
2.dynamic_キャストはpublic以外はnullを返します
だから
正しいです.自分のc++の基礎が本当に腐っていることに気づいた.
20121101
今日はハロウィンじゃないのか、どうしてエイプリルフールになったのか!!!
VC++の下で開発し、ローカルコードを編成してAndroidで実行するプロジェクトなので、実機でロゴを印刷してデバッグする必要があるところもあります.私は日よ、私はコードの中でN余りのlogコードをプラスして、一言も出てこないで、logの上で1日葛藤して、最初はcocos 2 dのコードが問題があると思って、まさか自動的にlogの出力を遮断しましたか?インターネットで資料を調べても、もちろん何も見つからない.私はlogコードをプラスして、それから本物に行って、logが見えないで、それからlogコードをプラスし続けて、往復循環します.仕事が終わったとき、同僚は私がこんなに悩んでいるのを見て、vcでプログラムを中断してlogコードに実行しましたか?結果はプログラムが正常に運行して、ブレークポイントは全然行かないで、頼りにします!私はずっと廃コードにロゴをつけていたのか.私の命は、このように浪費しました.私は1首の神曲を思い出して、興味のある学友は少し聞くことができます:Wrong hole-DJ Lubel
20121103
CCTexture2D::initWithData
bool CCTexture2D::initWithData(const void *data, CCTexture2DPixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh,const CCSize& contentSize)
データを使用してテクスチャを作成するには、何度も試してみましたが、なぜ正常に作成されたテクスチャが表示されないのか、いろいろな問題が考えられました.最後にcontentSizeという最後のパラメータを発見し、私があげたのは(0,0)もちろん作成できませんが、最初はCCTexture 2 Dの作成に成功した後に私に返された生成したテクスチャサイズだと思っていました.事実は私が考えすぎたことを証明しています......このパラメータは最初にテクスチャを作成するサイズを指定しました.
20131220
runAction & OnEnter
今日は巻物を開く動画を覚えました
最初は自分で考えた方法はCCProgressTimerのCCProgressToを使ってこのアニメーションを実行することでしたが、私が作ったのは単一のspriteだけでなく、上に掛けたLabelもあるので、CCProgressTimerは描くときにそのサブノードを処理しません.後にCCRenderTextureを使って、巻物の上のものをすべて上に描く方法を考えました.その後、CCRenderTextureを使用してCCProgressTimerのspriteを生成し、効果が要求されます.
しかし、CCRenderTextureは、描画効率が低く、ゲームが停止するとCCRenderTextureのリソースが失われるため、従来は推奨されていませんでした.
大能コンサルティングを探して、CCClippingNodeを使うことを推薦して、そのStencilを設定して、それからこのStencilに対して処理して展示の効果を出すことができます.
問題が発生しました:私はaddChildの後でStencilを交換して、それからこのStencilでアニメーションを再生して、死んで放送することができなくて、その他はすべてアニメーションを再生することができます.後にノードのOnEnterの後にノードの下の子を変更していることが判明し,この子に対するすべてのイベントは発生しない.子のOnEnter関数は二度と実行されないからです.
20130901
CCBatchNode vs ccBlendFunc
エンジンバージョン:2.2.5
CCBatchNodeの下に置かれたボーンアニメーションはccBlendFuncを設定できません.CCArmatureのdraw関数を表示できます.最初の文はbatchnodeが空かどうかを判断することです.
考えてみれば、各アニメに独自のccBlendFuncがあれば、batchnodeの下に置く必要はありません.
vsで開発しandroidに移植する
20120718
CCArrayのforeach操作:
cococos 2 d-xローカル通知呼び出しの問題CCNotificationCenter登録されているpostNotificationメッセージ関数でaddObserverを呼び出すことができず、CCNotificationObserverオブジェクトを格納するCCArray拡張を引き起こす可能性があり、CCArrayがメモリアドレスを再newし、CCArrayヘッダが変更され、実行後にpostNotification関数を返すと、元のCCArrayヘッダと一致せず、メモリ読み込みエラーが発生します.
observer->performSelector
は、登録されたメッセージコールバック関数です.この関数では、カスタムメッセージを再追加または削減できません.void CCNotificationCenter::postNotification(const char *name, CCObject *object)
{
CCObject* obj = NULL;
CCARRAY_FOREACH(m_observers, obj)
{
CCNotificationObserver* observer = (CCNotificationObserver*) obj;
if (!observer)
continue;
if (!strcmp(name,observer->getName()))
observer->performSelector(object);
}
}
20120719
強制型変換:
カスタムクラスMainSceneはCCLayerから継承され、HelloWorld、MainScene::scene()と直接sceneオブジェクトをnewし、MainSceneのオブジェクトをsceneの下に掛けます.
ただし、後で呼び出されるとエラーが発生します.MainScene*pScene=(MainScene*)(pDirector->getRunningScene();sceneは強制的にCCLayerに変換され、いわゆるMainSceneオブジェクトメンバーに対して操作され、メモリブロック異常を引き起こし、現象はわけのわからないところで掛けられ、毎回異なり、メモリブロック検出も異常を報告した.
危険な強制メモリ変換、覚えておいてください!
20120723
グローバル変数の初期化順序に依存するコードは書かないほうがいい.
const CCSize WIN_SIZE = CCDirector::sharedDirector()->getWinSize();
最初はVSでデバッグして大丈夫で、Androidに移植して、初期化の時に切りました.
資料を調べてみましたが、初期化順の問題が原因です.(具体的な初期化の手順がはっきりしていません.
PS:静的定数の順序を初期化する文章をいくつか見つけました
1.グローバル変数の初期化順序の制御&&#pragma詳細
2.グローバル変数の初期化順序
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}
3.JAVAで初期化順復習
4.秩序定数を初期化するための小さなテクニック
20120726
playEffect
サウンドを再生する前にpreloadEffectを先にしなければなりません.そうしないと、初めて再生したサウンドは音がしません.一度にpreloadEffectのすべてのサウンドを呼び出すことができ、android側はHashMapストレージのサウンドストレージパスを呼び出します.
vs端はpreloadEffectを書かなくても正常に再生できますが、android端はpreloadEffectを先に書かなければ正常に再生できません.そうしないと、初めて再生して音がしません.バックミュージックはこの問題に気づかなかった.
20120803
CCTargetedTouchDelegateの継承とdynamic_cast
touchに応答できるspriteを書きたい
クラス定義は次のようになります.
class GemBoard : public CCSprite, CCTargetedTouchDelegate
そしてtouchメッセージを登録するとき
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);
ここで掛けて、午後調べて、掛けました.
-addTargetedDelegate
-CCTargetedTouchHandler::handlerWithDelegate
-initWithDelegate
-CCTouchHandler::initWithDelegate
-dynamic_cast
-void CCObject::retain(void)
ここについて、コンパイラはCCObjectのthisポインタが0だと教えてくれました.めまいがします.変な感じがします.
理由:CCTargetedTouchDelegateは上記の表記ではプライベート継承でありdynamic_によるcastの役割:(演算子は実行期間中に本当のタイプを決定できます.downcastが安全である場合(つまり、ベースクラスポインタまたは参照が派生クラスオブジェクトを指している場合)、この演算子は適切に変換されたポインタに戻ります.downcastが安全でない場合、この演算子は空のポインタを返します(つまり、ベースクラスポインタまたは参照は派生クラスオブジェクトを指していません).上の状況は合理的だ.
今日は2つの知識点を学びました.
1.class B:public A、Cの場合Aはpublic継承、Cはprivate継承;class B:AこのAもprivate継承
2.dynamic_キャストはpublic以外はnullを返します
だから
class GemBoard : public CCSprite, public CCTargetedTouchDelegate
正しいです.自分のc++の基礎が本当に腐っていることに気づいた.
20121101
今日はハロウィンじゃないのか、どうしてエイプリルフールになったのか!!!
VC++の下で開発し、ローカルコードを編成してAndroidで実行するプロジェクトなので、実機でロゴを印刷してデバッグする必要があるところもあります.私は日よ、私はコードの中でN余りのlogコードをプラスして、一言も出てこないで、logの上で1日葛藤して、最初はcocos 2 dのコードが問題があると思って、まさか自動的にlogの出力を遮断しましたか?インターネットで資料を調べても、もちろん何も見つからない.私はlogコードをプラスして、それから本物に行って、logが見えないで、それからlogコードをプラスし続けて、往復循環します.仕事が終わったとき、同僚は私がこんなに悩んでいるのを見て、vcでプログラムを中断してlogコードに実行しましたか?結果はプログラムが正常に運行して、ブレークポイントは全然行かないで、頼りにします!私はずっと廃コードにロゴをつけていたのか.私の命は、このように浪費しました.私は1首の神曲を思い出して、興味のある学友は少し聞くことができます:Wrong hole-DJ Lubel
20121103
CCTexture2D::initWithData
bool CCTexture2D::initWithData(const void *data, CCTexture2DPixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh,const CCSize& contentSize)
データを使用してテクスチャを作成するには、何度も試してみましたが、なぜ正常に作成されたテクスチャが表示されないのか、いろいろな問題が考えられました.最後にcontentSizeという最後のパラメータを発見し、私があげたのは(0,0)もちろん作成できませんが、最初はCCTexture 2 Dの作成に成功した後に私に返された生成したテクスチャサイズだと思っていました.事実は私が考えすぎたことを証明しています......このパラメータは最初にテクスチャを作成するサイズを指定しました.
20131220
runAction & OnEnter
今日は巻物を開く動画を覚えました
最初は自分で考えた方法はCCProgressTimerのCCProgressToを使ってこのアニメーションを実行することでしたが、私が作ったのは単一のspriteだけでなく、上に掛けたLabelもあるので、CCProgressTimerは描くときにそのサブノードを処理しません.後にCCRenderTextureを使って、巻物の上のものをすべて上に描く方法を考えました.その後、CCRenderTextureを使用してCCProgressTimerのspriteを生成し、効果が要求されます.
しかし、CCRenderTextureは、描画効率が低く、ゲームが停止するとCCRenderTextureのリソースが失われるため、従来は推奨されていませんでした.
大能コンサルティングを探して、CCClippingNodeを使うことを推薦して、そのStencilを設定して、それからこのStencilに対して処理して展示の効果を出すことができます.
問題が発生しました:私はaddChildの後でStencilを交換して、それからこのStencilでアニメーションを再生して、死んで放送することができなくて、その他はすべてアニメーションを再生することができます.後にノードのOnEnterの後にノードの下の子を変更していることが判明し,この子に対するすべてのイベントは発生しない.子のOnEnter関数は二度と実行されないからです.
20130901
CCBatchNode vs ccBlendFunc
エンジンバージョン:2.2.5
CCBatchNodeの下に置かれたボーンアニメーションはccBlendFuncを設定できません.CCArmatureのdraw関数を表示できます.最初の文はbatchnodeが空かどうかを判断することです.
考えてみれば、各アニメに独自のccBlendFuncがあれば、batchnodeの下に置く必要はありません.