gpt4 book ai didi

ios - 检测 Sprite 之间的碰撞

转载 作者:行者123 更新时间:2023-11-30 13:15:19 25 4
gpt4 key购买 nike

我的代码有问题。

我正在创建一个游戏,我需要一个可以同时出现多次的 Sprite ,为此我创建了一个类,这样我就可以多次执行 addChild(obstacle) ,并且它将准确地生成一个 SKSpriteNode与另一个类似。

我的问题是,我想检查我的播放器和障碍物之间的碰撞,但因为它来自同一个 SKSpriteNode,所以计算机无法知道我正在谈论哪个障碍物。

以下是我创建玩家和障碍物的方法:

import SpriteKit

class Obstacle: SKSpriteNode {

init() {
let obstacleTexture = SKTexture(imageNamed: "obstacle")
super.init(texture: obstacleTexture, color: UIColor.clearColor(), size: CGSize(width: 80, height: 80))
}

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

class GameScene: SKScene {

var player:SKSpriteNode!

override func didMoveToView(view: SKView) {

//player setup
let playerTexture = SKTexture(imageNamed: "player")
player = SKSpriteNode(texture: playerTexture)
player.position = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.2)

}

//how I spawn an obstacle
func spawnObstacle() {

let obstacle = Obstacle()

//obstacle position setup
obstacle.position.x = CGFloat(arc4random()) % self.frame.size.width
obstacle.position.y = self.frame.size.height + 200

//random spin action setup
var rotateObstacle = SKAction.rotateByAngle(CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75))

if random() % 2 == 0 {
rotateObstacle = SKAction.rotateByAngle(CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75))
}else{
rotateObstacle = SKAction.rotateByAngle(-CGFloat(M_PI), duration: Double((drand48() + 1) * 0.75))
}

let rotateObstacleForever = SKAction.repeatActionForever(rotateObstacle)

//random move action setup
let moveObstacle = SKAction.moveTo(CGPointMake(CGFloat(arc4random()) % self.frame.size.width, -200), duration: Double((drand48() + 1) * 1.5))

//running the actions
obstacle.runAction(rotateObstacleForever)
obstacle.runAction(moveObstacle)

addChild(obstacle)

}

}

}

如何检测玩家何时碰撞到任何障碍物?

最佳答案

要检测碰撞,您可以使用 SpriteKit 物理原理。

这里有 3 个与假设碰撞有关的元素:

  • 边界(或你的玩家居住的 field 以及你所在的区域)有你的障碍)
  • 玩家
  • 障碍

建议

将此参数设置为调试阶段以查看物理对象边界:

skView.showsPhysics = true

代码示例(警告:-此代码只是开始实现物理原理的一个点,我不知道您项目的其余部分,因此您的工作将是纠正为您认为这对您的对象更好):

enum CollisionTypes: UInt32 {
case Field = 1
case Player = 2
case Obstacle = 4
}

class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
self.physicsWorld.gravity = CGVectorMake(0, 0) // set your gravity value
self.physicsWorld.contactDelegate = self
let fieldBody = SKPhysicsBody.init(edgeLoopFromRect: self.frame)
self.physicsBody = fieldBody
self.physicsBody!.affectedByGravity = false
self.physicsBody!.usesPreciseCollisionDetection = true
self.physicsBody!.dynamic = true
self.physicsBody!.mass = 0.8
self.physicsBody!.friction = 0
self.physicsBody!.linearDamping = 0
self.physicsBody!.angularDamping = 0
self.physicsBody!.restitution = 0
self.physicsBody!.categoryBitMask = CollisionTypes.Field.rawValue
self.physicsBody!.contactTestBitMask = CollisionTypes.Player.rawValue

// Prepare the player
player.physicsBody = SKPhysicsBody(circleOfRadius: player.frame.width/2)
player.physicsBody!.affectedByGravity = false
player.physicsBody!.restitution = 0.0
player.physicsBody!.linearDamping = 0
player.physicsBody!.friction = 0.3
player.physicsBody!.dynamic = true
player.physicsBody!.mass = 0.2
player.physicsBody!.allowsRotation = false
player.physicsBody!.categoryBitMask = CollisionTypes.Player.rawValue
player.physicsBody!.contactTestBitMask = CollisionTypes.Field.rawValue | CollisionTypes.Obstacles.rawValue
player.physicsBody!.collisionBitMask = CollisionTypes.Field.rawValue | CollisionTypes.Obstacles.rawValue

//Prepare the obstacles (you must do it in your obstacle class)
obstacle.physicsBody = SKPhysicsBody(circleOfRadius: obstacle.frame.width/2)
obstacle.physicsBody!.affectedByGravity = false
obstacle.physicsBody!.restitution = 0.0
obstacle.physicsBody!.linearDamping = 0
obstacle.physicsBody!.friction = 0.3
obstacle.physicsBody!.dynamic = true
obstacle.physicsBody!.mass = 0.8
obstacle.physicsBody!.allowsRotation = true
obstacle.physicsBody!.categoryBitMask = CollisionTypes.Obstacle.rawValue
obstacle.physicsBody!.contactTestBitMask = CollisionTypes.Player.rawValue
obstacle.physicsBody!.collisionBitMask = CollisionTypes.Player.rawValue
}
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == CollisionTypes.Player.rawValue &&
contact.bodyB.categoryBitMask == CollisionTypes.Obstacle.rawValue) {
print("contact between Player and Obstacle")
}
if (contact.bodyA.categoryBitMask == CollisionTypes.Player.rawValue &&
contact.bodyB.categoryBitMask == CollisionTypes.Field.rawValue) {
print("contact between Player and Field")
}
}
}

关于ios - 检测 Sprite 之间的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38294398/

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