【问题标题】:IOS SpriteKit Colision Detection: Resetting Position of NSMutable array of ObjectsIOS SpriteKit碰撞检测:重置对象NSMutablearray的位置
【发布时间】:2015-01-06 22:20:55
【问题描述】:

我正在尝试制作一个游戏,其中的对象在屏幕的左右壁之间弹跳直到它们到达底部。

目前,我的工作 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 类,因此每只螃蟹都有该属性,但这并没有解决问题。

【问题讨论】:

  • 是的,你需要了解什么是“对象”。
  • 如果您刚刚开始,那么在 Stack Overflow 上提出此类广泛的问题并不是您需要的地方。您应该找到一本好书或一系列在线教程。看看Good resources for learning ObjC。 Big Nerd Ranch 的书籍非常好,很多人喜欢 iTunes U 上的斯坦福 iOS 课程。祝你好运!
  • @Sangony 如果您能提供帮助,我将不胜感激 :)

标签: sprite-kit collision-detection


【解决方案1】:

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

您在创建自定义 Crab 对象时处于正确的轨道上。使其成为 UIView 的子类(或自定义基类,但暂时忽略它)。然后,您可以创建一个“竞技场”或“场景”对象,作为螃蟹对象的容器。它会有一个可变数组来保存你的螃蟹对象数组。

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

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

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

【讨论】:

    【解决方案2】:

    尝试使用对象。

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

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

    基本上,你最终会得到一个 CRAB 类的数组。

    玩得开心编码:)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多