【问题标题】:in objective-c initializing an object and giving it an instance name在objective-c中初始化一个对象并给它一个实例名
【发布时间】:2010-12-03 01:19:22
【问题描述】:

在 cocos2d-iphone 中我有一个名为 GameScene 的 CCLayer 类

我想从另一个类中使用这个类,但是我不知道 GameScene 类的实例的名称

我如下初始化了一个GameScene类的实例

  -(id) init {
        if ((self = [super init])) {

但是这不会给我实例的名称

我在文档中读到可以使用名为 initWithName 的方法,因此我尝试了类似的方法,但它不起作用,它给了我警告:

       In function '-[GameScene init]':
       warning: 'CCLayer' may not respond to '-initWithName:'

我试过的代码是

  -(id) init {
       if ((self = [super initWithName:"gamescene"])) {

我在游戏中只需要这个类的一个实例,但我无法捕获该实例的处理程序,以便我可以从其他类中使用它?

任何想法

非常感谢


更新:

你好

我将更新代码,让您知道我已经尝试过您的解决方案,但它似乎还没有工作

在 MyAppDelegate.h 我有这行代码:

首先我定义了应用程序委托以与其他类共享它

MyAppDelegate.h

    #define AD  (MyAppDelegate *)[[UIApplication sharedApplication] delegate]

在 MyAppDelegate.m 我有以下代码:

gs  = [[GameScene alloc] init];//this is the gamescene
sc = [gs scene]; //this calls the method -(id)(scene)
[[CCDirector sharedDirector] runWithScene: sc]; //runwithscene

现在当我尝试在其他类中使用 gs 时——例如 player.m 类——

播放器.m

GameScene* gs = [AD gs]; //retrieving the instance from appdelegate
[gs updateScoreByAmount:5];/calling the method "updateScoreByAmount"

结果,猜猜会发生什么?

程序运行没有错误,但 gs 实例似乎与 appdelegate 运行的不同,因为此方法“updateScoreByAmount”不会影响 appdelegate 中的 runWithScene 运行的场景

有什么想法吗?

非常感谢所有尝试提供帮助的人

【问题讨论】:

  • 这是一个非常令人困惑的问题。对象本身没有名称。很难确定您正在尝试做什么以及您在做这件事时遇到了什么样的麻烦。
  • 试试if ((self = [super initWithName:@"gamescene"]))
  • @Ryan,我只是想从另一个类访问游戏场景类的方法?
  • @vikingosegundo:不幸的是,这不起作用,谢谢
  • 如果您在创建对象后对如何引用它感到困惑,您应该参考下面 darren 的回答。 Objective-C 与所有其他基于 C 的语言一样工作,因为对象不是通过实例化时给出的固有名称访问的,而是通过对对象的变量引用,如 darren 的示例。

标签: objective-c cocoa oop cocos2d-iphone


【解决方案1】:

如果我的理解正确,您需要引用 GameScene 类的实例吗?如果是这种情况,则取决于对象的创建方式。您可能正在从某个控制器类创建实例,它看起来像:

GameScene *gameScene = [[GameScene alloc] init];

在这里,gameScene 将是对您需要的实例的引用。

【讨论】:

  • 我不知道实例在哪里创建,因为这是cocos2d模板,唯一提到GameScene的地方是在app-delegate中,就是这一行[[CCDirector sharedDirector] runWithScene: [GameScene scene] ];
  • 就是这样。要获得参考,您将拥有类似 id myObj = [GameScene scene] 的内容。在您的代码中,您将 [GameScene scene] 作为其他方法的参数。如果你想引用它,你需要将它存储在一个变量中(在本例中为 myObj)。
  • 这就是我无法将其存储在变量中的问题????我正在考虑使用单例,但我必须先阅读更多相关信息,谢谢
  • ahmed,行 [GameScene scene] 正在返回一个自动释放的游戏场景指针,您可以保留它,就像您调用 [NSString stringWithString:@"Hello"] 并将其保存在保留指针中一样.在这种情况下,您可以在应用程序委托中创建一个变量来保存您的游戏场景。
  • @slycrel:谢谢,我刚刚更新了问题,请看一下
【解决方案2】:

艾哈迈德,

您可以执行以下操作来访问它,而不是存储指向顶级场景的指针:

GameScene* myScene = (GameScene*)[[CCDirector sharedDirector] runningScene];

CCDirector是一个单例,它知道自己当前运行的是什么场景,所以你不需要保留指向它的指针,你可以在需要的时候使用上面的方式来获取它。

因为 GameScene 是 CCScene 的子对象,所以您正在运行的场景将成为您的 GameScene 对象。

希望对您有所帮助。

【讨论】:

  • 谢谢,我想要的是分享“GameScene”类的实例而不是“CCScene”的实例,但你的代码应该在其他情况下帮助我谢谢
  • ahmed,GameScene 是 CCScene 的孩子,对吗?我将更新上面的代码以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多