在cocos2d中实现生命/评分系统

时间:2011-08-06 08:14:51

标签: ios cocos2d-iphone box2d

我正在尝试使用cocos2d和box2d实现一个实时/分数系统。我的身体是box2d的身体,它们按照我的要求碰撞,但问题在于我一直在努力实施一个分数系统,在每次碰撞中,生命被移除或减少了生命的剩余时间和一定数量的碰撞(比如说3次) )游戏应该停止。在这种情况下它不会,但是从CCLOG我发现它实际上打印出我在调用游戏管理器时显示的消息,但奇怪的是它永远调用它(参见下面的调试窗口)它在启动应用程序时完全从场景中删除了对象“man”。

我有一个gameManager(单例)类,在.h文件中我声明了

@interface GameManager : NSObject {
    int lives;
}
-(void)removeLives : (int)val;

并在gameManager.m文件中我有这个方法

-(void)removeLives : (int)val
{
    lives -=val;
    CCLOG(@"YOU HAVE LOST A LIFE MAN");
}

在我更新方法的主要gameLayer.mm文件中,我有这段代码

if(kStateColliding){

    if (lives > 0) {
    man.visible = TRUE;

    } else if (lives <= 0) {

        [man stopAllActions];
        man.visible = FALSE;    
        [[GameManager sharedGameManager] removeLives:1];
    }
}

并且生命在gameManager初始化方法中初始化

-(id)init {                                                        // 8
    self = [super init];
    if (self != nil) {
    // Game Manager initialized
    CCLOG(@"Game Manager Singleton, init");
    lives = 3;
}

这是调试控制台的屏幕截图

debug console screen shot

另请注意,我有一个“Man”类,即Box2d类。

我做的是正确的吗?请任何人都可以帮我解决如何实施此系统以及在何处以及如何进行适当的调用。

1 个答案:

答案 0 :(得分:1)

您对[[GameManager sharedGameManager] removeLives:1]的调用位于else if(lives&lt; = 0)块内。它应该只在生命时被称为&gt; 0

在男人没有生命之后,你会想要做一些事情来防止调用if(kStateColliding)块。此外,您可能希望将勒芒位置从其碰撞的对象重置,以防止单个“碰撞”触发多次调用removeLives。

你在gameLayer.mm宣布生活在哪里?确保它被设置为存储在单例中的值,因为使用当前代码,我不会看到如何设置为0或更低,除非它被初始化为0或者你在其他地方更改其值。

我会在cocos2d论坛上问这样的cocos2d问题:http://www.cocos2d-iphone.org/forum/

您可以在几分钟内更快地得到答案。