【问题标题】:Create factory class by sending a "type"通过发送“类型”创建工厂类
【发布时间】:2011-06-10 04:57:34
【问题描述】:

我正在开发一个 cocos2d 游戏。它有几个从 CCSprite 派生的类 - 敌人、射弹等。对于这些子类中的每一个,它们都需要进一步区分,例如,敌人 1、敌人 2 等。我可以创建一个类,然后创建它的子类,可以通过 [Enemy1 敌人] 之类的东西创建,其中 + (id)enemy 创建了一个 Enemy 对象,然后对其进行自定义并返回它,但我想要做的是告诉 Enemy 类创建一个实例,然后给它我想要的属性(图像,生命值,可见等),然后返回。我想像这样的方法......

+ (id)enemyWithType:(int)aType
{
    Enemy *enemy = nil;
    switch (aType) {
        case 1:
            // set up the first enemy type
            [enemy initWithFile:@"enemy1.png"];
            [enemy setVisible:YES];
            [enemy setHitPoints:10];
            break;
        case 2:
            // set up the second type
            [enemy initWithFile:@"enemy2.png"];
            [enemy setVisible:NO];
            [enemy setHitPoints:5];
            break;
        default:
            break;
    }

我会通过调用来调用

[Enemy enemyWithType:1];

或者类似的。这是解决这个问题的正确方法吗?我需要它来为所有这些课程工作。在实践中,我的播放器会有一个像 projectileType 这样的属性,所以当我发射弹丸时,我会向 Projectile 类询问该类型之一。

【问题讨论】:

    标签: objective-c ios class cocos2d-iphone


    【解决方案1】:

    这是解决这个问题的正确方法吗?

    基本上,是的。它是工厂方法模式。您也可以使用来自 Enemy 的派生类,例如 Zombie 类、Dragon 类或类似的东西。它使代码干净。

    【讨论】:

    • 谢谢,@Kazuki - 不过我并不完全了解这里的内存管理。 Enemy *enemy = nil; 是否为我分配内存,以便我以后可以 init 实例?它似乎工作。既然我不是alloc'ing 它,我拥有它吗?我应该添加autorelease?
    • 我强烈推荐你阅读Memory Management Programming Guidefist。
    • 我已经读过了——并不是说我完全理解其中的所有内容。苹果提供了很多很好的例子,说明你什么时候拥有什么东西,什么时候不拥有,但我没有看到这一点。 Enemy *enemy = nil; 实际上是做什么的?是不是alloc? 我猜这会生成一个autoreleased 对象,但我不确定。
    • 我开始提出一个新问题来处理这个问题......谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多