【问题标题】:Singletons/Global Variables in iPhone game designiPhone游戏设计中的单例/全局变量
【发布时间】:2012-01-24 00:44:55
【问题描述】:

我正在创建一个角色在不同视图之间移动的 iPhone 游戏,因此每个视图本身本质上都是一个新游戏。但是现在我想创造健康,所以如果健康在一个视图中下降到 5 hp,那么当他们改变到不同的视图时,健康仍然是 5。我做了一些研究,听起来我需要的是单例或全局变量。但我所看到的一切对我来说毫无意义。我的任何一个应用程序委托中都没有任何内容,并且我没有使用任何框架,如 cocos2d 或 OpenGLES。发布代码现在似乎不起作用,所以如果您能告诉我您需要查看哪些代码来帮助您回答我的问题。

【问题讨论】:

    标签: ios iphone variables global


    【解决方案1】:

    我做了一些研究,听起来我需要的是单例或全局变量。

    您需要在视图控制器之间共享您的角色数据。单例是共享数据的一种方式;它在概念上非常简单,但通常会带来不幸的后果。有关其中一些后果的讨论,请参阅What is so bad about singletons?。有关其他一些方法,请参阅 Alternatives to Singletons

    如果您确实决定使用单例(不推荐),则应谨慎选择该对象的角色。例如,您的第一个想法可能是创建一个代表玩家或角色的单例。但是,这意味着您的游戏中只能有一个玩家或角色。更好的选择是创建一个玩家管理器,您可以使用它来访问当前玩家。

    更好的选择是放弃单例并为每个视图控制器提供playergameController 属性(假设您有一些负责整个游戏的对象。游戏控制器将启动每个新的“板” " 通过实例化相应的视图控制器,将gameController 属性设置为自身,并将player 属性设置为当前播放器对象。这样,视图控制器无需查看自身外部即可了解播放器. 当它的游戏部分完成时,它可以使用它的gameController 属性向游戏控制器发送一条消息,上面写着:“我完成了,你可以继续下一个棋盘”或任何合适的内容。

    【讨论】:

    • 这个答案让我大吃一惊。您认为我可以通过电子邮件将项目发送给您,以便您查看代码吗?因为我不完全明白你在说什么
    • @WillYoumans 感谢您的信任投票。 ;-) 我会通过电子邮件传递,但是一旦你理解了这个想法,我相信你将能够实现它。您可能会查看 herehere 了解更多信息,以及阅读 MVC。您肯定不是第一个想知道如何在他们的应用程序的不同部分之间共享数据的人——您会在这里找到很多关于这个主题的问题。
    【解决方案2】:

    从技术上讲,可以从应用中的任何位置访问任何内容,因为我们可以像这样访问应用委托:

    #import "AppDelegate.h"
    #define kAppDelegate (AppDelegate*)[[UIApplication sharedApplication] delegate]
    

    所以如果你像这样在应用委托中定义一个属性:

    @property (assign) CGFloat health;
    

    你可以这样访问它...

    CGFloat health = [kAppDelegate health];
    

    【讨论】:

    • 所以如果我这样做,我可以进入单独的视图控制器中的 viewDidLoad 方法并说“health = 10;”
    • [kAppDelegate setHealth:xx.xx];我认为您应该花一天时间了解对象的工作原理,然后再继续
    • 有什么教程可以推荐吗?>
    • 这是一个非常糟糕的建议。使用此解决方案,您将使您编写的每个类都依赖于您的 appdelegate。如果您决定移植到另一个平台(例如,tvOS、OS X),这会给您带来很多痛苦。这是一个在 SO 上不断出现的示例,但它表明结构非常糟糕,应该避免。例如,请参阅以下关于如何避免僵化和难以维护的代码的讨论:stackoverflow.com/questions/18673990/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多