gpt4 book ai didi

swift - 使用固定的 SKPhysicsJoint 将平台检测碰撞盒作为子元素附加到玩家 Sprite 上会更改玩家的碰撞和检测位掩码

转载 作者:行者123 更新时间:2023-11-28 06:06:52 25 4
gpt4 key购买 nike

我正在尝试在我的播放器底部添加一个碰撞框以仅检测平台。经过大量的试验和错误后,我发现有一个额外的物理体作为一个固定位置的子连接到另一个物理体,我需要使用 SKPhysicsJoint。我这样做了,它似乎有一个不可预见的后果。当我以这种方式将 Hitbox 添加到玩家时,它会稍微改变玩家的碰撞/接触位掩码。

在我的游戏中,你点击屏幕进行跳跃,它可以无缝运行,没有像这样的延迟:

Player jumping

但是当我用关节添加这个碰撞箱时,我必须用手指按住屏幕,最终玩家会跳跃,但大多数时候输入被忽略。几乎就好像在读取输入时有某种严重的滞后。在这个 gif 中,我不断地点击屏幕试图让我的玩家跳跃,但很多输入都被忽略或阻止了:

Player hitbox not behaving


此函数在我的 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,它将摆脱这个问题。

感谢所有建议。

编辑:这是带有物理 body 且没有关节的 child 的行为:

Odd behavior

最佳答案

我找到了解决方案。

固定关节似乎存在一些错误,答案是改用“销”关节。 This StackO question详细介绍了固定关节的旋转错误。一时兴起,我决定将我的固定关节换成别针,现在 child 的行为符合您的预期,无论如何从位置上讲。

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

关于swift - 使用固定的 SKPhysicsJoint 将平台检测碰撞盒作为子元素附加到玩家 Sprite 上会更改玩家的碰撞和检测位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47948551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com