我有一个物体(球)与地面接触:该球的弹力很强,与地面的接触可能超过7次。
我利用categoryBitMask和contactTestBitMask并在-(void)didBeginContact:(SKPhysicsContact *)contact
中很好地设置了所有内容。
我创建了一个属性SKAction来处理声音效果,并为该 Action 分配了一个音频文件:
self.sfxBounce1 = [SKAction playSoundFileNamed:@"bounce1.caf" waitForCompletion:NO];
我在didBeginContact中调用此sfxBounce1。关键是一切都很好。除了一个问题是我的球会弹跳很多外,但出于个人原因,我需要auddio / SKAction在球接触地面3次后停止播放。
在游戏中,球仍在3次跳动后反弹,只是我需要声音才能停止比赛。
但是,因为代码在didBeginContact方法的IF语句中,所以音频在每次与地面接触后都会继续播放。我在编程方面仍然很绿,尤其是使用Objective-C时。
下面是一些代码
-(void)didBeginContact:(SKPhysicsContact *)contact
{
if ((firstBody.categoryBitMask == ballCategory) && (secondBody.categoryBitMask == groundCategory)) //Ball & Ground contact
{
int random = arc4random() %6; //Random # generator of 7 possibilites.
switch (random) //Generated # represents a case, which in turn initiates a bounce sound upon contact.
{
case 0:
[self runAction:self.sfxBounce1];
break;
case 1:
[self runAction:self.sfxBounce2];
break;
case 2:
[self runAction:self.sfxBounce3];
break;
case 3:
[self runAction:self.sfxBounce4];
break;
case 4:
[self runAction:self.sfxBounce5];
break;
case 5:
[self runAction:self.sfxBounce6];
break;
case 6:
[self runAction:self.sfxBounce7];
break;
}
[self deleteNode];
}
我不知道在6种情况下(在[self runAction:self.sfxBounce1];&break;之间)应该键入什么代码,这会在经过一定数量的弹跳/接触地面后停止 Action 。
最佳答案
在@interface的顶部创建一个int,您可以在整个代码中进行引用:
property (nonatomic) int bounceCount;
这是didBeginContact的更新版本:
-(void)didBeginContact:(SKPhysicsContact *)contact
{
if ((firstBody.categoryBitMask == ballCategory) && (secondBody.categoryBitMask == groundCategory)) //Ball & Ground contact
{
self.bounceCount++;
if(self.bounceCount>3)
return;
//Your Code
}
}
关于objective-c - Sprite Kit的接触计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26511046/