Cocos2d iphone Cocos2d使用1类处理多个敌人得分错误

Cocos2d iphone Cocos2d使用1类处理多个敌人得分错误,cocos2d-iphone,Cocos2d Iphone,感谢您抽出时间来研究我的问题,因为我对编程非常陌生,非常感谢您为我提供的任何帮助或指导 概述。。。 我有一个简单的游戏,我正在尝试创建,它包括一个'球'精灵类,是从屏幕的左侧发射到右侧。创建“球”精灵的速度是随机的,每次“球”移动到屏幕右侧时,分数都会增加一分 问题。。。。 我遇到的问题是,当两个“球”几乎同时发射(有时是随机发射)时,它们通过屏幕的右侧,相隔不到一秒钟,当这种情况发生时,似乎只会在分数上增加2时增加1(因为有2个球通过了右侧) 下面是我的Ball launcher类的代码(使

感谢您抽出时间来研究我的问题,因为我对编程非常陌生,非常感谢您为我提供的任何帮助或指导

概述。。。 我有一个简单的游戏,我正在尝试创建,它包括一个'球'精灵类,是从屏幕的左侧发射到右侧。创建“球”精灵的速度是随机的,每次“球”移动到屏幕右侧时,分数都会增加一分

问题。。。。 我遇到的问题是,当两个“球”几乎同时发射(有时是随机发射)时,它们通过屏幕的右侧,相隔不到一秒钟,当这种情况发生时,似乎只会在分数上增加2时增加1(因为有2个球通过了右侧)

下面是我的Ball launcher类的代码(使用该类随机调用球)

如果您使用或使用过“Ray Wenderlichs”Learn Cocos2D,那么这部分内容看起来会很熟悉,因为在阅读了他的书之后,我尝试编辑他的代码来做我想做的事情(对我来说,阅读这本书后,这是学习的最佳方式,通过修改代码等等)

下面是我的“球”类的代码

下面是我的“GameplayLayer”类的代码

#导入“GamePlayLayer.h”
#导入“Ball.h”
#进口“BL.h”
@游戏层的实现
@综合代表;
-(无效)解除锁定{
代表=零;
[super dealoc];
}
-(作废)更新:(ccTime)deltaTime{
cArray*图形对象列表=
[sceneSpriteBatchNode子节点];
对于(GAMEOBJECTS列表中的GameCharacter*tempChar){
[tempChar updateStateWithDeltaTime:deltaTime和listOfGameObjects:listOfGameObjects];
}
GameCharacter*tempChar=(GameCharacter*)[sceneSpriteBatchNode
getChildByTag:kEnemyTypeBall];

如果([tempChar characterState]==kStateScore)我认为当屏幕上有多个球对象时,
GamePlayLayer
update
方法有时无法检测其中一个球的状态变化,因为球一进入
kStateScore
就会被移除。 如果您在移除球之前添加了一定的延迟,那么更新方法将拾取所有球中的更改,您的问题将得到解决

Ball.m
-(void)changeState:(CharacterStates)newState
函数中,修改状态kStateScore上的操作,如

action = [CCSequence actions:[CCDelayTime actionWithDuration:0.2],
                      [CCCallFunc actionWithTarget:self selector:@selector(removeSelf)],
                      nil];
试试这个,让我知道这是否适合你

编辑

上述解决方案最终会添加多个点,因为由于延迟,球将长时间保持kStateScore状态。为了解决此问题,我们可以引入一个新状态,称为kStateDead,并在添加点后将球状态更改为kStateDead。这将确保只添加一次点,并且我们可以放置负责移除处于死区状态的球。新代码如下所示:

鲍尔

case kStateScore:

            PLAYSOUNDEFFECT(SCORE);

            CCLOG(@“Ball Past Left Of Screen => Add 1 to Score");

            break;

case kStateDead:

        action = [CCSequence actions:
                      [CCCallFunc actionWithTarget:self selector:@selector(removeSelf)],
                      nil];

        default:
            CCLOG(@“Ball -> Unknown CharState %d",
                  characterState);

            break;
在你的游戏机里

if ([tempChar characterState] == kStateScore)  <==HERE I AM SEEING IF THE BALL HAS SCORED - THIS IS ALSO WHERE I THINK I MAY BE GOING WRONG SOMEHOW.
    {
        CCLOG(@"Add 1 Points To Score");

        [self addPoint];
        [tempChar changeState:kStateDead]; //change the state to dead after the point is added
        return;
     }

if([tempChar characterState]==kStateScore)早上好,Abhineet,首先感谢您的回复。我尝试使用您发布的解决方案,但由于延迟,我的gameplaylayer类中的方法保持真实的时间更长,因此它不仅增加了1分,还增加了3到6分。也正因为如此,我无法确定它是否有效(不知道刚刚加上的6分是因为这是这次的随机分数,还是因为它记录了两个球)。再次非常感谢您试图帮助我。@Robnoob对回复的延迟和错误的帖子表示歉意。我显然没有想清楚。但是,我已经更新了答案。让我知道这是否对您有效。谢谢。我也对回复的冗长表示歉意(最近没有多少空闲时间学习),使用了上面的解决方案,效果很好!非常感谢您在这方面的帮助!!@Robnoob很高兴我能提供帮助!:)
action = [CCSequence actions:[CCDelayTime actionWithDuration:0.2],
                      [CCCallFunc actionWithTarget:self selector:@selector(removeSelf)],
                      nil];
case kStateScore:

            PLAYSOUNDEFFECT(SCORE);

            CCLOG(@“Ball Past Left Of Screen => Add 1 to Score");

            break;

case kStateDead:

        action = [CCSequence actions:
                      [CCCallFunc actionWithTarget:self selector:@selector(removeSelf)],
                      nil];

        default:
            CCLOG(@“Ball -> Unknown CharState %d",
                  characterState);

            break;
if ([tempChar characterState] == kStateScore)  <==HERE I AM SEEING IF THE BALL HAS SCORED - THIS IS ALSO WHERE I THINK I MAY BE GOING WRONG SOMEHOW.
    {
        CCLOG(@"Add 1 Points To Score");

        [self addPoint];
        [tempChar changeState:kStateDead]; //change the state to dead after the point is added
        return;
     }