ios - SpriteKit - Edge 的行为不符合预期

标签 ios objective-c sprite-kit

为了定义矩形边缘,这是我编写的代码:

-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */

SKNode *edge = [SKNode node];

edge.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

[self addChild:edge];

}

我希望这个边缘包裹整个屏幕,即底部、顶部、左侧和右侧边框。

我希望添加到场景中的对象能够在所有边界上反弹。但是,这些对象仅在边缘的底部和顶部反弹。

P.S:相同的代码,大约一年前工作,当时 SpriteKit GameScene.m 类有 -(id)initWithSize:(CGSize)size 而不是 -(void)didMoveToView:(SKView *)view

最佳答案

目前,SpriteKit 默认从 .sks 文件加载场景,并且默认场景大小设置为 1024x768。这可能就是为什么您会得到意想不到的结果(self.frame 与 View 相比具有不同的大小)。

这些天你应该记住一些事情:

  • 从 .sks 文件加载场景时,永远不会调用 initWithSize:。 initWithCoder: 被调用。如果您想使用 initWithSize:您应该以“旧”方式创建场景 - 使用 sceneWithSize:

  • initWithSize中: View 始终为零,因此所有需要 View 的代码都应移至didMoveToView

  • viewDidLoad中, View 的最终大小可能还不知道。可以使用 viewWillLayoutSubviews 的正确实现来解决这个问题。了解更多 here .

我建议您使用 sceneWithSize: 方法在 viewWillLayoutSubviews 中创建一个场景,并使用 view.bounds.size 对其进行初始化。之后,您可以像这样创建边框:

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

提示:启用视觉物理表示可能很有用。您可以从 View Controller 执行此操作:

skView.showsPhysics = YES;

如果这一切都没有帮助,请检查您的 View 大小是否正确。如果提供了错误的启动图像, View 的大小可能会错误。

希望这有帮助并且有意义。

关于ios - SpriteKit - Edge 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31914383/

相关文章:

ios - 如何使一个节点堆叠在另一个节点之上并跟随该对象?

ios - UITableView 由于在滚动 tableview 的同时重新加载数据而崩溃

ios - 如何将核心数据存储到iCloud帐户iOS编程?

ios - UIPageViewController 是否必须全屏?

ios - SKTexture 返回错误的大小?

swift - 在 Spritekit 上的 SKTileMapNode 中设置物理主体

ios - 您可以在多少台设备上测试您的 iOS 应用程序?

ios - Collection View 根据其位置删除项目

objective-c - NSDictionary 到 UITableView

objective-c - "Modern Objective-C"真的是一个新版本,即 Objective-C 2.1 吗?