私はこの質問が以前に尋ねられ、答えられたことがあることを知っていますが、答えのどれも私がやろうとしていることに合わないようです。アニメーションを一時停止できる必要がありますが、それでも一時停止メニューを表示してユーザーに入力を求めることができます。これは可能ですか?もしそうなら、どうすればそれを実行できますか?
9 に答える
2つの方法がpause
ありresume
、この目的のためにCCDirector
:
[[CCDirector sharedDirector] pause];
と
[[CCDirector sharedDirector] resume];
ドキュメントから:
実行中のシーンは描画されますが、スケジュールされたすべてのタイマーは一時停止されます一時停止中は、CPU消費を減らすために描画レートは4FPSになります
cocos2dシーンスタックの「一時停止シーン」をプッシュすることをお勧めします。
CCScene * pauseScene = ...;
[[CCDirector sharedDirector] pushScene:pauseScene];
これにより、現在のシーン(レベルシーンと想定)が自動的に一時停止され、ユーザーが操作できるように「一時停止シーン」が実行されます。
上記の手順を実行すると、cocos2dのシーンスタックに2つのシーン(レベルシーン[フリーズ] +ポーズシーン[実行中])が作成されることを覚えておくことが非常に重要です。
したがって、「一時停止シーン」に入ったら、レベルを再開する場合は、スタックから一時停止シーンをポップする必要があります。
[[CCDirector sharedDirector] popScene];
これにより、「一時停止シーン」が自動的に削除され、スタック内の前のシーン(レベルシーン)が再開されます。
いつか一時停止シーンを常に「ポップ」する必要があることを忘れないでください。「レベルシーン」がまだcocos2dのシーンスタックにあることを忘れないことが重要です!
例:「シーンの一時停止」にレベル選択メニューをロードして現在のレベルを永続的に残すボタンがある場合は、次のように実装する必要があります。
CCScene * levelSelector = ...
[[CCDirector sharedDirector] popScene]; // to remove the "pause scene" from the stack
[[CCDirector sharedDirector] replaceScene:levelSelector]; // replace the "level scene" with the "levelSelector scene"
私はすべての提案を試しましたが、私の場合はどれもうまくいきませんでした。それで、これが私にとって本当にうまくいったことでした。これは一時停止することです。
[self pauseSchedulerAndActions];
for (CCNode *child in [self children]) {
[child pauseSchedulerAndActions];
}
そしてこれを再開します:
[selfReference resumeSchedulerAndActions];
for (CCNode *child in [selfReference children]) {
[child resumeSchedulerAndActions];
}
Cocos 2Dバージョン2では、アクションマネージャーはもはやシングルトンではありません。しかし、むしろコードはCCDirectorと融合されています。
したがって、これは特定のシーンのすべてのアクションを一時停止し、それらも再開する方法です。
-(void)pauseGamePlayScene{
for(CCSprite *sprite in [self children]) {
[[[CCDirector sharedDirector] actionManager]pauseTarget:sprite];
}
}
-(void)resumeGamePlayScene{
for(CCSprite *sprite in [self children]) {
[[[CCDirector sharedDirector] actionManager]resumeTarget:sprite];
}
}
Cocos 2dVer2アクションマネージャーのドキュメント
お役に立てれば。
アニメーションだけをやめますか?
[ [ CCDirector sharedDirector ] stopAnimation ];
[ [ CCDirector sharedDirector ] startAnimation ];
すべてを停止したい場合は、他の場所で行ったように一時停止し(メニューが所定の位置に移動した後)、ユーザーが特定のものに触れたら一時停止を解除します。
私はcocos2Dを初めて使用し、(scheduleupdateではなく)個別のゲームループを使用しており、さらにいくつかのスケジューラーとともにスケジュールを解除しています。ゲームレイヤーの上に新しいレイヤー(つまり、Pauselayer)を配置すると同時に、ゲームプレイが自動的に一時停止します。かなり複雑に見えますが、私のために働きました。
私が使う:
@interface CCNode (PauseAdded)
@end
@implementation CCNode (PauseAdded)
-( void ) traversePause
{
CCNode* a = [children_ lastObject];
CCARRAY_FOREACH( children_, a )
{
[scheduler_ pauseTarget:a];
[actionManager_ pauseTarget:a];
[a traversePause];
}
[scheduler_ pauseTarget:self];
[actionManager_ pauseTarget:self];
}
-( void ) traverseResume
{
CCNode* a = [children_ lastObject];
CCARRAY_FOREACH( children_, a )
{
[a traverseResume];
[scheduler_ resumeTarget:a];
[actionManager_ resumeTarget:a];
}
[scheduler_ resumeTarget:self];
[actionManager_ resumeTarget:self];
}
@end
そうすれば、ゲームレイヤーが一時停止レイヤーから分離されていると仮定して、次のようなことができます。
[scene.game_layer traversePause];
そして一時停止を解除するには:
[scene.game_layer traverseResume];
このPauseButtonクラスhttps://github.com/iabtyagi/custom-pause-cocos2dを試してください。あなたが探していることを正確に行います。
CCPhysicsNode * _physics;
_physics.paused = true; //ゲームは一時停止しますが、アクションは一時停止しません。
_physics.paused = false; //一時停止ゲーム中のようにボタンが押されている間、スプライトの回転と落下を再開します。