【问题标题】:CALayers Multiple Layers Based Off Of One LayerCALayers 多层基于一层
【发布时间】:2011-08-07 22:14:10
【问题描述】:

我目前正在尝试使用基于 CALayers 的 Core Animation 制作 2D 游戏。我已经弄清楚了用户精灵层,但现在它归结为游戏对象。

对象(用户必须避免)将从屏幕顶部掉下,如果它们从未与用户接触,它们就会消失。然而,因为所有这些障碍都是一样的,所以我决定用一个单独的 .h 和 .m 来定义对象,并有几行代码让每个障碍“进入游戏”。

归根结底,我有两个问题: 1.我如何将每个障碍物作为CALayer“导入”到主视图中?为障碍物提供单独的文件是不是最好的处理方式,即使障碍物只是一张图片?

【问题讨论】:

  • 你看过 Cocos2D 吗?它是一款出色的 2D 开源游戏引擎,许多大牌游戏都在使用它。它确实简化了很多。
  • @Dancreek 我看过 Cocos2D,但它并没有给我留下深刻印象。我不想使用任何类型的第 3 方软件。
  • 好吧,我不知道你的最终产品到底是什么,但我不会太快把它写下来。阅读一些评论。如果没有必要,不要重新发明轮子。

标签: iphone core-animation calayer layer


【解决方案1】:

如果您已经弄清楚了用户精灵,那么您可能遇到过 addSublayer:,它在另一个图层上调用以将其添加到图层树中。从根本上说,要添加障碍物,您需要使用 -[CALayer layer] 为一个新层实例化一个新层,对其进行配置,然后 [rootLayer addSublayer:obstacle];

现在关于单独文件的问题:创建一个具有自己的标头和实现的新类是一个好主意。但是只需做一个类(意味着一个 .h/.m 对)来定义障碍物的工作方式,并通过发出 -[[Obstacle alloc] init] 调用来创建它的许多实例(确保在它们不存在时释放它们更长的可见性!)

“障碍物”如何导入和显示?您很可能会在 Obstacle 的 @interface{} 中放置一个变量,它是一个 CALayer 类型。 GameBoard(或非常简单的原型/应用程序的 ViewController)可以有一个方法 -addObstacle: 它接受一个障碍,询问它的层并将其添加到 rootLayer。

为了做到彻底,我可能错过了你的问题的要点,它更像是“我应该有一个障碍类,还是只是一个充满 CALayers 的障碍物阵列?”鉴于游戏的描述,您当然可以这样做。但是,一旦您想开始保留有关各个 Obstacle 实例的任何信息,最好让对象本身回答有关该信息的问题。我已经完成了大量的原型/测试应用程序,这些应用程序仅具有一系列层,因为尽管 CALayer 牢牢地位于 MVC 的视图范围内,但它通常包含我需要的所有模型信息:x、y、边界、颜色、内容等等。尽管为了可维护性,我必须重新编写大部分内容以实现真正的应用程序。

【讨论】:

  • 非常感谢您的回复,对我帮助很大。但是,由于我的问题几乎措辞含糊,我仍然需要帮助:如果我要为每个不同的障碍设置课程(因为障碍非常不同),编写代码的最佳/最短方法是什么障碍类?我可以只使用 initWithFrame 吗?
【解决方案2】:

我一直在开发一款 2D 塔防游戏,对此我有一个很好的解决方案。您想为您的障碍物创建一个对象类,并将它们存储在一个数组中。当障碍物到达屏幕底部时,它并没有被摧毁,而是被隐藏起来。当你想创造一个新的障碍物时,你首先要尝试回收旧的障碍物,然后再创造一个新的障碍物。我用它来处理数千个不同的 CALayer 对象而没有麻烦。

-(void)newObstacleAtLocation:(CGPoint)newPosition;
{
    //create the array if it doesn't already exist - could add this to your init
    if(!obstacles)
    {
        obstacles = [NSMutableArray array];
    }
    for(obstacle* anObstacle in obstacles)
    {
        //find the first hidden coin and use it
        if(anObstacle.hidden)
        {
            //reset the obstacles position to where you want the "new" obstacle
            obstacle.position = newPosition;
            obstacle.hidden = NO;
            return;
        }
    }
    //didn't find any unused obstacles - make a new one
    [obstacles addObject:[[[obstacle alloc]initWithSuperLayer:self.mapLayer] autorelease]];
}

【讨论】:

  • 感谢您的回复,我可以看到这将如何工作,但我收到一条错误消息,指出:“使用未声明的标识符'障碍'”。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多