gpt4 book ai didi

ios - 我小时候在我的玩家类中为我的玩家制作了一个 Hitbox Sprite 。我如何在 gamescene 的 didBegin 方法中访问那个 hitbox Sprite ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:36:50 25 4
gpt4 key购买 nike

这个“hitbox”的目的是让玩家只能在地面/平台上行走时跳跃。hitbox 比玩家宽一点,并且在玩家的脚上。这是我的播放器类:

class Player: SKSpriteNode {

let maxPlayerSpeed:CGFloat = 300
static var isPlayerOnGround = false



init() {

//players texture
let texture = SKTexture(imageNamed: "playerMove1")

super.init(texture: texture, color: SKColor.clear, size: texture.size())

//hitbox that sits underneath the player and follows him
let jumpHitBox = SKSpriteNode(color: .red, size: CGSize(width: texture.size().width - (texture.size().width / 8), height: texture.size().height / 5))

jumpHitBox.position.y = (-texture.size().height) + (texture.size().height / 2)
jumpHitBox.alpha = 0.5
jumpHitBox.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: jumpHitBox.size.width,
height: jumpHitBox.size.height))

jumpHitBox.zPosition = 3
jumpHitBox.physicsBody?.pinned = true
jumpHitBox.physicsBody?.allowsRotation = false
jumpHitBox.physicsBody?.categoryBitMask = CollisionTypes.playerJump.rawValue
jumpHitBox.physicsBody?.collisionBitMask = 0
jumpHitBox.physicsBody?.contactTestBitMask = CollisionTypes.ground.rawValue
addChild(jumpHitBox)



physicsBody = SKPhysicsBody(rectangleOf: size)
physicsBody?.categoryBitMask = CollisionTypes.player.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.star.rawValue | CollisionTypes.saw.rawValue | CollisionTypes.finish.rawValue
physicsBody?.collisionBitMask = CollisionTypes.ground.rawValue
physicsBody?.affectedByGravity = true
physicsBody?.restitution = 0.2
physicsBody?.isDynamic = true
physicsBody?.allowsRotation = false
setScale(0.6)
zPosition = 5
physicsBody?.linearDamping = 0.0 }

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) //error here
}

我想在此方法中使用 jumpHitBox 作为 GameScene.swift 中的附加 contact.bodyA/B 节点:

func didBegin(_ contact: SKPhysicsContact) {

if contact.bodyA.node == player {
playerCollided(with: contact.bodyB.node!)


} else if contact.bodyB.node == player {
playerCollided(with: contact.bodyA.node!)

}
}

我不知道如何在 GameScene.swift 的 didBegin 中从我的玩家类引用 jumpHitBox 子节点。

非常感谢任何建议。

编辑:我在

处遇到错误
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) //error here
}

我没有在我的播放器类中放任何东西,但是自从将 jumpHitBox 子画面移动到全局声明后,我在所需的 init 中的 super.init(coder: aDecoder) 行收到错误消息:Property 'self.jumpHitBox'未在 super.init 调用时初始化

最佳答案

虽然我会尝试注释中提到的更简单的 velocity.dy 方法,但您的问题是您的 hitbox 是在初始化程序的范围内声明的,因此您只能在那里访问它。如果你给 hitbox 一个更高的范围,比如类属性,那么你几乎可以在任何地方访问它:

class Player: SKSpriteNode {

let maxPlayerSpeed:CGFloat = 300

// This is probably going to cause you bugs later btw.. it should probably be
// just a regular property:
static var isPlayerOnGround = false

// Now you can just call playerInstance.jumpHitBox :
private(set) var jumpHitBox = SKSpriteNode()

init() {

//players texture
let texture = SKTexture(imageNamed: "playerMove1")

super.init(texture: texture, color: SKColor.clear, size: texture.size())
jumpHitBox = SKSpriteNode(color: .red, size: CGSize(width: texture.size().width - (texture.size().width / 8), height: texture.size().height / 5))
//hitbox that sits underneath the player and follows him
}
}

更新:

class Player: SKSpriteNode {

let maxPlayerSpeed:CGFloat = 300

// This is probably going to cause you bugs later btw.. it should probably be
// just a regular property:
static var isPlayerOnGround = false

// Now you can just call playerInstance.jumpHitBox :
var jumpHitBox = SKSpriteNode()

private func makeHitBox() -> SKSpriteNode {
let texture = SKTexture(imageNamed: "playerMove1")

//hitbox that sits underneath the player and follows him
let localJumpHitBox = SKSpriteNode(color: .red, size: CGSize(width: texture.size().width - (texture.size().width / 8), height: texture.size().height / 5))

localJumpHitBox.position.y = (-texture.size().height) + (texture.size().height / 2)
localJumpHitBox.alpha = 0.5
localJumpHitBox.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: localJumpHitBox.size.width,
height: localJumpHitBox.size.height))

localJumpHitBox.zPosition = 3
localJumpHitBox.physicsBody?.pinned = true
localJumpHitBox.physicsBody?.allowsRotation = false
localJumpHitBox.physicsBody?.categoryBitMask = CollisionTypes.playerJump.rawValue
localJumpHitBox.physicsBody?.collisionBitMask = 0
localJumpHitBox.physicsBody?.contactTestBitMask = CollisionTypes.ground.rawValue

return localJumpHitBox
}

init() {

//players texture
let texture = SKTexture(imageNamed: "playerMove1")

super.init(texture: texture, color: SKColor.clear, size: texture.size())

physicsBody = SKPhysicsBody(rectangleOf: size)
physicsBody?.categoryBitMask = CollisionTypes.player.rawValue
physicsBody?.contactTestBitMask = CollisionTypes.star.rawValue | CollisionTypes.saw.rawValue | CollisionTypes.finish.rawValue
physicsBody?.collisionBitMask = CollisionTypes.ground.rawValue
physicsBody?.affectedByGravity = true
physicsBody?.restitution = 0.2
physicsBody?.isDynamic = true
physicsBody?.allowsRotation = false
setScale(0.6)
zPosition = 5
physicsBody?.linearDamping = 0.0
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) //error here
jumpHitBox = makeHitBox()
addChild(jumpHitBox)
}
}

关于ios - 我小时候在我的玩家类中为我的玩家制作了一个 Hitbox Sprite 。我如何在 gamescene 的 didBegin 方法中访问那个 hitbox Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45069240/

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