swift - 缺少联系代表
问题描述
我正在尝试为我的应用程序创造一个新的水平。老实说,我只是将我的代码从视图控制器和游戏场景复制并粘贴到我更改了名称的其他文件中。是的,我确实也更改了文件内部的名称,所以它会匹配新的级别。但是,我的联系人代表现在无法在我的新级别上工作。我怎样才能解决这个问题?
Cannot assign value of type 'Level1' to type 'SKPhysicsContactDelegate?'
我究竟做错了什么?我刚刚检查了我在创建新关卡之前拥有的主文件,现在它出现了错误。我没有更改任何编码。
import SpriteKit
import GameplayKit
class Level1: SKScene {
var ball = SKSpriteNode()
var danger1 = SKSpriteNode()
var danger2 = SKSpriteNode()
var goal = SKSpriteNode()
over
ride func didMove(to view: SKView) {
physicsWorld.contactDelegate = self
ball = self.childNode(withName: "ball") as! SKSpriteNode
danger1 = self.childNode(withName: "danger1") as! SKSpriteNode
danger2 = self.childNode(withName: "danger2") as! SKSpriteNode
goal = self.childNode(withName: "goal") as! SKSpriteNode
let border = SKPhysicsBody(edgeLoopFrom: self.frame)
border.friction = 0
border.restitution = 0
danger1.physicsBody = SKPhysicsBody(rectangleOf: danger1.size)
danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
danger1.physicsBody?.isDynamic = false
danger2.physicsBody = SKPhysicsBody(rectangleOf: danger2.size)
danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
danger2.physicsBody?.isDynamic = false
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2)
ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory | PhysicsCategories.goalCategory
ball.physicsBody?.collisionBitMask = PhysicsCategories.none
ball.physicsBody?.isDynamic = true
ball.physicsBody!.affectedByGravity = false
goal.physicsBody = SKPhysicsBody(rectangleOf: goal.size)
goal.physicsBody?.categoryBitMask = PhysicsCategories.goalCategory
goal.physicsBody?.isDynamic = false
setupPhysics()
startGame()
}
func setupPhysics() {
physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)
physicsWorld.contactDelegate = self
}
func startGame() {
ball.position = CGPoint(x: 0, y: 550)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
ball.position.x = location.x
ball.position.y = location.y
}
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
}
}
extension GameScene: SKPhysicsContactDelegate {
func didBegin(_ contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.dangerCategory {
print("Contact")
} else if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.goalCategory {
print("goal contact")
}
}
}
解决方案
而不是创建扩展名,而是创建扩展GameScene
名Level1
extension Level1: SKPhysicsContactDelegate
推荐阅读
- google-calendar-api - 如何使用日历 API 识别 Google 日历“不在办公室”事件
- sql - 左连接以从同一视图中分离查询
- node.js - Travis 在子目录中构建
- ipfs - IPFS js - 是否有可能知道哪些对等方持有哪些数据?
- python - 检查数据框中的列是否包含字符串列表中的任何项目
- ckeditor - TYPO3 v10:删除
自定义 RTE 字段中的段落周围的标签(CKeditor)
- java - Visual Studio Code 不允许我实现我的接口(Java)
- objective-c - 如何以编程方式创建 Cocoa 应用程序主菜单应用程序
- php - 如果价格为零,则从 WooCommerce 产品附加组件下拉菜单中隐藏价格
- r - 悬崖三角洲错误:t 的所有值都等于 1 \n 无法计算置信区间