SKPhysicsContactDelegate zum Code hinzufügen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SKPhysicsContactDelegate zum Code hinzufügen?

    Ich versuche ein Spiel mit Spritekit in Swift zu programmieren. Ziel ist es, mit seinen Charakter entgegenkommenden Rechtecken zu entkommen. Jetzt habe ich einen Fehler mit der Methode SKPhysicsContactDelegate (didBegin ()) gemacht, so dass der Kontakt der Figur mit einem der Rechtecke nicht erkannt wird. Kann mir jemand helfen, den Fehler zu finden?

    Quellcode

    1. import SpriteKit
    2. enum colissionTypes: UInt32 {
    3. case rechteckRechts = 1
    4. case rechteckLinks = 2
    5. case figur = 4
    6. }
    7. class PlayScene: SKScene, SKPhysicsContactDelegate{
    8. let figur = SKSpriteNode(imageNamed: "Punkt.jpg")
    9. @objc func addRechteck(){
    10. let rechteckRechts = SKSpriteNode(imageNamed: "Rechteck.gif")
    11. rechteckRechts.physicsBody = SKPhysicsBody()
    12. rechteckRechts.physicsBody?.isDynamic = false
    13. rechteckRechts.physicsBody?.categoryBitMask = colissionTypes.rechteckRechts.rawValue
    14. let rechteckLinks = SKSpriteNode(imageNamed: "Rechteck.gif")
    15. rechteckLinks.physicsBody = SKPhysicsBody()
    16. rechteckLinks.physicsBody?.isDynamic = false
    17. rechteckLinks.physicsBody?.categoryBitMask = colissionTypes.rechteckLinks.rawValue
    18. let groesse = arc4random_uniform(5)+1
    19. print(groesse)
    20. switch groesse {
    21. case 1:
    22. rechteckLinks.xScale = 0.5
    23. rechteckRechts.xScale = 1.5
    24. case 2:
    25. rechteckLinks.xScale = 1.5
    26. rechteckRechts.xScale = 0.5
    27. case 3:
    28. rechteckLinks.xScale = 1
    29. rechteckRechts.xScale = 1
    30. case 4:
    31. rechteckLinks.xScale = 1.25
    32. rechteckRechts.xScale = 0.75
    33. case 5:
    34. rechteckLinks.xScale = 0.75
    35. rechteckRechts.xScale = 1.25
    36. default:
    37. print("Fehler in der Wahrscheinlichkeit!!!")
    38. }
    39. rechteckRechts.position = CGPoint(x: frame.minX + (rechteckRechts.size.width / 2), y: frame.maxY)
    40. rechteckLinks.position = CGPoint(x: frame.maxX - (rechteckLinks.size.width / 2), y: frame.maxY)
    41. let moveDown = SKAction.moveBy(x: 0, y: -5000, duration: 20.0)
    42. rechteckLinks.run(moveDown)
    43. rechteckRechts.run(moveDown)
    44. self.addChild(rechteckRechts)
    45. self.addChild(rechteckLinks)
    46. }
    47. override func didMove(to view: SKView) {
    48. physicsWorld.gravity = .zero
    49. physicsWorld.contactDelegate = self
    50. figur.xScale = 0.4
    51. figur.yScale = 0.4
    52. figur.position = CGPoint(x: frame.midX, y: frame.maxY / 4)
    53. figur.physicsBody = SKPhysicsBody()
    54. figur.physicsBody!.isDynamic = true
    55. figur.physicsBody!.categoryBitMask = colissionTypes.figur.rawValue
    56. figur.physicsBody!.contactTestBitMask = colissionTypes.rechteckRechts.rawValue | colissionTypes.rechteckLinks.rawValue
    57. self.addChild(figur)
    58. self.backgroundColor = SKColor.white
    59. let wait1 = SKAction.wait(forDuration: 3)
    60. let timer = SKAction.repeatForever(SKAction.sequence([wait1, SKAction.run {
    61. self.addRechteck()
    62. }]))
    63. self.run(timer, withKey: "addRechteck")
    64. }
    65. func didBegin(_ contact: SKPhysicsContact) {
    66. let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
    67. switch contactMask {
    68. case colissionTypes.figur.rawValue | colissionTypes.rechteckLinks.rawValue:
    69. print("contact")
    70. case colissionTypes.figur.rawValue | colissionTypes.rechteckRechts.rawValue:
    71. print("contact")
    72. default:
    73. return
    74. }
    75. }
    76. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    77. for touch in (touches ){
    78. let location = touch.location(in: self)
    79. if figur.contains(location){
    80. figur.position = location
    81. }
    82. }
    83. }
    84. override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    85. for touch in (touches ) {
    86. let location = touch.location(in: self)
    87. if figur.contains(location){
    88. figur.position = location
    89. }
    90. }
    91. }
    92. }
    Alles anzeigen
  • Hatte etwas Interesse, mal mit SpriteKit zu experimentieren und habe mir daher
    ein Projekt mit obigem Code erstellt und versucht, den Fehler zu finden.

    Es hat auch recht lange gedauert, aber offenbar muss bei den Rechtecken
    die collisionBitMask auf 0 gesetzt werden:

    Quellcode

    1. rechteckRechts.physicsBody?.collisionBitMask = 0
    2. rechteckLinks.physicsBody?.collisionBitMask = 0