Sprite kit 围绕板精灵套件Xcode移动几个球

Sprite kit 围绕板精灵套件Xcode移动几个球,sprite-kit,cmmotionmanager,Sprite Kit,Cmmotionmanager,我有一个小应用程序,我有几个精灵“球”,可以使用MotionManager.gravity在棋盘上移动。 我有一个代码,当其中一个球碰到边缘时,停在边缘。另外,如果任何一个球到达角落,它就会停在角落里。我还编写了代码,其中如果两个或三个球位于任意一条边上,并且彼此接触(它们启用了碰撞检测),它们将停止,并保持它们相对于另一个球的相对位置 以下是我的代码: //这将启用motionManager并设置重力值 self.motionManager = [[CMMotionManager alloc]

我有一个小应用程序,我有几个精灵“球”,可以使用MotionManager.gravity在棋盘上移动。
我有一个代码,当其中一个球碰到边缘时,停在边缘。另外,如果任何一个球到达角落,它就会停在角落里。我还编写了代码,其中如果两个或三个球位于任意一条边上,并且彼此接触(它们启用了碰撞检测),它们将停止,并保持它们相对于另一个球的相对位置

以下是我的代码:

//这将启用motionManager并设置重力值

self.motionManager = [[CMMotionManager alloc] init];
    self.motionManager.deviceMotionUpdateInterval = 0.005f;
    self.motionQueue = [[NSOperationQueue alloc] init];
    self.motionQueue.name = [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@".motion"];
    self.updatePosition = NO;
    [self.motionManager startDeviceMotionUpdatesToQueue:self.motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) {
        @synchronized(self) {
            NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

            [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

            [formatter setMaximumFractionDigits:2];

            [formatter setRoundingMode: NSNumberFormatterRoundUp];
            {
                _numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:motion.gravity.x / 15.0 *200]];
                _numberStringy = [formatter stringFromNumber:[NSNumber numberWithFloat:motion.gravity.y / 15.0 *200]];
                n = [_numberString intValue];
                 y = [_numberStringy intValue];
             }
            self.gravity = motion.gravity;
            self.updatePosition = YES;
        }
    }];
    [self startDisplayLink];
//这显示了我如何在边缘阻止球

