2014-02-13 40 views
1

我正在制作一个iOS游戏,每次将地图上的建筑物放置在一张地图上,然后在转弯结束时根据建筑物类型处理经济放置以及它们所放置的地形的类型。将事件卡添加到模拟游戏Objective-C

我想添加一套活动卡片到游戏中。每回合将从一副牌中抽出一张事件牌,这可能会影响牌本身,建筑物或玩家迄今积累的资源总价值。

就类层次结构而言,我在顶部有一个包含Tilemap字典对象的Game对象,其中包含Tile对象。每个Tile对象都有一个Building对象,它可以是从一般Building对象继承的几个不同的类之一。

我很快就遇到了一个问题,我不能有建筑物的建筑物体内部的行动,我原计划,因为没有办法为它直接操纵tilemap的(比如将某个建筑物增加了更多的瓷砖比地图正常,或者显示它们是否具有某种资源)。所以我必须在Tilemap中放置一个switch语句和Building操作的方法。

现在我正在玩添加事件卡组。我想在Game类中有一个CardDeck类,然后CardDeck类将拥有一系列卡对象。游戏会告诉CardDeck绘制一张新牌并执行该牌的动作。

问题当然是我如何获得卡的动作来影响Tilemap或Game对象?由于封装,他们彼此不知道任何事情。现在第一个想法是有一个switch语句,并将这些方法放入Game类中,但似乎这只会让它们影响Game对象的变量,或者发送消息到Tilemap来操纵它。如果我这样做,反正每种类型的卡有不同的卡对象有什么意义?

我知道这是一个基本的编程问题,但我无法弄清楚我脑中的逻辑。我真的很感谢这个帮助!谢谢!

回答

1

我有很多方法可以做到这一点,哪一个最好完全取决于你的具体问题。我会建议两个:

第一个是完全跳出OOP。面向对象的编程完全是关于数据与功能的耦合,但在这种情况下,实际上没有任何数据可言:一个Card只是一个应用于你的游戏状态的函数。您可以制作blocksNSArray,然后选择一个随机执行的函数。

typedef void (^EventCard)(NSArray* buildings, Map* map); 

EventCard earthQuake = [^ void { 
    //show an alertview saying its an earthquake so the user knows what is going on 

    //apply earthquake to the buildings and map 

} copy]; 

这样做的缺点是,你可能最终会写很多重复的代码,并且不能轻松地添加新的事件卡片。

下一个解决方案与您现在拥有的类似,但更具可扩展性。您的Card类将成为一组词典,其键与您的建筑物和地图对象的属性相对应,或者是applyEventCardMethod中逻辑的触发器。您可以(也应该)从plist文件或JSON文本中读取这些字典,这些文本被打开并用于制作Card的实例。所以你Card.h看起来像这样

@interface Card : NSObject 

@property (strong) NSDictionary* attributesToAffect; 
@property (strong) NSArray* targetFilters; 

和地震的例子可能有@[@"all_buildings"] targetFilters和attributesToAffect将@{currHp: @-100},如果你的建筑类有一个currHp属性。 ApplyEventCard现在看起来是这样

-(void) applyEventCard 
{ 
    //pick a random Event card 

    //get all targets based on the "targets" key 

    //loop through targets 
      //loop through the rest of the keys 

      NSInteger previousValue = [[currBuilding valueForKey: currKey] integerValue]; 
      NSInteger valueToApply = eventCardToApply.attributeDict[currAttribute]; 
       [currBuilding setValue: previousValue - valueToApply forKey: currKey]; 
} 

这种方法的优点是,它是非常容易增加新的卡,并没有所需的代码。然而,你可能会严重限制你的牌的效果。如果你的很多卡需要某种类型的定制逻辑,那么可能没有办法避免一个怪异的开关语句。

+0

这非常有帮助。我很感激你为我输入了代码示例。它帮助了很多东西去点击!另一个想法是尝试Visitor模式,其中Map对象接受EventCards作为访问者。我想知道这是否可能? – bazola