基于一层的CALayers多层

时间:2011-08-07 22:14:10

标签: iphone core-animation calayer layer

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

对象(用户必须避免)将从屏幕顶部掉落,如果他们从未与用户联系,则会消失。但是,因为所有这些障碍都是一样的,我决定有一个单独的.h和.m定义对象,并有几行代码使每个障碍“进入游戏”。

最重要的是,我有两个问题: 1.我如何将每个障碍物作为CALayer“导入”主视图?虽然障碍物只是一个图像,但是为障碍物提供单独的文件是最好的做法吗?

2 个答案:

答案 0 :(得分:2)

如果您已经找到了用户精灵,您可能会遇到addSublayer:,它会在另一个图层上调用,以将其添加到图层树中。从根本上说,要添加障碍,需要为 - [CALayer图层]实例化一个新图层,配置它,并[rootLayer addSublayer:obstacle];

现在提出有关单独文件的问题:使用自己的标题和实现创建一个新类是一个好主意。但是只需要一个类(意思是一个.h / .m对)来定义一个障碍如何工作,并通过发出 - [[Obstacle alloc] init]调用来创建它的许多实例(确保在它们为no时释放它们)更长的可见!)

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

在试图彻底的时候,我可能已经错过了你的问题的主旨,这更像是一句话:“我应该有一个障碍课程,还是只有一个充满CALayers的障碍阵列?”鉴于游戏的描述,你当然可以这样做。但是,只要您想开始保留有关各个障碍物实例的任何信息,您最好让对象本身回答有关该信息的问题。我已经完成了大量的原型/测试应用程序,它们只有一个层数组,因为虽然CALayer坚定地处于MVC的View范围内,但它通常包含我需要的所有模型信息:x,y,边界,颜色,内容等等。我变成一个真正的应用程序虽然必须重新编写大部分可维护性。

答案 1 :(得分:1)

我一直致力于2D塔防游戏并且有一个非常好的解决方案。您想为障碍物创建一个对象类,并将它们存储在一个数组中。当障碍物到达屏幕的底部时,它不会被破坏而只是隐藏。当您想要创建一个新的obstancle时,首先尝试在创建新的obstan之前回收旧的obstancle。我使用它来处理数以千计的不同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]];
}