gpt4 book ai didi

ios - 如何快速使用物理学设置地面位置,并使用 applyImpulse 仅跳跃一次

转载 作者:搜寻专家 更新时间:2023-11-01 05:37:22 24 4
gpt4 key购买 nike

我正在尝试用 Swift 制作一个跳跃和奔跑的游戏,我遇到了两个主要问题。

首先是我将重力应用到 GameScene,但每次我跳跃时,玩家都会穿过地板而不是停在其原始位置。我尝试在跳跃前设置dynamic = false,然后在跳跃后将其设置为true,但它仍然从地板上掉下来。

我遇到的另一个问题是,当点击时,玩家每次点击都会应用和冲动,因此会跳跃、二段跳、三段跳等。我似乎无法弄清楚如何让它只在它处于地面层。

这是代码。

   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
//basically my tap to start feature. i set the player's dynamic to false at the play screen, then on the first tap it runs the game, then every other tap it normally jumps
if player.physicsBody!.dynamic {
player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 5.0))
} else {
spawnBarrels()
addTimer()
runScore()
startLabel.removeFromParent()
player.physicsBody?.dynamic = true
player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 4.0))
}
}
func addGround(){
//adds the ground
addChild(ground)
ground.size = CGSize(width: size.width * 1, height: size.height * 0.1)
ground.position = CGPoint(x: size.width * 0.5, y: size.height * 0.05)

ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: size.height, height: size.height * 0.1))

ground.physicsBody?.dynamic = false
}

var canJump = true
//change

func didBeginContactGround(contact: SKPhysicsContact){
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch(contactMask){
case PhysicsCategory.Player | PhysicsCategory.Ground:
canJump = true
default:
return
}
}

最佳答案

对于您问题的第一部分:您混淆了碰撞、接触和类别位掩码。这些是它们的定义/用途:

  • 类别:它是什么类型的对象(PhysicsCategory.Player)
  • Collision:它与什么物体发生碰撞(PhysicsCategory.Ground)
  • Contact:游戏应该测试碰撞的目的。然后,您可以在以下位置引用两个对象的碰撞:func didBeginContact(联系人:SKPhysicsContact){}

现在你告诉你的玩家检查它和其他玩家之间的碰撞,并且没有碰撞(如果这没有意义,我建议进一步研究这些位掩码)。如果您希望您的玩家在接触到障碍物时死亡,您可以将其 Contact 设置为 PhysicsCategory.Obstacle

对于第二部分:您可以将接触位掩码设置为PhysicsCategory.Ground,如果您还想要障碍物,则可以是:PhysicsCategory。地面 | PhysicsCategory.Obstacle.然后你可以创建一个名为 canJump 的 bool 值,并且只有当它为 true 时才允许跳跃。

然后你会在你的代码中的某个地方写这个:

func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch(contactMask) {
case PhysicsCategory.Player | PhysicsCategory.Ground:
canJump = true;
default:
return
}
}

然后每当你的玩家跳跃时,将 canJump 设置为 false。这样一来,当玩家撞到地面时,他们就可以再次跳跃。如果你想更精确,不是在跳跃后将 canJump 设置为 false,而是在玩家不再与地面接触后通过制作另一个相同的函数将其设置为 false但将名称更改为 didEndContact,并将其设置为 false 而不是 true

此外,对于播放器,动态应始终为 true。如果您不了解不同的位掩码,这里有一个链接应该对您有所帮助:

https://www.hackingwithswift.com/read/26/2/loading-a-level-categorybitmask-collisionbitmask-contacttestbitm

关于ios - 如何快速使用物理学设置地面位置,并使用 applyImpulse 仅跳跃一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343007/

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