- (void)handleDisplayLink:(CADisplayLink *)displayLink
{


    @synchronized(self) {
        if (!self.updatePosition)
            return;

        self.ball.position = CGPointMake(self.ball.position.x + (n*.99), self.ball.position.y + (y*.99));
        self.ball2.position = CGPointMake(self.ball2.position.x + (n*.98), self.ball2.position.y +(y*.98));
        self.ball3.position = CGPointMake(self.ball3.position.x + n, self.ball3.position.y + y);

        if (ball.position.x <=340) {
            ball.position = CGPointMake(340, ball.position.y);
        }

        if (ball.position.x >=684) {
            ball.position = CGPointMake(684, ball.position.y);
        }
        if (ball.position.y <=148) {
            ball.position = CGPointMake( ball.position.x,148);
        }
        if (ball.position.y >=620) {
            ball.position = CGPointMake(ball.position.x,620);
        }
-(无效)handleDisplayLink:(CADisplayLink*)displayLink
{
@同步(自){
如果(!self.updatePosition)
返回;
self.ball.position=CGPointMake(self.ball.position.x+(n*.99),self.ball.position.y+(y*.99));
self.ball2.position=CGPointMake(self.ball2.position.x+(n*.98),self.ball2.position.y+(y*.98));
self.ball3.position=CGPointMake(self.ball3.position.x+n,self.ball3.position.y+y);
if(球位置x=684){
ball.position=CGPointMake(684,ball.position.y);
}
如果(球位置y=620){
ball.position=CGPointMake(ball.position.x,620);
}
//这使它停在角落里

if ( ball.position.x >=684 && ball.position.y <=148 ) {
            ball.position = CGPointMake(684, 148);
        }
        if ( ball.position.x >=684 && ball.position.y >=620 ) {
            ball.position = CGPointMake(684, 620);
        }
        if ( ball.position.x <=340 && ball.position.y <=148 ) {
            ball.position = CGPointMake(340, 148);
        }
        if ( ball.position.x <=340 && ball.position.y >=620 ) {
            ball.position = CGPointMake(340, 620);
        }
if(ball.position.x>=684&&ball.position.y=684&&ball.position.y>=620){
ball.position=CGPointMake(684620);
}

如果(ball.position.x如果场景中有多个节点,那么为每个节点创建一个属性将变得单调而不切实际。一个好的解决方案是创建每个节点并将其添加到一个数组中。该数组将允许您保留对它的引用。重要的是创建具有自己唯一名称的每个节点。您可以这样做:通过创建计数器属性来初始化

@property (nonatomic) int myCounter;
然后,在创建节点时,按如下方式设置节点的名称属性:

myCounter++;
myNode.name = [NSString stringWithFormat:@"myNode-%i",myCounter];
[self.myArray addObject:myNode];
完全创建节点后,将其添加到NSMutableArray,如下所示:

myCounter++;
myNode.name = [NSString stringWithFormat:@"myNode-%i",myCounter];
[self.myArray addObject:myNode];
可以根据需要向阵列中添加任意数量的节点

要通过数组进行枚举,可以执行以下操作:

for (SKSpriteNode *object in myArray) {
    // let's look for a node with the name of myNode-2
    if([myNode.name isEqualToString:@"myNode-2"]) {
        NSLog(@"Found it");
    }
}

下面是一个示例,用于枚举数组以检查每个节点的位置,并根据IF语句将其速度设置为零:

for (SKSpriteNode *object in myArray) {
    if((object.position.x >= 300) && (object.position.y >= 300)) {
        object.physicsBody.velocity = CGVectorMake(0, 0);
    }
}

请记住,因为要将数组中的对象存储为SKSpriteNode,并使用SKSpriteNode枚举数组,所以您可以访问所有相应的属性,如速度、位置、名称等。

如果场景中有许多节点,则为每个节点创建一个属性将变得单调而不切实际e、 一个好的解决方案是创建每个节点并将其添加到数组中。该数组将允许您保留对它的引用。重要的是使用其自己的唯一名称创建每个节点。您可以通过创建计数器属性来做到这一点

@property (nonatomic) int myCounter;
然后,在创建节点时,按如下方式设置节点的名称属性:

myCounter++;
myNode.name = [NSString stringWithFormat:@"myNode-%i",myCounter];
[self.myArray addObject:myNode];
完全创建节点后,将其添加到NSMutableArray,如下所示:

myCounter++;
myNode.name = [NSString stringWithFormat:@"myNode-%i",myCounter];
[self.myArray addObject:myNode];
可以根据需要向阵列中添加任意数量的节点

要通过数组进行枚举,可以执行以下操作:

for (SKSpriteNode *object in myArray) {
    // let's look for a node with the name of myNode-2
    if([myNode.name isEqualToString:@"myNode-2"]) {
        NSLog(@"Found it");
    }
}

下面是一个示例,用于枚举数组以检查每个节点的位置,并根据IF语句将其速度设置为零:

for (SKSpriteNode *object in myArray) {
    if((object.position.x >= 300) && (object.position.y >= 300)) {
        object.physicsBody.velocity = CGVectorMake(0, 0);
    }
}

请记住,因为您将数组中的对象存储为SKSpriteNode并使用SKSpriteNode枚举数组,所以您可以访问所有相应的属性,如速度、位置、名称等。

是否为每个球创建变量/属性?不确定您的意思。我不这样认为。每个球都是指定的精灵例如,ball、ball2、ball3等在.h文件中生成,并在.m中合成。每一个都通过将motionManager.gravity值添加到其x和y来移动。然后,如上图所示,当每个球占据一个空间时,会发生一些事情。您能给我看一下或给我举个例子看一下吗。@property(非原子,强)SKSpriteNode*ball;是属性。您是否为每个球创建了一个变量/属性?不确定您的意思。我不这么认为。每个球都是一个指定的精灵,如ball、ball2、ball3等,在.h文件中创建,并在.m中合成。每个球都通过将motionManager.gravity值添加到其x和y中来移动。然后,如上图所示,每个球都发生了请给我一个空间,让我看看发生了什么。你能给我看一个例子吗。@property(非原子,强)SKSpriteNode*ball;是属性。我看不出这有什么帮助。我想对处于特定位置的任何球节点执行此操作,它将处于该位置。对于处于特定位置的任何球节点,当另一个位置被填充时,它将具有该位置。对于处于第三位置的任何第三个球节点,而其他两个球节点处于tho位置se位置第三个球将位于该位置。以此类推。我确信我很密集,但我不知道这将如何实现。@user1114881-给我一个具体的例子,说明你正在尝试做什么。你的问题,以当前格式,有太多你想做的事情。好的,谢谢你的帮助/耐心!我有四个球节点在b中滚动每一个球都会到达盒子的边缘,然后停下来(当=到x或y位置时,我有球节点,它们停在该位置。这没关系,但当所有四个球都在一侧对齐并向下滚动到一个角时,第一个球停在角上,第二个球停在角上,因为碰撞检测,但当第三个和第四个球与前面的球碰撞时,角上的球超过了第四个球。)e角。所以我告诉每个球在每个可能的配置的相对位置停止。希望我能用一些tweeking显示屏幕快照,我得到了这个来做我需要的。非常感谢关于变量的信息。只剩下一个问题。我看不出这有什么帮助。我想对处于特定位置的球节点这样做该位置。对于规范中的任何球节点