首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用固定的SKPhysicsJoint将平台检测设备作为子设备附加到播放器上,精灵改变了玩家的碰撞和检测位掩码

使用固定的SKPhysicsJoint将平台检测设备作为子设备附加到播放器上,精灵改变了玩家的碰撞和检测位掩码
EN

Stack Overflow用户
提问于 2017-12-22 23:43:25
回答 1查看 216关注 0票数 3

我正试图在我的播放器底部添加一个hitbox,以便只检测平台。经过大量的尝试和错误之后,我发现在孩子的时候,有一个额外的物理体被附加到另一个物理体上--我需要使用SKPhysicsJoint。我做了这件事,结果似乎没有预料到的结果。当我以这种方式将hitbox添加到播放器中时,它会稍微改变玩家的碰撞/接触位掩码。

在我的游戏中,你点击屏幕跳转,它无缝地工作,没有任何滞后,像这样:

运动员跳跃

但是当我把这个hitbox和关节加在一起时,我必须用手指握住屏幕,最终玩家会跳起来,但是大多数时候输入会被忽略。就好像在阅读input.In时出现了严重的滞后,如果我不停地点击屏幕,试图让我的玩家跳转,很多输入都被忽略或阻塞了:

玩家hitbox没有行为

这个函数设置了我的gamescene.swift中的播放器,并通过固定的SKPhysicsJoint将hitbox添加到播放器中:

代码语言:javascript
复制
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和播放器没有接触:

代码语言:javascript
复制
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)}

}

这是我的玩家课

代码语言:javascript
复制
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来检测平台,而不是在我的更新方法中使用这个函数中的播放器:

代码语言:javascript
复制
  //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,它将解决这个问题。

谢谢你的建议。

编辑:这是孩子的行为与物理身体,没有关节:

奇数行为

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-23 18:32:38

我找到了解决办法。

似乎有一些错误与固定的关节和答案是使用“针”连接代替。这个StackO问题详细介绍了一个固定关节的旋转错误。出于一时兴起,我决定把我固定的关节换成别针,现在这个孩子的行为和你期望的一样,不管怎么说,从姿势上来说。

因此,似乎固定的关节有一些缺陷,需要解决。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47948551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档