我正试图在我的播放器底部添加一个hitbox,以便只检测平台。经过大量的尝试和错误之后,我发现在孩子的时候,有一个额外的物理体被附加到另一个物理体上--我需要使用SKPhysicsJoint。我做了这件事,结果似乎没有预料到的结果。当我以这种方式将hitbox添加到播放器中时,它会稍微改变玩家的碰撞/接触位掩码。
在我的游戏中,你点击屏幕跳转,它无缝地工作,没有任何滞后,像这样:
但是当我把这个hitbox和关节加在一起时,我必须用手指握住屏幕,最终玩家会跳起来,但是大多数时候输入会被忽略。就好像在阅读input.In时出现了严重的滞后,如果我不停地点击屏幕,试图让我的玩家跳转,很多输入都被忽略或阻塞了:
这个函数设置了我的gamescene.swift中的播放器,并通过固定的SKPhysicsJoint将hitbox添加到播放器中:
func playerSetup(){
//setups player
addChild(player)
player.addChild(playerPlatformHitbox)
let myCGPoint = player.position // sets joint position
let myJoint = SKPhysicsJointFixed.joint(withBodyA: playerPlatformHitbox.physicsBody!, bodyB: player.physicsBody!, anchor: myCGPoint)
scene?.physicsWorld.add(myJoint)
}这是我制作的hitbox类,只检测播放器的平台。您将看到,它应该忽略所有期望平台从位掩码。出于某种原因,它不允许玩家接受与它的比特面具的接触,即使这个hitbox和播放器没有接触:
import Foundation
import SpriteKit
class PlayerPlatformHitbox: SKSpriteNode{
init() {
super.init(texture: nil, color: SKColor.blue, size: CGSize(width: playerTexture.size().width, height: 10))
physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
position = CGPoint(x:0, y: (-playerTexture.size().height * 0.6))
physicsBody?.categoryBitMask = CollisionTypes.jumpHitBox.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.platform.rawValue
physicsBody?.collisionBitMask = CollisionTypes.platform.rawValue
physicsBody?.restitution = 0.0
physicsBody?.friction = 0.0
zPosition = 20
physicsBody?.linearDamping = 0.0
physicsBody?.angularDamping = 0.0
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)}}
这是我的玩家课
class Player: SKSpriteNode {
init() {
super.init(texture: nil, color: SKColor.clear, size: playerTexture.size())
//starts accelerameter
motionManager = CMMotionManager()
motionManager.startAccelerometerUpdates()
physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: playerTexture.size().width,
height: playerTexture.size().height))
physicsBody?.categoryBitMask = CollisionTypes.player.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.memoryModule.rawValue | CollisionTypes.spikes.rawValue | CollisionTypes.finish.rawValue | CollisionTypes.enemy.rawValue | CollisionTypes.ground.rawValue
physicsBody?.collisionBitMask = CollisionTypes.ground.rawValue | CollisionTypes.sceneEdge.rawValue
physicsBody?.affectedByGravity = true
physicsBody?.restitution = 0.0
physicsBody?.friction = 0.3
physicsBody?.isDynamic = true
//physicsBody?.friction = 0.0
physicsBody?.allowsRotation = false
setScale(0.65)
zPosition = 1
physicsBody?.linearDamping = 0.0
physicsBody?.angularDamping = 0.0
animateWalk()
}所有这些的目标是使用hitbox来检测平台,而不是在我的更新方法中使用这个函数中的播放器:
//jump through platform check
if let body = player.physicsBody {
let dy = body.velocity.dy
if dy > 0{
// Prevent collisions if the hero is jumping
body.collisionBitMask &= ~CollisionTypes.platform.rawValue
body.contactTestBitMask &= ~CollisionTypes.platform.rawValue
}
else {
// Allow collisions if the hero is falling
body.collisionBitMask |= CollisionTypes.platform.rawValue
body.contactTestBitMask |= CollisionTypes.platform.rawValue
}
}我需要这么做的唯一原因是,当玩家摔倒时,如果他跌倒并撞到平台的一侧,他会停下来滑下去,因为碰撞会恢复,而球员的身体是正方形的。
如果我可以使用平台检测,hitbox来检测平台,而不是玩家笨重的hitbox,它将解决这个问题。
谢谢你的建议。
编辑:这是孩子的行为与物理身体,没有关节:
发布于 2017-12-23 18:32:38
我找到了解决办法。
似乎有一些错误与固定的关节和答案是使用“针”连接代替。这个StackO问题详细介绍了一个固定关节的旋转错误。出于一时兴起,我决定把我固定的关节换成别针,现在这个孩子的行为和你期望的一样,不管怎么说,从姿势上来说。
因此,似乎固定的关节有一些缺陷,需要解决。
https://stackoverflow.com/questions/47948551
复制相似问题