2011-08-07 57 views
2

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

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

底线,我有两个问题: 1.我如何将每个障碍物作为CALayer导入主视图?即使障碍物只是一个图像,是否有障碍物的单独文件是做事的最佳方式?

+0

你看过Cocos2D吗?它是很多大牌游戏使用的一款优秀的2D开源游戏引擎。这真的简化了很多。 – Dancreek

+0

@Dancreek我曾看过Cocos2D,但它并没有让我印象深刻。我不想使用任何第三方软件。 –

+0

嗯,我不确切知道你的最终产品是什么,但我不会写得太快。阅读一些评论。如果不需要,不要重新发明轮子。 – Dancreek

回答

2

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

现在为您的问题单独的文件:创建一个新的类与它自己的头和实现是一个好主意。但是只要做一个类(意思是一个.h/.m对)来定义Obstacle的工作方式,并通过发出 - [[Obstacle alloc] init]调用创建它的许多实例(确保在它们不是更长的可见度!)

“障碍物”如何导入并可见?你很可能会在一个CALayer类型的Obstacle的@interface {}中放置一个变量。 GameBoard(或者非常简单的原型/应用程序的ViewController)可以有一个方法-addObstacle:它采用Obstacle,要求它为它的图层并将其添加到rootLayer。

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

+0

非常感谢你的回应,它对我非常有帮助。然而,由于我几乎是一个措辞不清,含糊不清的问题,我仍然需要帮助:如果我为每个不同的障碍设置了类(因为障碍是非常不同的),那么编写代码的最佳/最短的方式是什么?障碍课程?我可以使用initWithFrame吗? –

1

我一直在研究2D塔防游戏,并有一个很好的解决方案。你想为你的障碍制作一个对象类,并将它们存储在一个数组中。当障碍物进入屏幕底部时,它不会被破坏,而只是隐藏起来。当你想创建一个新的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]]; 
} 
+0

感谢您的回应,我可以看到这将如何工作,但我收到一条错误消息,指出:“使用未声明的标识符'障碍'”。我错过了什么吗? –

相关问题