IOS 精灵套件碰撞检测:重置 NSMutable 对象数组的位置



我正在尝试制作一个游戏,其中包含在屏幕左右墙壁之间反弹的物体,直到它们到达底部。

目前,我的工作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];
        }
    }
}

当螃蟹到达屏幕底部时重置它们的位置,螃蟹不会移动。在之前的问题中,我意识到这可能是由于绘制螃蟹被物理模拟覆盖的事实。我们通过创建一个布尔值来解决这个问题,当螃蟹与底壁相交时,该布尔值将被打开和关闭,然后在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 类,因此每只螃蟹都有该属性,但这并没有解决问题。

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

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

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

您可以使用 UIView 动画或核心动画使螃蟹对象自行设置动画,也可以使用计时器和基于帧的动画。使用内置动画方法之一,您将获得更流畅的动画和更好的性能。

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

尝试使用对象。

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

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

基本上,你最终会得到一系列螃蟹类。

享受编码:)的乐趣

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

最新更新