2016-08-08 4 views
1

contactTestBitMask fonctionne en général, mais si le graphique est trop complexe contactTestBitMask panique et vous avez seulement une petite zone de contact ou d'obtenir des erreurs bizarres. Que puis-je faire là-bas?Contact Masque de bit de test ne fonctionne pas correctement

C'est une image de ma région:

enter image description here

class GameScene: SKScene, SKPhysicsContactDelegate { 
let WallCategory : UInt32 = 0x1 << 1 
let ShipCategory : UInt32 = 0x1 << 2 
var counter = 0 
var userCanBuild1Building = false 
var KameraSichtVar:SKCameraNode = SKCameraNode() 


var touched:Bool = false 
var startTouch = CGPointMake(0, 0) 
//------------------------------ 


var draufgeklickt:CGPoint = CGPoint() 
var draufgeklicktUpdate:CGPoint = CGPoint() 
var userWantScroll = false 
var userWantBuild = false 
let wohnhausBlue = SKSpriteNode(imageNamed:"wohnhausBlue") 
let buildMenu = SKSpriteNode(imageNamed:"Buildmenu") 
var hitDetected = false 



let actualBuilding = SKSpriteNode() 
var userWantUpgrade : Bool = false 
//var theBuildingBefore = SKSpriteNode() 
//var houseLvlSave : Int = 0 
var uphausSave : String = "" 
func didBeginContact(contact: SKPhysicsContact) { 

    var BuildingObject: SKPhysicsBody 
    var ClickObject: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
    { 
     BuildingObject = contact.bodyA 
     ClickObject = contact.bodyB 
    } 
    else 
    { 
     BuildingObject = contact.bodyB 
     ClickObject = contact.bodyA 
    } 


    // upgrade Building 
    let name = BuildingObject.node!.name 
    let HouseLvL: Int = Int(name!)! 
    if HouseLvL > 0 && userCanBuild1Building == true{ 

     userCanBuild1Building = false 
     let touchedBuilding = SKSpriteNode(imageNamed: BuildingObject.node!.name!) 
     touchedBuilding.name = BuildingObject.node!.name 

     let name = BuildingObject.node!.name 
     var HouseLvL: Int = Int(name!)! 
     HouseLvL = HouseLvL + 1 

     let uphaus = String(HouseLvL) 

     let setSpriteTexture = SKAction.setTexture(SKTexture(imageNamed: uphaus)) 
     let upSize = SKSpriteNode(imageNamed: uphaus) 
     let resizeHousewidth = SKAction.resizeToWidth(upSize.size.width, duration: 0) 
     let resizeHouseheight = SKAction.resizeToHeight(upSize.size.height, duration: 0) 



     touchedBuilding.runAction(resizeHousewidth) 
     touchedBuilding.runAction(resizeHouseheight) 
     touchedBuilding.runAction(setSpriteTexture) 
     touchedBuilding.name = "\(uphaus)" 

     touchedBuilding.position = BuildingObject.node!.position 
     touchedBuilding.zPosition = BuildingObject.node!.zPosition 
     touchedBuilding.userInteractionEnabled = false 

     let upgradedbuilding = SKSpriteNode(imageNamed: uphaus) 
     touchedBuilding.size = CGSizeMake(upgradedbuilding.size.width, upgradedbuilding.size.height) 
     touchedBuilding.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed:"\(uphaus)"), size: upgradedbuilding.size) 


     touchedBuilding.physicsBody?.categoryBitMask = WallCategory 
     touchedBuilding.physicsBody?.affectedByGravity = false 
     touchedBuilding.physicsBody?.dynamic = true 
     touchedBuilding.physicsBody?.collisionBitMask = 0 

     addChild(touchedBuilding) 
     BuildingObject.node?.removeFromParent() 
     ClickObject.node?.removeFromParent() 






    } 


    if HouseLvL == 0 
    { 
    ClickObject.node?.removeFromParent() 
    } 




     }`override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    if let KameraSicht:SKCameraNode = self.childNodeWithName("Kamera") as? SKCameraNode{ 
     KameraSichtVar = KameraSicht 
     self.camera = KameraSichtVar 


    } 


    physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVectorMake(0, 0) 

    func addBG(){ 

     let background = SKSpriteNode(imageNamed: "0") 
     background.name = "0" 
     background.anchorPoint = CGPointMake(0.5, 0.5) 
     background.zPosition = 2 
     background.position = CGPointMake(CGRectGetMinX(self.frame)+self.frame.width/4, CGRectGetMaxY(self.frame)-self.frame.height/4) 
     background.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "0"), size: background.size) 
     //background.physicsBody = SKPhysicsBody(rectangleOfSize: background.size) 
     background.physicsBody?.categoryBitMask = WallCategory 
     background.physicsBody?.affectedByGravity = false 
     background.physicsBody?.dynamic = true 
     background.physicsBody?.collisionBitMask = 0 


     self.addChild(background) 

    } 

    addBG() 


    let wall = SKSpriteNode(imageNamed:"1") 
    wall.name = "1" 
    wall.zPosition = 10 
    //wall.xScale = 3 
    //wall.yScale = 3 
    wall.size = CGSizeMake(100, 100) 
    wall.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame)) 
    wall.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: wall.name!), size: wall.size) 
    //wall.physicsBody = SKPhysicsBody(rectangleOfSize: wall.size) 
    wall.physicsBody?.affectedByGravity = false 
    wall.physicsBody?.dynamic = false 
    wall.physicsBody!.categoryBitMask = WallCategory 
    wall.physicsBody?.collisionBitMask = 0 
    self.addChild(wall) 




} 

`

+0

j'ai ajouté une image .. j'ai essayé de faire un contact entre un objet tactile et le graphique que j'ai posté. mon travail de code pour tous les autres graphiques que j'ai essayé d'attendre celui-ci. Vous pouvez utiliser le graphique et l'essayer par vos propres moyens: D il ne fonctionnera pas correctement .. ou attendre .. Je poste un code – frankibanki

+0

mais comme je l'ai dit le code fonctionne bien .. essayez le graphique que je joint et faites un contact. Je suis sûr que ça ne marchera pas, quel que soit le code que vous utilisez: D – frankibanki

+0

J'ajoute encore plus de code .. J'espère que ce n'est pas trop maintenant – frankibanki

Répondre

0

ok j'ai trouvé la solution. le problème était le comportement bizarre du contactTestBitMask lorsque vous utilisiez ce graphique (il ne détectait qu'un contact dans une petite zone du graphique). La raison en est que les graphiques ont des formes séparées (comme le demi-anneau et d'autres petites choses).

J'ai connecté toute forme de sorte que sa seule forme et maintenant tout fonctionne parfaitement bien. aussi essayé avec d'autres graphiques et le comportement de contactTestBitMask est: si vous avez des formes séparées dans votre graphique, contactTestBitMask prend exactement l'une des formes et en fait la zone de contact ... mais les autres formes dans votre graphique ne détecteront pas un contact alors ...