Sprite kit IOS SpriteKit冲突检测:重置可变对象数组的位置

Sprite kit IOS SpriteKit冲突检测:重置可变对象数组的位置,sprite-kit,collision-detection,Sprite Kit,Collision Detection,我正在尝试制作一个游戏,游戏中的物体会在屏幕的左右两侧墙壁之间反弹,直到到达底部 目前,我的didBeginContact工作方法如下: - (void)didBeginContact:(SKPhysicsContact *)contact { uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); if (collision == (crabCategory |

我正在尝试制作一个游戏,游戏中的物体会在屏幕的左右两侧墙壁之间反弹,直到到达底部

目前,我的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;
    }
}  
虽然这只适用于一个crab,但现在我使用的是一个NSMutable的crab数组,每个crab都有一个唯一的名称,所以它不适用。我尝试将布尔值移动到Crab类,这样每个Crab都有该属性,但这并没有解决问题。

尝试使用对象

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

然后,为每个crab创建crab类的一个实例,并将它们添加到数组中以供参考

基本上,您将得到一个CRAB类数组


享受编码的乐趣:)

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

创建自定义Crab对象是正确的。使其成为UIView(或自定义基类)的子类,但暂时忽略它。然后,您可以创建一个“竞技场”或“场景”对象,作为crab对象的容器。它将有一个可变数组,用于保存crab对象数组

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

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


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

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

是的,你需要了解“对象”是什么。如果你刚刚开始,在堆栈溢出上问这样广泛的问题不是你需要去的地方。你应该找到一本好书或一系列在线教程。看一看。《大书呆子牧场》的书非常好,很多人都喜欢iTunes U上的斯坦福iOS课程。祝你好运@Sangony如果你能帮忙,我将非常感激:)