如何检查sprite是否按特殊顺序命中

时间:2014-05-06 13:52:23

标签: cocos2d-iphone

我在屏幕上有3 0f 8个精灵,我希望读者按顺序点击: 首先触摸egges,然后是糖,最后是柠檬(如果正确地出现了金杯)

  • EggsSprite
  • SugarSprite
  • LemonSprite

我工作的功能,但我想知道是否有更简单的方法来维护和扩展到屏幕上的其他精灵(我有8个精灵,希望产生不同的“收件人”)

ccTouchesBegan我检测到精灵上的触摸

 if(CGRectContainsPoint(EggsSprite.boundingBox, location))
{
    EggsSprite_is_hit = YES;
    NSLog(@"EggsSprite_is_hit = YES");
}

if(CGRectContainsPoint(SugarSprite.boundingBox, location))
{
    SugarSprite_is_hit = YES;
    NSLog(@"RunCheckSugar");
    [self CheckSugar];
}

if(CGRectContainsPoint(LemonSprite.boundingBox, location))
{
      NSLog(@"RunCheckLemon");
    LemonSprite_is_hit = YES;
     [self CheckLemon];
}

运行

-(void)CheckLemon
{
NSLog(@"LemonSprite is hit");
if(MeringueUnlocked == YES)
   {
     NSLog(@"You made a merangue");
       Award.opacity=255;
   }
else  if(MeringueUnlocked == NO)
{
    NSLog(@"Incorrect order");
     EggsSprite_is_hit = NO;
     LemonSprite_is_hit = NO;
     SugarSprite_is_hit = NO;
    MeringueUnlocked = NO;
}
}

-(void)CheckSugar
{
if(SugarSprite_is_hit == YES && EggsSprite_is_hit== YES)
{
    NSLog(@"SugarSprite is hit");
    NSLog(@"And Egg Sprite is hit");
    SugarSprite_is_hit = NO;
    MeringueUnlocked = YES;
}

else if(SugarSprite_is_hit == YES && EggsSprite_is_hit== YES)
{
    NSLog(@"SugarSprite not hit ressetting all");
    EggsSprite_is_hit = NO;
    LemonSprite_is_hit = NO;
    SugarSprite_is_hit = NO;
    MeringueUnlocked = NO;
}
}

它似乎工作正常,但扩展是可怕的,我似乎无法找到任何关于触摸精灵的例子,所以任何psudo代码的想法将受到欢迎:)因为它的方法,我更加坚持,因为我我是编码的新手。

谢谢:) Ñ

1 个答案:

答案 0 :(得分:1)

创建精灵后,分配给他们的标记'应该命中它们的属性顺序:

EggsSprite.tag = 1;
SugarSprite.tag = 2;
LemonSprite.tag = 3;

然后创建一个实例变量来存储最后一个精灵命中的索引:

int _lastSpriteHitIndex;

以及序列中最后一个精灵的索引:

int _finalSpriteIndex;

将其值设置为init(或用于创建图层的任何方法):

_finalSpriteIndex = 3;

然后在你的触摸处理程序中:

// find sprite which was touched
// compare its tag with tag of last touched sprite
if (_lastSpriteHitIndex == touchedSprite.tag - 1) 
{
    // if it is next sprite in our planned order of sprites, 
    // store its tag as _lastSpriteHitIndex
    _lastSpriteHitIndex = touchedSprite.tag;

}
else
{
     // if it's wrong sprite, reset sequence
     _lastSpriteHitIndex = 0;
}

if (_lastSpriteHitIndex == _finalSpriteIndex)
{
    // Congrats! You hit sprites in correct order! 
}

基本上它是一个有限状态机,其中以正确的顺序击中精灵使机器进入下一状态,并且击中错误的精灵将机器重置为初始状态。 _lastSpriteHitIndex重复当前状态,_finalSpriteIndex代表最终状态。

如果您不想在错误的精灵命中时重置为初始状态,只需删除else子句 - 如果没有它,机器将在击中错误的精灵时不会前进。