将 UITextView 添加到 SpriteKit 中的场景

Posted

技术标签:

【中文标题】将 UITextView 添加到 SpriteKit 中的场景【英文标题】:Adding UITextView to a scene in SpriteKit 【发布时间】:2014-04-12 18:43:30 【问题描述】:

我尝试创建游戏,并按照 Apple 的建议使用多个场景。 您可以将游戏视为文本重点和点击冒险。

这就是问题所在。大量文本,进行了一些搜索,这似乎是推荐的方式,或者说目前唯一的方法是使用UITextView,因此:

[self.view addSubview: textView];

如果你只有一个SKScene,这一切都很好,因为那是当前视图/SKView正在显示的场景。

我的问题是,当我将文本添加到场景的 *view 中时,这不是应用程序加载的第一个场景(第三个或更高),应用程序会跳回到它加载的第一个场景(即是我的菜单场景)并愉快地显示所需的文本。

有人知道为什么吗?我有菜单场景过渡到场景一、场景二(我希望在其中显示测试)。

如果我想在每个场景中显示多个单词,请不要说我需要每个场景的视图,这真的没有意义,但也许我对 SpriteKit 的使用也没有。

我仍然有些震惊,没有 SK 相当于 UITextView

无论如何,任何帮助,指点都会很棒,谢谢。

好的,这里是代码的相关部分......我想。 控制器:

- (void)viewWillLayoutSubviews

    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView *skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    skView.showsDrawCount = YES;

    // Create and configure the scene.
    SKScene *scene = [[GTMainMenu alloc] initWithSize:skView.bounds.size];

    // Present the scene.
    [skView presentScene:scene];

其中GTMainMenuSKScene 的子类,并且有一个按钮(橙色框)到“动作”(GTScene 的子类,本身是SKScene 的子类),这将导致转换到行为,它有另一个按钮到第一个场景。 只有您永远不会出现在现场,因为viewDidLoad 会将您返回到主菜单。

这是场景的 viewDidLoad,它会导致它“跳”回主菜单:

- (void)didMoveToView:(SKView *)view

    [super didMoveToView:view];

    if (!self.contentCreated) 
        [self createSceneContents];

        self.contentCreated = YES;
    

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(self.size.width/2, self.size.height/2+20, 200, 40)];
    textView.center = self.view.center;
    textView.textColor = [UIColor blackColor];
    textView.font = [UIFont systemFontOfSize:17.0];
    textView.backgroundColor = [UIColor whiteColor];
    textView.text = @"Where am I?";

    [self.view addSubview:textView];

有一个 git repo 可用here。

这是我项目的精简版,删除了与手头问题无关的所有内容。

请原谅我的代码,我的日常工作是 Java,目前我正在努力解决 Objective C 中的某些概念。 哦,对不起,我设法包含了用户设置:S

【问题讨论】:

感谢您的编辑。我不确定这是 ios 特定的,尽管“游戏”是一款 iOS 游戏。我认为 OSX 上也可能存在这个“问题”。 好的;我明白了,人们遵循标签。 :D 这种突然的“跳回前一个场景”强烈表明您的编程错误,但您没有提供任何您编写的上下文相关代码,因此我们无法制作任何建议。 添加代码示例,并链接到 git repo 【参考方案1】:

您的视图控制器的 viewWillLayoutSubviews 方法无法防止重复执行。此方法不仅会在应用启动时运行,而且会在每次视图旋转和调整大小时运行。

在使用该方法创建/呈现场景之前添加检查:

if(self.view.scene == nil)  /* present scene */ 

【讨论】:

这表明我的视图控制器 .h 文件是错误的,因为我的视图控制器显然没有场景属性。 #import <UIKit/UIKit.h> #import <SpriteKit/SpriteKit.h> @interface GTViewController : UIViewController 噢!只需要一点投射。 谢谢LearnCocos2D,问题解决。吸取教训,了解框架的生命周期。【参考方案2】:

你看过SKLabelNode吗?我在我的 SpriteKit 游戏中广泛使用了它。如果您需要您的 SKLabelNode 做任何花哨的事情(物理等),您可以将其添加到父 SKSpriteNode。

【讨论】:

我需要添加格式化文本,而且不止几句话,SKLabelNode 似乎无法处理这个问题。这是我的第一个电话。令我惊讶的是,许多游戏都有大量文本的屏幕,任务说明屏幕,但据我所知,SpriteKit 不支持这一点。可能只是我在滥用框架。 试试github.com/alex-alex/ASAttributedLabelNode,它是 NSAttributedStrings 的绝佳包装器。在 RTF 文件中编写文本重屏幕,并提供所有格式选项,非常容易。

以上是关于将 UITextView 添加到 SpriteKit 中的场景的主要内容,如果未能解决你的问题,请参考以下文章

如何将双击手势添加到 UITextView

将类别添加到 UITextView 并在 UITextView 在 xib 时覆盖它的 init 函数

以编程方式将段落标题添加到 UITextView

将 UITextView 添加到 SpriteKit 中的场景

如何将 UI 对象(图像)添加到 UITextView 或 UITextField?

将 UItextField 和 UITextView 添加到 UIAlertView