访问其他层中的对象(cocos2d)

2024-03-20

我正在用操纵杆在一层中移动精灵。现在,根据最佳实践,操纵杆和精灵必须位于同一场景的不同层中。我已经设法将它们分开,但我现在完全陷入困境,完全不知道如何将操纵杆命令从一层传递到另一层?推荐的方法是什么?

Scene

  • Game Play Layer
    • Sprite
  • Game Control Layer
    • Joystick

当操纵操纵杆时,我需要将此信息传递给 GamePlayLayer 来控制精灵。


嗯,我得到了一本很棒的 Cocos2d 书,由 Rod Strougo 和 Ray Wenderlich 撰写,书名是“学习 Cocos2d”。在他们的书中,他们使用您的初始设置实现了一个游戏,其中实现了操纵杆等。 GamePlayLayer 包含 JoyStick 和英雄精灵。 (参见本书第 40 页)。

我不相信他们会在书中使用不好的做法,因为他们非常有才华!

...

话虽如此,如果您希望在不同的层上实现它们,我有可能的解决方案:

GameScene
|
|__>GameLayer
|
|__>ControlLayer

这就是你的基本设置。但是,直观地说,控制层的目的是什么?控制游戏层的内容!因此,我建议您在 ControlLayer 中保留对 GameLayer 的(弱)引用。这样,使用一个简单的方法:

@property (nonatomic, assign) CCSprite* hero;

您现在可以从控制层访问英雄了!

额外(如果需要):

//GameScene init:
- (id)init {
    ....
    gameLayer = [GameLayer node];
    controlLayer = [ControlLayer node];
    [controlLayer setGameLayerRef:gameLayer];
    ...
}

// Control layer:
@property (nonatomic, assign) GameLayer* gameLayerRef;

尽管我只是建议这样做,但我不会在我的游戏中使用它:)

我通常做的是:

