访问其他层中的对象(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 中做到这一点 首先 一个类变量 CGFloat gameTime 然后在你的类中初始化 self scheduleUpd
  • 如果横幅移动则 iAd 横幅不可点击

    我有一个在 Cocos2d 应用程序中运行的 iAd 横幅 以下是我为展示广告而制作的 CCLayer 子类的代码 在 DidLoad 上 添加变得可见 并且底部菜单向上滑动以进行补偿 id init if self super init
  • Cocos2d EXC_BAD_ACCESS

    我是 cocos2d 的新手 突然得到了这个 EXC BAD ACCESS 我做了一个新的获胜菜单 但出现了错误 我认为错误是因为我调用了一个已释放的对象 但我没有释放任何东西 我的调试控制台没有错误 这很奇怪 这是我的 Level 1 m
  • Cocos2d中用手指旋转精灵

    我需要帮助用手指计算精灵的旋转 精灵旋转得很好 但在我手指第一次触摸时 它不知何故自行旋转了几度 此外 只有当手指围绕精灵中心旋转时 旋转才起作用 我正在尝试模拟自行车车轮 并有一个齿轮精灵和一个踏板精灵作为齿轮精灵的子级 我希望当我触摸踏
  • Cocos2d iPhone非矩形精灵触摸检测

    有一个在精灵中包含三角形图形的项目 我将这些精灵排列在网格中 以便它们的矩形全部重叠 当精灵被触摸时 它们的 z 顺序 由我 被更改 以将它们放在 zOrder 的顶部 我使用的是 Cocos 0 8 1 和触摸调度程序方法 我可以进行触摸
  • cocos2d 计算给定起点、角度和距离的目的地点

    我想快点吧 Cocos2d 和 xcode 中的 2d 问题 I have CGPoint currPoint float lineLength float angle 现在 我需要找到距离 currPoint 角度为 lineLength
  • 我如何像 Cocos2D 一样通过 SpriteKit 倾斜/剪切精灵?

    在Cocos2D x中 CCNode类提供了 skewX 和 skewY 来让我对精灵进行一些扭曲 但是 我在SpriteKit的SKNode中找不到类似的映射 我的游戏使用Flash移植骨骼动画 其中精灵的定位 缩放 旋转和剪切的配置将被
  • 如何以编程方式确定我的应用程序正在 iPhone、iPad 或 iPhone 4 上运行?

    我刚刚使用 cocos2d 完成了我的 iPhone 游戏 但在将其发布到 AppStore 之前 我想让它在 iPad 屏幕更大 和 iPhone 4 分辨率更大 上运行 那么 我如何以编程方式确定我的应用程序正在 iPhone iPad
  • 矩形和圆形碰撞检测

    我正在尝试进行矩形和圆形之间的碰撞检测 我想出了这个方法 BOOL isCollidingRect CCSprite spriteOne WithSphere CCSprite spriteTwo float diff ccpDistanc
  • 像 CCSprite 对象一样移动 Box2d 实体

    在cocos2d中 您可以轻松使用CCSprites并以各种方式移动它们 最重要的是 他们可以缓入 缓出 对于大多数游戏来说 这对于平滑移动等是可取的 id action CCMoveTo actionWithDuration dur po
  • Cocos2D 中的评分系统

    我的游戏有碰撞检测功能 当我的导弹击中敌人时 敌人就会消失 我想添加一个评分系统 每次我的导弹击中敌人时都会增加 1 分 我将在下面发布我的游戏代码 我使用了HelloWorldLayer m 这是代码 Link http pastebin
  • Cocos2d 游戏中的碰撞检测?

    我正在尝试检测碰撞 of two sprites按照以下方式 但是当我尝试运行游戏时没有发生碰撞 我可能做错了什么 void update ccTime dt CGRect projectileRect CGRectMake project
  • 基于 cocos2d-box2d 的项目中出现“'uniqueIdentifier' is deprecated”警告

    我基于cocos2d box2d创建一个新项目 两个文件中总是有4个警告 一个是CLScoreServerPost m 代码有警告如下 self addValue UIDevice currentDevice uniqueIdentifie
  • 如何将 CCSprite 从一个父级转移到另一个父级?

    我有一个CCSprite called sprite那是一个孩子CCLayer called movingLayer它本身就是当前的子项CCLayer运行我的游戏逻辑 所以它是self在这种情况下 movingLayer以永远重复的动作在屏
  • 如何以编程方式停止水平滚动?

    我在cocos2d的CCLayer中有一个UITextView textView 文本在水平和垂直方向上滚动 但是 我需要它仅垂直滚动和弹跳 如何以编程方式停止水平滚动 UITextView textView UITextView allo
  • cocos2d v3 在应用程序使用过程中重新定向屏幕

    所以在 cocos2d 中 我相信我使用的是 v2 1 我这样做是为了锁定和设置方向 AppDelegate delegate AppDelegate UIApplication sharedApplication delegate con
  • cocos2d中的水效果

    我想在我的应用程序的背景层上有水效果 该效果不需要对触摸或任何东西做出反应 它只需要稍微晃动图像即可 CCWaves3D 看起来不错 但当我运行它时 边缘周围留下了令人讨厌的黑色伪影 类似CCShaky3D CCLiquid 将我的应用程序
  • NSMutableArray 根本不工作

    我正在尝试将精灵添加到NSMutableArray但它没有添加它们 这就是我所拥有的 NSMutableArray tail CCSprite block int j void handleTail CCSprite pos CGPoint
  • 使用 CCTouchDispatcher Cocos2d 2.0 Beta-2 ARC

    我正在使用 cocos2d 2 0 BETA 2 0 最新的 创建一个游戏 我需要在其他班级添加一个操纵杆 所以我在第二堂课上称之为 CCTouchDispatcher 但我不能这样调用 CCTouchDispatcher sharedDi
  • Box2d 自定义多边形和精灵不匹配

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

随机推荐

  • 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