2016-08-08 94 views
1

contactTestBitMask funktioniert im Allgemeinen, aber wenn die Grafik zu komplex ist contactTestBitMask Freaks aus und Sie haben nur eine kleine Kontaktfläche oder bekommen seltsame Fehler. Was kann ich dort machen? Kontakt Test Bit Mask funktioniert nicht

Dies ist ein Bild von meinem Gebiet:

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

ich habe ein Bild hinzugefügt .. Ich habe versucht, einen Kontakt zwischen einem Touch-Objekt und der Grafik, die ich gepostet habe, zu machen. Mein Code funktioniert für jede andere Grafik, die ich versucht habe. Sie können die Grafik verwenden und versuchen Sie es selbst: D es funktioniert nicht richtig .. oder warten .. Ich poste einige Code – frankibanki

+0

aber wie ich sagte, der Code funktioniert gut .. versuchen Sie die Grafik, die ich angehängt und einen Kontakt. Ich bin mir ziemlich sicher, dass es nicht richtig funktionieren wird, egal welchen Code du verwendest: D – frankibanki

+0

ich füge noch mehr Code hinzu .. ich hoffe es ist jetzt nicht zu viel – frankibanki

Antwort

0

ok ich die Lösung gefunden. Das Problem war das seltsame Verhalten der contactTestBitMask bei Verwendung dieser Grafik (es wurde nur ein Kontakt in einem kleinen Bereich der Grafik erkannt). Der Grund dafür ist, dass die Grafik getrennte Formen hat (wie der Halbring und einige andere Kleinigkeiten).

ich verband alle Form, so dass es nur eine Form und jetzt alles funktioniert einwandfrei. habe es auch mit einigen anderen Grafiken versucht und das Verhalten von contactTestBitMask ist: Wenn du Shapes in deiner Grafik getrennt hast, nimmt contactTestBitMask genau eine der Shapes und macht sie zum Kontaktbereich ... aber die anderen Shapes in deiner Grafik werden a nicht erkennen Kontakt dann ...