Ios 怎样才能使物理体的一侧在SpriteKit中活跃?
我有一个英雄,一块地和一张桌子。我想激活一个桌面,以便与hero进行碰撞和联系。但英雄应该能够不跳到顶端,只要跑“穿过”并跳上它,如果玩家想要它,无论他想去哪里。为了更好地说明我正在努力实现的目标,请想想马里奥。当你在地面上跑步时,会出现一些天空平台。你可以跳到站台中间,呆在那里。所以我需要物理身体,当英雄从底部接触它时,不要阻止他,但如果他在上面,就要抓住他。 到目前为止,我正在为表格使用body with texture:Ios 怎样才能使物理体的一侧在SpriteKit中活跃?,ios,sprite-kit,Ios,Sprite Kit,我有一个英雄,一块地和一张桌子。我想激活一个桌面,以便与hero进行碰撞和联系。但英雄应该能够不跳到顶端,只要跑“穿过”并跳上它,如果玩家想要它,无论他想去哪里。为了更好地说明我正在努力实现的目标,请想想马里奥。当你在地面上跑步时,会出现一些天空平台。你可以跳到站台中间,呆在那里。所以我需要物理身体,当英雄从底部接触它时,不要阻止他,但如果他在上面,就要抓住他。 到目前为止,我正在为表格使用body with texture: self.table.physicsBody = SKPhy
self.table.physicsBody = SKPhysicsBody(texture:table.texture, size:self.table.size)
self.table.physicsBody?.dynamic = false
self.table.physicsBody?.categoryBitMask = ColliderType.Table.rawValue
self.table.physicsBody?.contactTestBitMask = ColliderType.Hero.rawValue
self.table.physicsBody?.collisionBitMask = ColliderType.Hero.rawValue
很明显,它不起作用。我怎样才能实现这样的事情?< p>我不确定你的平台是什么样子的(基于边缘的或基于体积的身体),但是你可以考虑其中的一些: 1。检查位置
- 检查英雄的位置.y是否在平台下方/上方,并忽略/处理碰撞
- 或者检查玩家节点是否下落,由负的velocity.dy值指示
可以通过更改玩家和平台的碰撞位掩码来启用/禁用碰撞。如果可能的话,尽量避免跟踪状态,如isInTheAir、isOnPlatform、isFaling、isJumping和类似的状态,因为随着状态数量的增加,它会变得混乱。例如,您可以检查velocity.dy是否为负数,以查看播放器是否在下降,而不是添加名为“isFalling”的自定义布尔变量并持续保持其状态 这个问题的答案其实并不太难,但是在一个成熟的游戏中实现它对您来说要困难得多。对于一个新手程序员来说,这不是一开始就要做的事情 首先是相同的代码项目(点击/点击屏幕跳转):
#导入“GameScene.h”
类型定义NS_选项(uint32_t,1级物理目录){
CategoryPlayer=1使用swift,您可以创建如下sprite节点子类:
class TableNode: SKSpriteNode {
var isBodyActivated: Bool = false {
didSet {
physicsBody = isBodyActivated ? activatedBody : nil
}
}
private var activatedBody: SKPhysicsBody?
init(texture: SKTexture) {
super.init(texture: texture, color: SKColor.clearColor(), size: texture.size())
// physics body setup. Assuming anchorPoint = (0.5, 0.5)
let bodyInitialPoint = CGPoint(x: -size.width/2, y: +size.height/2)
let bodyEndPoint = CGPoint(x: +size.width/2, y: +size.height/2)
activatedBody = SKPhysicsBody(edgeFromPoint: bodyInitialPoint, toPoint: bodyEndPoint)
activatedBody!.categoryBitMask = ColliderType.Table.rawValue
activatedBody!.collisionBitMask = ColliderType.Hero.rawValue
physicsBody = isBodyActivated ? activatedBody : nil
name = "tableNode"
}
}
然后,更新游戏场景中的所有tableNodes:
override func didSimulatePhysics() {
self.enumerateChildNodesWithName("tableNode") {
node, stop in
if let tableNode = node as? TableNode {
// Assuming anchorPoint = (0.5, 0.5) for table and hero
let tableY = tableNode.position.y + tableNode.size.height/2
let heroY = hero.position.y - hero.size.height/2
tableNode.isBodyActivated = heroY > tableY
}
}
}
我尝试更改平台冲突位掩码,但效果不佳。我找到了不同的解决方案
在update()函数中,您可以检查以下内容
if player.physicsBody?.velocity.dy <= 0 {
player.physicsBody?.collisionBitMask = PhysicsCategory.Platform
} else {
player.physicsBody?.collisionBitMask = PhysicsCategory.None
}
如果player.physicsBody?.velocity.dy,你是对的!现在对我来说有点太难了。我想我会开始寻找其他方法来做类似的事情。不过谢谢你,这是一个很好的例子!
if player.physicsBody?.velocity.dy <= 0 {
player.physicsBody?.collisionBitMask = PhysicsCategory.Platform
} else {
player.physicsBody?.collisionBitMask = PhysicsCategory.None
}