gpt4 book ai didi

sprite-kit - 我的物理联系人在 SpriteKit 中没有联系

转载 作者:行者123 更新时间:2023-12-03 12:22:49 25 4
gpt4 key购买 nike

我正在使用 Xcode 7.3.1、iOS 9.3 和 Swift 2。还直接在模拟器和我的 iPad 上进行了测试。我进行了无数次搜索,阅读了两本 Spritekit Physics 书籍,并观看了许多视频教程和书面教程。我之前写过没有问题的 body 物理学,并且多次写过较小的项目,但这个只是没有给我任何反馈。这个问题之前已经在特定情况下在这里提出过,即与同一个 spritenode 发生 2 次碰撞,或者 collisionBitMask 和 contactTestBitMask 之间有什么区别。我知道这些差异,也知道您希望联系的每个对象都需要一个 categoryBitMask。
首先,我分配了一个全局 Physicsbody 结构(尝试了直接二进制 bitMask 和对应的 Int32 对应的每个都没有成功),一个物理委托(delegate)和每个 SKSpritenode 对应于它的配对触点。我尝试了多种方法来实现 didBeginContact(关于它的结构方式),但没有一种方法比其他方法有所不同。
之前我提到过反馈。我已经消灭了除了我的主要玩家、子弹、newEnemy 和enemyFire 之外的所有东西。当我尝试将接触或碰撞的结果打印到控制台时,就好像它甚至没有被读取。我没有事件。这些 Sprite 节点都在一个类(GameScene)中,我已经为每个功能 Sprite 节点尝试了单独的类,但没有运气。此外,使用单独的类,这似乎使事情变得更糟,即使有用于在类和子类之间进行通信的协议(protocol)。尽管我知道这是首选方式,但使用单独的类对我来说仍然是新事物。我将仅显示我认为可能需要查看以最小化的代码,但如果还有其他需要查看的内容,请告诉我。我只是想让子弹击中飞机,然后我可以从那里到达我的其他物体。

import AVFoundation
import SpriteKit
import GameKit

// Binary connections for collision and colliding
struct PhysicsCategory {
static let GroundMask : UInt32 = 1 //0x1 << 0
static let BulletMask : UInt32 = 2 //0x1 << 1
static let PlayerMask : UInt32 = 4 //0x1 << 2
static let EnemyMask : UInt32 = 8 //0x1 << 3
static let EnemyFire : UInt32 = 16 //0x1 << 4
static let All : UInt32 = UInt32.max // all nodes
}

class GameScene: SKScene, SKPhysicsContactDelegate {

// Starting scene, passed to didMoveToView
func startScene() {

// Sets the physics delegate and physics body
view?.showsPhysics = true
self.physicsWorld.gravity = CGVectorMake(0, 0)
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsWorld.contactDelegate = self // Physics delegate set
}

func setupPlayer() {

player = SKScene(fileNamed: "Player")!.childNodeWithName("player")! as! SKSpriteNode

// Body physics for player's planes
player.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "MyFokker2.png"), size: player.size)
player.physicsBody?.dynamic = false
player.physicsBody?.usesPreciseCollisionDetection = true
player.physicsBody?.categoryBitMask = PhysicsCategory.PlayerMask
player.physicsBody?.contactTestBitMask = PhysicsCategory.EnemyFire
player.physicsBody?.collisionBitMask = 0

player.removeFromParent()
self.addChild(player) // Add our player to the scene
}

// Create the ammo for our plane to fire
func fireBullets() {

bullet = SKSpriteNode(imageNamed: "fireBullet")

// Body physics for plane's bulets
bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.size)
bullet.physicsBody?.dynamic = false
bullet.physicsBody?.usesPreciseCollisionDetection = true
bullet.physicsBody?.categoryBitMask = PhysicsCategory.BulletMask
bullet.physicsBody?.contactTestBitMask = PhysicsCategory.EnemyMask
bullet.physicsBody?.collisionBitMask = 0

self.addChild(bullet) // Add bullet to the scene
}

func spawnEnemyPlanes() {
let enemy1 = SKScene(fileNamed: "Enemy1")!.childNodeWithName("enemy1")! as! SKSpriteNode
let enemy2 = SKScene(fileNamed: "Enemy2")!.childNodeWithName("enemy2")! as! SKSpriteNode
let enemy3 = SKScene(fileNamed: "Enemy3")!.childNodeWithName("enemy3")! as! SKSpriteNode
let enemy4 = SKScene(fileNamed: "Enemy4")!.childNodeWithName("enemy4")! as! SKSpriteNode

enemyPlanes = [enemy1, enemy2, enemy3, enemy4]

// Generate a random index
let randomIndex = Int(arc4random_uniform(UInt32(enemyPlanes.count)))

// Get a random enemy
newEnemy = (enemyPlanes[randomIndex])

// Added randomEnemy's physics
newEnemy.physicsBody = SKPhysicsBody(rectangleOfSize: newEnemy.size)
newEnemy.physicsBody?.dynamic = false
newEnemy.physicsBody?.usesPreciseCollisionDetection = true
newEnemy.physicsBody?.categoryBitMask = PhysicsCategory.EnemyMask
newEnemy.physicsBody?.contactTestBitMask = PhysicsCategory.BulletMask
newEnemy.physicsBody?.collisionBitMask = 0

newEnemy.removeFromParent()
self.addChild(newEnemy)
}

func spawnEnemyFire() {

enemyFire = SKScene(fileNamed: "EnemyFire")!.childNodeWithName("bullet")! as! SKSpriteNode

enemyFire.removeFromParent()
self.addChild(enemyFire) // Generate enemy fire

// Added enemy's fire physics
enemyFire.physicsBody = SKPhysicsBody(rectangleOfSize: enemyFire.size)
enemyFire.physicsBody?.dynamic = false
enemyFire.physicsBody?.usesPreciseCollisionDetection = true
enemyFire.physicsBody?.categoryBitMask = PhysicsCategory.EnemyFire
enemyFire.physicsBody?.contactTestBitMask = PhysicsCategory.PlayerMask
enemyFire.physicsBody?.collisionBitMask = 0
}

func didBeginContact(contact: SKPhysicsContact) {

if !self.gamePaused && !self.gameOver {

// beginContact constants
firstBody = contact.bodyA
secondBody = contact.bodyB

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}

// Contact statements
if ((firstBody.categoryBitMask & PhysicsCategory.BulletMask != 0) && (secondBody.categoryBitMask & PhysicsCategory.EnemyMask != 0)) {
print("Bullet hit Enemy")
}
else if ((firstBody.categoryBitMask & PhysicsCategory.PlayerMask != 0) && (secondBody.categoryBitMask & PhysicsCategory.EnemyFire != 0)) {
print("EnemyFire hit our Player")
}
}
}
}
我试图省略明显的代码,但留下需要知道的代码......对不起,如果它很长。
我也尝试过 checkPhysics 函数,它们甚至无法识别我的对象。
所有 SpriteNode 都被传递给 didMoveToView 函数。
任何人都可以看到问题出在哪里,或者有什么理由让我完全没有联系吗?

最佳答案

您遇到的问题是因为您所有的物理体都是非动态的。表示它们的动态属性设置为 false . didBeginContact仅当至少有一个物体是动态的时才会调用方法。
来自 docs :

The dynamic property determines whether the body is simulated by thephysics subsystem.


所以非动态物体肯定被排除在模拟之外。我找不到某个地方是否有文件证明这适用于联系人,但根据我的经验,我非常肯定联系人不会在两个静态机构之间工作。

关于sprite-kit - 我的物理联系人在 SpriteKit 中没有联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39600238/

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