По какой-то причине в коде ниже вражеские бактерии перемещают пищу (горох), когда они касаются друг друга. Я не закодировал их, чтобы проверить контакт друг с другом. Любая помощь? Я пытаюсь сделать невозможным столкновение двух типов спрайтов.
import SpriteKit
var apple=SKSpriteNode()
class GameScene: SKScene, SKPhysicsContactDelegate {
var bg=SKSpriteNode()
var peas=SKSpriteNode()
var bacteria=SKSpriteNode()
var bactys_Y=[SKSpriteNode]()
var bactys_X=[SKSpriteNode]()
var border=CGRect()
// var gandolf=SKSpriteNode()
enum ColliderType:UInt32{
case Bug=1
case Food=2
case Enemy=4
case Gandolf=8
}
override func didMoveToView(view: SKView) {
border=CGRect(x: 0, y: self.frame.height, width: self.frame.width, height: self.frame.height-200)
//gandolf.physicsBody=SKPhysicsBody(edgeLoopFromRect: border)
let bactPic=SKTexture(imageNamed: "bacteria.png")
/* Setup your scene here */
//bg info
self.physicsWorld.contactDelegate=self
let bg_texture=SKTexture(imageNamed: "wood-texture-pattern.jpg")
bg=SKSpriteNode(texture: bg_texture)
bg.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
bg.size.height=self.frame.height
bg.size.width=self.frame.width
// self.addChild(bg)
//bug info
let applePic=SKTexture(imageNamed:"bug.png")
apple=SKSpriteNode(texture:applePic)
apple.position=CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
print(self.frame.width)
// let bactPic=SKTexture(imageNamed: "bacteria.png")
//peas info
let peas_texture=SKTexture(imageNamed: "peas.png")
peas=SKSpriteNode(texture: peas_texture)
// peas.position=CGPointMake(200,300)
peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4)
apple.physicsBody=SKPhysicsBody(circleOfRadius:applePic.size().width/2)
peas.physicsBody?.affectedByGravity=false
apple.physicsBody?.affectedByGravity=false
bg.zPosition=1
apple.zPosition=2
peas.zPosition=3
apple.physicsBody!.categoryBitMask=ColliderType.Bug.rawValue
apple.physicsBody!.contactTestBitMask=ColliderType.Food.rawValue
peas.physicsBody!.categoryBitMask=ColliderType.Food.rawValue
peas.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue
bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2)
bacteria.physicsBody!.categoryBitMask=ColliderType.Enemy.rawValue
bacteria.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue
// gandolf.physicsBody?.categoryBitMask=ColliderType.Gandolf.rawValue
// gandolf.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue
peas.setScale(0.4)
apple.setScale(0.5)
// bacteria info
// gandolf.color=UIColor.blackColor()
// self.addChild(gandolf)
self.addChild(apple)
// self.addChild(peas)
_=NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("spawnBacteria"), userInfo: nil, repeats: true)
spawnBacteria()
spawnFood()
}
func didBeginContact(contact: SKPhysicsContact) {
// peas.removeFromParent()
// spawnFood()
let first=contact.bodyA
let second=contact.bodyB
if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{
if first.categoryBitMask==ColliderType.Food.rawValue || second.categoryBitMask==ColliderType.Food.rawValue{
peas.removeFromParent()
spawnFood()
}
}
if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{
if first.categoryBitMask==ColliderType.Enemy.rawValue || second.categoryBitMask==ColliderType.Enemy.rawValue{
print("DEATH")
}
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
// print("x: "+String(apple.position.x))
// print("y: "+String(apple.position.y))
for node:SKSpriteNode in bactys_X{
if node.position.x<=0{
print("collide")
node.physicsBody?.velocity=CGVector(dx:0, dy:0)
node.physicsBody?.applyImpulse(CGVector(dx:6, dy:0))
}else if node.position.x>=self.frame.size.width-3{
node.physicsBody?.velocity=CGVector(dx:0,dy:0)
node.physicsBody?.applyImpulse(CGVector(dx:-6,dy:0))
}
}
for node:SKSpriteNode in bactys_Y{
if node.position.y>=self.frame.size.height-3{
node.physicsBody?.velocity=CGVector(dx:0,dy:0)
node.physicsBody?.applyImpulse(CGVector(dx:0,dy:-6))
}else if node.position.y<=200{
node.physicsBody?.velocity=CGVector(dx:0,dy:0)
node.physicsBody?.applyImpulse(CGVector(dx:0,dy:6))
}
}
}
func spawnFood(){
let peas_texture=SKTexture(imageNamed: "peas.png")
peas=SKSpriteNode(texture: peas_texture)
peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4)
peas.zPosition=3
peas.physicsBody?.affectedByGravity=false
peas.physicsBody?.categoryBitMask=ColliderType.Food.rawValue
peas.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue
let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20))
let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200)
//print(self.frame.size.width)
print("height: "+String(self.frame.size.height))
print("x: "+String(x))
print("y: "+String(y))
peas.position=CGPointMake(x,y)
peas.setScale(0.4)
self.addChild(peas)
}
func spawnBacteria(){
let bactPic=SKTexture(imageNamed: "bacteria.png")
bacteria=SKSpriteNode(texture: bactPic)
bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2)
bacteria.physicsBody?.affectedByGravity=false
bacteria.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue
bacteria.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue
// bacteria.physicsBody?.contactTestBitMask=ColliderType.Gandolf.rawValue
bacteria.zPosition=4
let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20))
let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200)
bacteria.position=CGPointMake(x,y)
bacteria.setScale(0.06)
let decide=Int(arc4random_uniform(3))
self.addChild(bacteria)
if decide==0{
//move left
// let move=SKAction.moveByX(-6, y: 0, duration: 0.1)
// let start=SKAction.repeatActionForever(move)
//bacteria.runAction(start)
bacteria.physicsBody?.applyImpulse(CGVector(dx: -6,dy: 0))
bactys_X.append(bacteria)
}else if decide==1{
//move right
// let move=SKAction.moveByX(6, y: 0, duration: 0.1)
// let start=SKAction.repeatActionForever(move)
// bacteria.runAction(start)
bacteria.physicsBody?.applyImpulse(CGVector(dx: 6, dy: 0))
bactys_X.append(bacteria)
}else if decide==2{
//move up
// let move=SKAction.moveByX(0, y: 6, duration: 0.1)
// let start=SKAction.repeatActionForever(move)
// bacteria.runAction(start)
bacteria.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 6))
bactys_Y.append(bacteria)
}else{
//move down
// let move=SKAction.moveByX(0, y: -6, duration: 0.1)
// let start=SKAction.repeatActionForever(move)
// bacteria.runAction(start)
bacteria.physicsBody?.applyImpulse(CGVector(dx: 0,dy: -6))
bactys_Y.append(bacteria)
}
}
}
1 ответ
По умолчанию битовая маска столкновения физического тела установлена на 0xFFFFFFFF (взаимодействовать со всеми объектами), а его динамическое свойство установлено на true. Глядя на ваш код, кажется, что вы не установили их, поэтому он использует значения по умолчанию.
Вам нужно будет установить эти свойства, чтобы достичь желаемого результата.
...physicsBody.dynamic = false
...physicsBody.collisionBitMask = //set to something
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.