将 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];
其中GTMainMenu
是SKScene
的子类,并且有一个按钮(橙色框)到“动作”(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 在 xib 时覆盖它的 init 函数
将 UITextView 添加到 SpriteKit 中的场景