- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的一些 sprite 上实现 bodyWithTexture,它在大多数情况下都很好用。我的问题是,出于某种原因,创建的物理体与我的 Sprite 的实际形状不一致。我注意到它与 Xcode 生成的纹理图集有关,它会旋转相关的 Sprite 以适应。这是 issue. 的图片
我该如何解决这个问题?提前致谢!
注:这个post的内容我都试过了没有运气。注 2:我会使用 Objective-C 中的任何代码示例。
更新:这是用于设置物理体的所有代码。至于纹理,我让 SpriteKit 在幕后处理。
@implementation AsteroidNode
+(instancetype)astroidOfType:(AstoridType)type {
AsteroidNode *astroid;
if (type == AstoridTypeA) {
astroid = [self spriteNodeWithImageNamed:@"rock_a"];
astroid.type = AstoridTypeA;
} else if (type == AstoridTypeB) {
astroid = [self spriteNodeWithImageNamed:@"rock_b"];
astroid.type = AstoridTypeB;
} else {
astroid = [self spriteNodeWithImageNamed:@"rock_c"];
astroid.type = AstoridTypeC;
}
astroid.name = @"astroid";
astroid.zPosition = 1;
//changes asteroid size for smaller screen sizes
if ( IS_IPHONE_4_OR_LESS | IS_IPHONE_5) {
astroid.size = [Utils setNodeSize:astroid.size];
}
[astroid setUpPhysicsBody];
return astroid;
}
-(void)setUpPhysicsBody {
self.physicsBody = [SKPhysicsBody bodyWithTexture:self.texture size:self.size];
self.physicsBody.friction = 0;
self.physicsBody.linearDamping = 0;
self.physicsBody.categoryBitMask = CollisionCatAstroid;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = CollisionCatShip | CollisionCatBottomEdge;
}
@end
使用 bodyWithPolygonFromPath 在 6 和 6+ 上效果很好,但在 5 和 4S 上效果不佳。
CGFloat offsetX = self.size.width / 2;
CGFloat offsetY = self.size.height / 2;
if (self.type == AstoridTypeA) {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 20 - offsetX, 87 - offsetY);
CGPathAddLineToPoint(path, NULL, 77 - offsetX, 86 - offsetY);
CGPathAddLineToPoint(path, NULL, 103 - offsetX, 48 - offsetY);
CGPathAddLineToPoint(path, NULL, 88 - offsetX, 13 - offsetY);
CGPathAddLineToPoint(path, NULL, 63 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 33 - offsetX, 5 - offsetY);
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 36 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
} else if (self.type == AstoridTypeB) {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 43 - offsetX, 91 - offsetY);
CGPathAddLineToPoint(path, NULL, 81 - offsetX, 80 - offsetY);
CGPathAddLineToPoint(path, NULL, 97 - offsetX, 50 - offsetY);
CGPathAddLineToPoint(path, NULL, 75 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 25 - offsetX, 18 - offsetY);
CGPathAddLineToPoint(path, NULL, 12 - offsetX, 36 - offsetY);
CGPathAddLineToPoint(path, NULL, 10 - offsetX, 71 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
} else {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 41 - offsetX, 48 - offsetY);
CGPathAddLineToPoint(path, NULL, 55 - offsetX, 32 - offsetY);
CGPathAddLineToPoint(path, NULL, 40 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 24 - offsetX, 12 - offsetY);
CGPathAddLineToPoint(path, NULL, 11 - offsetX, 23 - offsetY);
CGPathAddLineToPoint(path, NULL, 17 - offsetX, 43 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
}
我最终得到了这个,可能是一种更简单的方法,但它有效。如果有人有任何建议,请告诉我。
-(void)setUpPhysicsBody {
CGFloat offsetX = self.size.width / 2;
CGFloat offsetY = self.size.height / 2;
if (self.type == AstoridTypeA) {
if (IS_IPHONE_4_OR_LESS | IS_IPHONE_5) {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 17 - offsetX, 72 - offsetY);
CGPathAddLineToPoint(path, NULL, 64 - offsetX, 71 - offsetY);
CGPathAddLineToPoint(path, NULL, 85 - offsetX, 40 - offsetY);
CGPathAddLineToPoint(path, NULL, 73 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 52 - offsetX, 13 - offsetY);
CGPathAddLineToPoint(path, NULL, 27 - offsetX, 4 - offsetY);
CGPathAddLineToPoint(path, NULL, 2 - offsetX, 30 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
} else {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 20 - offsetX, 87 - offsetY);
CGPathAddLineToPoint(path, NULL, 77 - offsetX, 86 - offsetY);
CGPathAddLineToPoint(path, NULL, 103 - offsetX, 48 - offsetY);
CGPathAddLineToPoint(path, NULL, 88 - offsetX, 13 - offsetY);
CGPathAddLineToPoint(path, NULL, 63 - offsetX, 16 - offsetY);
CGPathAddLineToPoint(path, NULL, 33 - offsetX, 5 - offsetY);
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 36 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
}
} else if (self.type == AstoridTypeB) {
if (IS_IPHONE_4_OR_LESS | IS_IPHONE_5) {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 35 - offsetX, 75 - offsetY);
CGPathAddLineToPoint(path, NULL, 67 - offsetX, 66 - offsetY);
CGPathAddLineToPoint(path, NULL, 80 - offsetX, 41 - offsetY);
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 8 - offsetY);
CGPathAddLineToPoint(path, NULL, 20 - offsetX, 15 - offsetY);
CGPathAddLineToPoint(path, NULL, 10 - offsetX, 30 - offsetY);
CGPathAddLineToPoint(path, NULL, 8 - offsetX, 59 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
} else {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 43 - offsetX, 91 - offsetY);
CGPathAddLineToPoint(path, NULL, 81 - offsetX, 80 - offsetY);
CGPathAddLineToPoint(path, NULL, 97 - offsetX, 50 - offsetY);
CGPathAddLineToPoint(path, NULL, 75 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 25 - offsetX, 18 - offsetY);
CGPathAddLineToPoint(path, NULL, 12 - offsetX, 36 - offsetY);
CGPathAddLineToPoint(path, NULL, 10 - offsetX, 71 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
}
} else {
if (IS_IPHONE_4_OR_LESS | IS_IPHONE_5) {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 34 - offsetX, 40 - offsetY);
CGPathAddLineToPoint(path, NULL, 45 - offsetX, 26 - offsetY);
CGPathAddLineToPoint(path, NULL, 33 - offsetX, 8 - offsetY);
CGPathAddLineToPoint(path, NULL, 20 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 9 - offsetX, 19 - offsetY);
CGPathAddLineToPoint(path, NULL, 14 - offsetX, 35 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
} else {
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 41 - offsetX, 48 - offsetY);
CGPathAddLineToPoint(path, NULL, 55 - offsetX, 32 - offsetY);
CGPathAddLineToPoint(path, NULL, 40 - offsetX, 10 - offsetY);
CGPathAddLineToPoint(path, NULL, 24 - offsetX, 12 - offsetY);
CGPathAddLineToPoint(path, NULL, 11 - offsetX, 23 - offsetY);
CGPathAddLineToPoint(path, NULL, 17 - offsetX, 43 - offsetY);
CGPathCloseSubpath(path);
self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
}
}
self.physicsBody.friction = 0;
self.physicsBody.linearDamping = 0;
self.physicsBody.categoryBitMask = CollisionCatAstroid;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = CollisionCatShip | CollisionCatBottomEdge;
}
最佳答案
您遇到了 bodyWithTexture 方法的 sprite-kit 错误。
物理体实际上是颠倒的,没有错位或旋转。因此它与 this issue 完全相同.
这是 iOS8 上 Spritekit 的一个错误。我怀疑当物理体的纹理从内部缓存中检索时会出现错误。它可能会错误地翻转图像以尝试更正来自 CoreGraphics 的坐标系。
在你的情况下,鉴于你的小行星的形状,我推荐这个:
init!(polygonFromPath path: CGPath!) -> SKPhysicsBody
关于ios - SpriteKit bodyWithTexture 未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838411/
我正在尝试构建一个 SpriteKit 游戏,但它因错误而失败:“无法将模块“SpriteKit”加载为“Spritekit”” 我使用的是 Xcode 版本 6.3.2 (6D2105)。 最佳答案
如何在 spritekit swift 中更改碰撞时的 spritekit。 else if collidedBird.birdType == 6 { if U
我刚刚创建了一个新的 SpriteKit 项目,就遇到了砰!问题。我运行该项目时没有触及任何内容,并且应该如此,默认的 hello world 项目出现了。这方面一切都很好。现在,我创建了一个新的 C
当我使用 SpriteKit 创建视频对象时 let background = SKVideoNode(videoFileNamed: "Video.mov") 我只使用了一次命令: backgrou
出于某种原因,我无法将节点放置在屏幕的顶部或底部。我曾经能够使用 self.frame.height/2 很好地做到这一点,但现在我在景观中工作,这行代码不起作用。注意:我的 anchor 是 0.5
在场景中“缩小”的正确方法是什么。 我有一个物体,我施加一个冲动将它发射到屏幕上。例如,它会发射大约 100 像素,这按预期工作 - 增加它飞行的力量,增加它飞行的密度更少等等。 我遇到的问题是缩放,
是否可以更改粒子发射的频率。例如,如果我发射一个粒子,我可以让它每 5 秒或 10 秒发射一次吗? 我搜索了文档,但找不到任何内容。有解决方法吗?我想做这样的事情: emitter.partic
有谁知道一些开箱即用的库,它们可能会为 SKNode 提供诸如相机抖动之类的效果。 ? 如果没有,是否有一种简单的方法可以使用 Action 来实现相机抖动? 谢谢 最佳答案 我找到了一种使用 SKA
我目前一直在使用委托(delegate)和 SKView 自定义类来监视我的 OS X SpriteKit 游戏中的按键。我需要为我的键盘监控类雇用多个代表,我知道这是不可能的,但可以通过使用观察者来
我从事 SpriteKit 游戏已经有一段时间了,但我有一个无法摆脱的恼人问题。我不想过多介绍这款游戏,但它非常简单。我每秒生成一些对象(SKSpriteNodes),这些对象使用 SpriteKit
我正在制作基于SpriteKit的多级游戏。 一切正常,除了一件事:当用户玩很长时间、改变很多关卡等时......然后 SpriteKit 开始丢失纹理。 我的意思是,没有像图像加载失败时那样的大红叉
我正在尝试将 SKSprite Particle Emitter 与 Swift 一起使用。 但我想在我的发射器中使用许多不同的纹理。 是否有可能:拥有许多图像,并且让发射器随机使用图像,而不是仅使用
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在用SpriteKit构建我的第一个项目,但我无法弄清楚这部分。 我的项目包括飞入屏幕的敌方直升机。每个敌人播放大约14秒长的声音文件。这不是循环。它包括敌人进入屏幕之前接近的声音,以及在屏幕上移
我试图在代码中到处搜索:解释文档在进入后台时会做什么,或者甚至有时会暂停,但无济于事-有人可以指导我在进入后台时建议做什么到启用 Sprite 套件的游戏中的背景吗? 我应该调用scene.pause
我是 SpriteKit 新手。我需要通过 UIImageView 或 SpriteNode 显示图像(它是游戏的背景图像)。但是,我需要用户能够放大背景并平移。我在不使用 SpriteKit 的情况
在我的游戏中,我正在创建一些受重力影响的球。当游戏开始时,他们会从屏幕外掉下来,并在底部找到自己的位置。没有其他力施加在他们身上。 问题是我正在用精确的坐标、精确的物理属性创建这些球,但结果不一样。它
我想让我的宇宙飞船有一条跟随它的粒子轨迹。我该怎么做? 这是我的宇宙飞船的代码: override func didMove(to view: SKView) { spaceS.positio
我正在尝试制作一个动画角色,可以在不移动他的躯干的情况下伸手去拿屏幕上的东西。 如果他够不到,他的手应该朝这个方向移动最大量,然后被他的静态躯干的物理限制所抵消。 所以在我的代码中,绿色矩形( han
我的场景上有player对象,并试图对其施加一些力。您可以看到我正在对update:文件上的MyScene.h方法施加作用力。但是,我的player根本没有动。发生了什么? 下面是Player SKS
我是一名优秀的程序员,十分优秀!