IOS SpriteKit碰撞检测:重置NSMutablearray对象的位置

时间:2015-01-06 22:20:56

标签: sprite-kit collision-detection

我尝试使用在屏幕左右两侧墙壁之间反弹的物体制作游戏,直到它们到达底部。

目前,我的工作didBeginContact方法如下所示:

- (void)didBeginContact:(SKPhysicsContact *)contact {
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (crabCategory | leftWallCategory)) {
    // figure out which crab in the array made the contact...
        for(HHCrab *object in crabs) {
            if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
                [object stop];
                [object moveRight];
            }
        } 
    } else if (collision == (crabCategory | rightWallCategory)) {
    // figure out which crab in the array made the contact...
        for(HHCrab *object in crabs) {
            if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
                [object stop];
                [object moveLeft];
            }
        }
    }

当我尝试添加其他声明时:

else if (collision == (crabCategory | bottomWallCategory)) {
    // figure out which crab in the array made the contact...
    for(HHCrab *object in crabs) {
        if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
            [object stop];
            [object resetPosition];
            [object moveLeft];
        }
    }
}

当螃蟹到达屏幕底部时重置螃蟹位置,螃蟹不会移动。在之前的question中,我意识到这可能是因为绘制螃蟹被物理模拟覆盖了。我们通过创建一个布尔值解决了这个问题,当螃蟹与底壁相交时,该布尔值将被打开和关闭,然后在didSimulatePhysics方法中重新定位螃蟹:

-(void)didSimulatePhysics{
    if(self.shouldResetPosition){
       self.player.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMaxY(self.frame)- _player.size.height-30);
        self.shouldResetPosition = NO;
    }
}  

虽然这适用于一只螃蟹,但现在我使用的NSMutable螃蟹数组各有一个唯一的名称,但事实并非如此。我尝试将布尔值移动到Crab类,因此每个螃蟹都具有该属性,但这并没有解决问题。

3 个答案:

答案 0 :(得分:1)

您需要对OOD(面向对象开发)概念进行一些研究。我建议买一本关于Objective-C编程的书来教授这些概念。

您正在创建自定义Crab对象的正确轨道上。使它成为UIView(或自定义基类的子类,但暂时忽略它)。然后,您可以创建一个“Arena”或“Scene”对象,作为蟹对象的容器。它将有一个可变数组,可以容纳你的蟹对象数组。

您可能想要概括您的Arena对象,以便它管理一系列抽象视图对象,这些对象知道如何绘制自己并拥有一些常见的动画设置方法。为所有自定义视图对象创建基类,然后使crab对象成为此自定义视图对象的子类。这样,如果您以后想要添加Fish对象,或Snail对象,甚至是Boat对象或Net对象等,您都可以这样做,而无需重新执行所有操作。

你可以使用UIView动画或核心动画让你的蟹对象自己动画,或者你可以使用计时器和基于帧的动画。使用其中一种内置动画方法,您将获得更流畅的动画和更好的性能。

您的控制代码会产生多个自定义视图对象(例如10个螃蟹,12个鱼,一个船,一个渔夫和一个网络),为它们配置位置和速度/行为,并将它们添加到竞技场对象中。 (竞技场可能会将它们添加到数组中以便跟踪它们。)然后,竞技场对象将使用基类的共享方法来管理这些对象。

答案 1 :(得分:0)

尝试使用对象。

可以使用这些方法创建对象CRAB类。

然后,对于每个螃蟹,创建一个CRAB类的实例并将它们添加到数组中以供参考。

基本上,你应该得到一组CRAB类。

玩得开心:)

答案 2 :(得分:0)

我会创建一个反映这个对象的类蟹。因此,该类将由若干函数和属性组成。然后你的应用程序可以保存一个列表或几个螃蟹的数组。此外,每只螃蟹的行为都相似。

相关问题