我在屏幕上有3 0f 8个精灵,我希望读者按顺序点击: 首先触摸egges,然后是糖,最后是柠檬(如果正确地出现了金杯)
我工作的功能,但我想知道是否有更简单的方法来维护和扩展到屏幕上的其他精灵(我有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代码的想法将受到欢迎:)因为它的方法,我更加坚持,因为我我是编码的新手。
谢谢:) Ñ
答案 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
子句 - 如果没有它,机器将在击中错误的精灵时不会前进。