使 GameScene 类成为“半单例”。 (我从 Itterheim 的“学习 iPhone 和 iPad 游戏开发”(又名游戏恐怖、Kobold2d 发行商...等)中学到了这种方法。

然后,在控制层内,我将调用 GameScene 对象:

[[GameScene sharedScene] doSomethingToTheGameLayer];

是的,gameScene 具有简单的方法,仅依赖于游戏层中控件需要更新的内容。


Edit:

实现半单例模式,正如 Itterheim 在他的书中所描述的那样。

但是,什么是半单例呢?

它具有单例模式的属性:您可以使用静态调用从任何地方访问对象实例。

[GameScene sharedScene];

然而,单例对象通常会在第一次创建后被保留,直到应用程序生命周期结束。在半单例模式中,情况并非如此。

一旦创建了实例,您就无法在销毁旧实例之前创建另一个实例,但是一旦您完成了该实例,你销毁它(dealloc)。必要时创建另一个。

回顾: 半单例:从中创建多个对象,但在任何给定时间只能创建一个。只有在摧毁旧的之后才能重新创建。

执行:

当然,就像处理任何单例类一样,首先声明一个与该类相同类型的静态变量:

//In GameScene.m
static GameScene* instance = nil;

@implementation

//Here we have the static method to access the instance:
+(GameScene*)sharedScene {
    //you must have created one before trying to access it "Globally".
    ///Typically, created where you transition the GameScene using CCDirector's replaceScene.
    NSAssert(instance != nil, @"GameScene not instantiated!!");
    return instance;
}

-(id)init {
    if((self = [super init])) {
        //Make sure you don't have another instance of the class created
        //NOTE: Possible race condition that I wouldn't worry about, since it should never happen.
        NSAssert(instance == nil, @"Another instance is already created!!");
        instance = self;

        ...
    }
    return self;
}

//Don't forget!! Dealloc!!
- (void)dealloc {
    //the only instance we had is dealloc'd! We are back to zero. Can create a new one later! :D
    instance = nil;
    [super dealloc];
}

Edit2:

那么,时间线:

CCScene* scene = [GameScene node];
[[CCDirector sharedDirector] replaceScene:scene];
...
[[GameScene sharedScene] doSomething];
...
[[CCDirector sharedDirector] replaceScene:otherScene];
//After the new scene replaces GameScene, dealloc will be called, implicitly. Making instance = nil;
instance = nil;
[super dealloc];
...
//Loop again
CCScene* scene = [GameScene node];
[[CCDirector sharedDirector] replaceScene:scene];
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问其他层中的对象(cocos2d) 的相关文章

  • cocos2d 计算给定起点、角度和距离的目的地点

    我想快点吧 Cocos2d 和 xcode 中的 2d 问题 I have CGPoint currPoint float lineLength float angle 现在 我需要找到距离 currPoint 角度为 lineLength
  • cocos2d中如何填充纹理?

    我有一个形状和纹理图像 shape png texture png 我想在cocos2d 中将形状绘制为texture png 图案 形状尺寸比纹理图像大得多 因此自动填充整个形状的纹理图案 我试图认识路 找不到 有人有办法解决这个问题吗
  • 通过游戏中心发送 NSString

    我想通过 Gamecenter 将 NSString 从另一台 iPhone iPad 发送到另一台 iPhone iPad 但它因 EXC BAD ACCESS 崩溃 在 h 文件中 typedef enum kMessageTypeRa
  • iOS 5 文档目录中存储和读取文件

    在我的游戏中 当完成一个关卡时 应用程序会将 1 存储在应用程序文档目录中的文件中 当游戏加载时 玩家只有在完成前一关后才能玩该关卡 当我通过 Xcode 在设备上测试游戏时 应用程序可以正常运行 并且只有完成上一个关卡后才能玩该关卡 但是
  • Cocos2d 肖像模式在 iPhone 上不工作

    我正在构建一个 cocos2d 游戏 它应该处于纵向模式 我将 RootViewController m 更改为纵向模式 无论是在模拟器上还是在我的 iPad 上 一切都工作正常 然而 当我在 iPhone 上运行游戏时 它会默认回到横向模
  • 如何检查设备是否有互联网连接:cocos-2d

    在我的一款 iPhone 应用程序中 我需要查明该设备是否有互联网连接 有人请帮忙吗 使用可达性类 if self checkInternetConnected NSLog Internet connected n BOOL checkIn
  • 如何使 cocos2d 精灵每秒缩放(以获得脉动效果)?

    我想让精灵每秒缩放一次 使其看起来像是鼓起来并脉动 我怎样才能做到这一点 由于之前的帖子包含语法错误 更准确地说 我发布了工作代码 CCSprite sprite create the sprite id scaleUpAction CCE
  • 将 cocos2d 视图添加到 UIView

    我已将 cocos2d 2 0 集成到现有的 iOS 项目中 并希望能够创建一个视图并将其作为子视图添加到现有视图中 cocos2d 设置代码应该放在哪里以及 cocos2d 视图如何在 UIView 中可见 我已关注雷 文德利希教程 ht
  • 调用插页式 iAd 只能运行一次

    我有 spritekit 游戏 每次游戏开始时都会预加载广告 UIViewController prepareInterstitialAds 游戏结束后 它应该显示广告 self view window rootViewController
  • 如何将 CCSprite 从一个父级转移到另一个父级?

    我有一个CCSprite called sprite那是一个孩子CCLayer called movingLayer它本身就是当前的子项CCLayer运行我的游戏逻辑 所以它是self在这种情况下 movingLayer以永远重复的动作在屏
  • Objective-C++ 导入 C++ 类失败,找不到 cassert

    因此 我想公开公开一个 Box2D C 指针 指向我的 cocos2d box2d 项目中的其他 Objective C 类 我在接口中声明了一个方法 getWorld 该方法引用 C 类 b2World 并导入 Box2D h 我的项目中
  • iOS 中的 Facebook 发帖错误

    在这里 我尝试使用以下代码向 Facebook 添加帖子 FBAppCall appCall FBDialogs presentShareDialogWithLink urlToShare name Title caption nil de
  • 使用 ccTouchesMoved 方法移动 CCCamera? (cocos2d、iPhone)

    所以我得到了这个工作 void ccTouchesMoved NSSet touches withEvent UIEvent event UITouch myTouch touches anyObject CGPoint location
  • 混合 C++ 和 Objective-C

    我使用 C 作为应用程序主干 使用 Objective C 作为 GUI 这很好 但是当谈到在 Objective C mm 文件 中将这些代码混合在一起时 我有几个问题 1 我可以将 STL 容器与 Objective C 或 Cocos
  • Xcode C++ 和 Objective-C 重构

    有没有办法refactorXcode 中的混合 C Objective C 代码 我正在使用 Cocos2D 和 Box2D 编写游戏 而 Box2D 是用 C 编写的 因此我编写的每个类都应该具有 mm 扩展名 因此当我尝试例如重命名变量
  • Box2d 自定义多边形和精灵不匹配

    我正在使用物理编辑器在 Box2d 中创建多边形 它生成多边形并在非视网膜显示器中工作正常 但在视网膜显示器中不起作用 我已附上两个显示器的屏幕截图 现在 当谈到视网膜显示器时 未设置多边形在汽车上方 这是该图像 这是我在项目中使用的代码
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行
  • Cocos2D中如何让物体对触摸做出反应?

    好吧 我开始更多地了解 Coco2D 但我有点沮丧 我发现的很多教程都是针对过时版本的代码 因此当我浏览并了解它们如何执行某些操作时 我无法将其翻译成我自己的程序 因为很多都发生了变化 话虽如此 我正在使用最新版本的 Coco2d 版本 0
  • 设置正确的 cocos2d 方向

    在我的 cocos2d 应用程序中 在我的应用程序委托的 applicationDidFinishLaunching 方法内 我通过 director setDeviceOrientation kCCDeviceOrientationPor
  • 如何正确使用CCSpriteFrameCache和CCSpriteBatchNode?

    我不明白当我将 CCSpriteFrameCache 或 CCSpriteBatchNode 添加到我的 cocos2d 应用程序时我到底做了什么 有人可以解释一下以下几点吗 如果你能解释一些的话会很有帮助 请根据你回答的问题在你的答案前写

随机推荐

  • React 中的 props.children 不能是无状态组件吗?

    我正在尝试在 React 中练习渲染道具模式 但出现了以下错误 this props children 不是一个函数 这是我的代码 import React from react import render from react dom c
  • 在小程序或 Google AppEngine 中托管 Java 编译器?

    在网上搜索我发现Javac编译器是用Java编写的 并且我还查看了Sun网站上的源代码 来源相当大 我无法取得任何进展 此外 Eclipse 项目内部嵌入了一个编译器 但谁能接触它的源代码 所以我想我应该向你提出几个问题 Java 编译器可
  • 写入自己的日志文件的 Firefox 扩展

    经过一整天的研究如何将浏览器中的内容写入本地文本文件 我正在考虑诸如带有日志文件的 Firefox 扩展之类的东西 有什么方法可以让我的分机写入我的分机 意味着 在我的扩展内有一个日志文件 有关信息 我正在为 Linux 平台进行开发 有关
  • 为 F# 记录值生成的 IntelliSense XML 不正确 (VS2013)

    Update 正如评论中指出的 这是一个错误 我有向微软报告了此事 https connect microsoft com VisualStudio feedback details 816006 incorrect intellisens
  • 在延迟表达式求值中,R Shiny 使用变量的更改值

    这是问题的简单演示 library shiny ui lt fluidPage textOutput Text1 textOutput Text2 server lt function input output for i in 1 2 i
  • 如何将 Nest.js 微服务拆分为单独的项目?

    假设我想创建一个简单的影院管理平台 它需要很少的微服务 movies cinemas payments etc 你会如何在 Nest js 中做到这一点 我不希望它们位于同一个大文件夹中 因为这感觉就像制作一个整体 我希望它们成为单独的 N
  • 无法包含 Microsoft.Security.Application?

    我不能包括微软 安全 应用程序 using Microsoft Security Application 给出这个错误 命名空间 Microsoft 中不存在类型或命名空间名称 Security 是否缺少程序集引用 是的 我点击了Bin g
  • Java 序列化库,无需无参数构造函数和 Serialized 实现

    java世界中是否有任何方法可以在不需要无参数构造函数和Serialized实现的情况下进行序列化 Look at XStream http xstream codehaus org JSX http jsx org or 谷歌协议缓冲区
  • AMF消息结构?

    Adobe s AMF 格式的文档 http opensource adobe com wiki download attachments 1114283 amf3 spec 05 05 08 pdf似乎并没有实际指定整个 AMF 消息的结
  • 连接4条信息并保存

    保存 编辑和加载信息 我想要加载的信息是我自己添加的 每行信息将包含 4 条信息 字符串 整数 字符串 整数 通过 4 个单独的编辑框和一个按钮 我会将这些信息添加到 数据库 中 不确定我是否需要数据库 或者是否可以通过 Tstringli
  • 无法使用 Robo3T 连接到 Mongo 副本集

    我在使用 RoboMongo 连接到 Mongo 集群时遇到问题 当我在指南针中使用相同的连接字符串时 它可以工作 但 Compass 社区版不像 Robomongo 那样灵活 无法连接到副本集 Employee UAT hhds6666
  • PHP DateTime::createFromFormat 返回错误的日期

    当尝试跑步时createFromFormat使用太平洋 奥克兰时区和格式字符串 F Y 尽管我提供了 2019 年 9 月 但返回的日期是 10 月 1 日 我尝试在 CLI 和 FPM 中的 PHP 7 3 9 和 7 2 22 上运行它
  • 为什么 WPF 吞咽 Window.Activated 的事件处理程序中引发的异常?

    简单的 WPF 应用程序 带有简单 空的内容Window其中我将事件处理程序连接到窗口Activated event public partial class MainWindow public MainWindow InitializeC
  • 如何从 Nexus 存储库请求工件的大小?

    我知道 Nexus 支持 REST 请求 您能告诉我如何根据 Nexus 从存储库请求某些工件的大小吗 谢谢 您有以下选项 使用工件内容 URI 的完整路径并添加参数describe info 例如 https repository son
  • 如何将要渲染的任意窗口重定向到内存中的后缓冲区?

    我正在尝试一个自行开发的应用程序托管框架 并且我想抽象输入 输出 以便我可以优雅地处理崩溃 Chrome 使用非常相似的模型 有什么方法可以获取任意窗口句柄 并说服它开始渲染到后缓冲区吗 或者我应该首先创建自己的窗口 然后将客户端应用程序重
  • 如何告诉 TypeScript 接口 T 比具有索引签名的类型 U 窄?

    我有一个函数可以验证 JSON 响应以确保它对应于给定的形状 以下是我的类型 定义了所有可能的 JSON 值 取自https github com microsoft TypeScript issues 1897 issuecomment
  • 如何更改操作栏上的文本

    目前它只显示应用程序的名称 我希望它显示自定义的内容并且对于我的应用程序中的每个屏幕都不同 例如 我的主屏幕可以在操作栏中显示 page1 而应用程序切换到的另一个活动可以在该屏幕操作栏中显示 page2 更新 最新的 ActionBar
  • Android 应用程序中的 VideoView 全屏

    我的应用程序中有一个视频视图 代码是这样的
  • 加载时将 Google 地图信息窗口居中

    我在将 InfoWindow 集中在页面加载时遇到问题 加载时 地图以标记为中心 这使 InfoWindow 离开屏幕 我正在使用地图容器的较短高度 现在 单击标记确实会将地图重新 置于信息窗口的中心 使其看起来与我想要的一模一样 在这种情
  • 访问其他层中的对象(cocos2d)

    我正在用操纵杆在一层中移动精灵 现在 根据最佳实践 操纵杆和精灵必须位于同一场景的不同层中 我已经设法将它们分开 但我现在完全陷入困境 完全不知道如何将操纵杆命令从一层传递到另一层 推荐的方法是什么 Scene Game Play Laye