使用固定的SKPhysicsJoint将平台检测命中框作为子项附加到玩家精灵更改玩家的碰撞和检测位掩码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用固定的SKPhysicsJoint将平台检测命中框作为子项附加到玩家精灵更改玩家的碰撞和检测位掩码相关的知识,希望对你有一定的参考价值。

我正在尝试在我的播放器底部添加一个hitbox来检测平台。经过大量的反复试验后,我想出了一个额外的物理学家作为一个固定位置的孩子附加到另一个物理学家身上,我需要使用一个SKPhysicsJoint。我这样做了,似乎有一种不可预见的后果。当我以这种方式将hitbox添加到播放器时,它会略微改变玩家碰撞/接触位掩码。

在我的游戏中,你点击屏幕跳跃,它无缝地工作,没有像这样的延迟:

Player jumping

但是当我用关节添加这个hitbox时,我必须用我的手指握住屏幕,最终玩家跳跃,但大多数时候输入被忽略。几乎好像在读取输入时有某种严重的延迟。在这个gif中我不断地试图让我的播放器跳跃并且许多输入被忽略或阻塞:

Player hitbox not behaving


此功能在我的gamescene.swift中设置播放器,并通过固定的SKPhysicsJoint将播放器添加到播放器到场景:

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它将摆脱这个问题。

感谢您的任何建议。

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

Odd behavior

答案

我找到了解决方案。

似乎有一些固定关节的错误,答案是使用“pin”关节代替。 This StackO question详细介绍了固定关节的旋转虫。一时兴起,我决定将我的固定关节更换为针脚,现在孩子的行为正如您所期望的那样,无论如何都要在位置上说话。

所以看来固定关节有一些需要解决的错误。

以上是关于使用固定的SKPhysicsJoint将平台检测命中框作为子项附加到玩家精灵更改玩家的碰撞和检测位掩码的主要内容,如果未能解决你的问题,请参考以下文章

SKPhysicsJoint:接触和碰撞不起作用

干货分享丨AM335x平台如何通过udev固定4G模块串口号的解决方法

用于测试国家检测的固定全球 IP?

夺命雷公狗---微信开发35----公众平台营销咨询系统4(分页)

Linux中系统状态检测命令

易点固定资产管理云平台: “互联网+”下的固定资产管理设想