- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试自己制作 flappy bird。一切正常,但现在我已经添加了 CategoryBitMasks 和所有这些东西,每次我尝试添加这段代码时:
self.physicsworld.contactDelegate = self
我收到错误信息:
Cannot assign a value of type 'GameScene' to a value of type 'SKPhysicsContactDelegate'.
这是我到目前为止编写的代码:
import SpriteKit
class GameScene: SKScene {
//---------------
//Bird
//---------------
var bird = SKSpriteNode()
//---------------
//Pipe's
//---------------
var pipeUp:SKSpriteNode = SKSpriteNode()
var pipeDown:SKSpriteNode = SKSpriteNode()
var pipeDownAnimation:NSMutableArray = NSMutableArray()
var pipeUpAnimation:NSMutableArray = NSMutableArray()
//---------------
//Pipe spawningtimes
//---------------
var lastYieldTimeInterval:NSTimeInterval = NSTimeInterval()
var lastUpdateTimeInterval:NSTimeInterval = NSTimeInterval()
//---------------
//Category bitmasks
//---------------
let birdCategory:UInt32 = 0x1 << 2
let pipeUpCategory:UInt32 = 0x1 << 1
let pipeDownCategory:UInt32 = 0x1 << 0
//didMoveToView Funtion
override func didMoveToView(view: SKView) {
setUpWorld()
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if bird.position.y > frame.size.height - bird.size.height/2 {
}
else {
bird.physicsBody!.velocity = CGVectorMake(0, 0.0)
bird.physicsBody!.applyImpulse(CGVectorMake(0, 17))
}
}
func setUpWorld () {
//---------------
//Physics World
//---------------
physicsWorld.gravity = CGVectorMake(0, -5.0)
//---------------
//setting up the background
//---------------
var background = SKSpriteNode(imageNamed: "background")
background.position = CGPointMake(frame.size.width/2, frame.size.height/2)
background.size = CGSizeMake(frame.size.width, frame.size.height)
background.zPosition = -1.0
addChild(background)
//---------------
//setting up the hills
//---------------
var hills = SKSpriteNode(imageNamed: "hills")
hills.position = CGPointMake(frame.size.width/2, 300)
hills.size = CGSizeMake(frame.size.width, 300)
hills.zPosition = 0
addChild(hills)
//---------------
//setting up the ground
//---------------
var ground = SKSpriteNode(imageNamed: "ground")
ground.size = CGSizeMake(frame.size.width, 150)
ground.position = CGPointMake(frame.size.width/2, 75)
ground.zPosition = 2.0
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(ground.size.width, ground.size.height))
ground.physicsBody!.dynamic = false
ground.physicsBody!.affectedByGravity = false;
addChild(ground)
//---------------
//setting up the bird
//---------------
bird = SKSpriteNode(imageNamed: "bird")
bird.position = CGPointMake(100, frame.size.height/2)
bird.setScale(0.7)
bird.zPosition = 1.0
bird.physicsBody = SKPhysicsBody(rectangleOfSize: bird.size)
bird.physicsBody!.dynamic = true
bird.physicsBody!.categoryBitMask = birdCategory
bird.physicsBody!.contactTestBitMask = pipeUpCategory
bird.physicsBody!.contactTestBitMask = pipeDownCategory
bird.physicsBody!.collisionBitMask = pipeUpCategory & pipeDownCategory
bird.physicsBody!.usesPreciseCollisionDetection = true
addChild(bird)
}
func addPipes () {
//---------------
//Random Pipe Positions
//---------------
var randomPositionUp = CGPoint()
var randomPositionDown = CGPoint()
var random = arc4random() % 10
if random == 0 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 170)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height - 40)
}
else if random == 1 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 160)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height - 30)
}
else if random == 2 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 150)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height - 20)
}
else if random == 3 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 140)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height - 10)
}
else if random == 4 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 130)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height)
}
else if random == 5 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 120)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height + 10)
}
else if random == 6 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 110)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height + 20)
}
else if random == 7 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 100)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height + 30)
}
else if random == 8 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 90)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height + 40)
}
else if random == 9 {
randomPositionUp = CGPointMake(frame.size.width + pipeUp.size.width * 2, frame.size.height/2 - 80)
randomPositionDown = CGPointMake(randomPositionUp.x, frame.size.height + 50)
}
//---------------
//Pipe UP
//---------------
pipeUp = SKSpriteNode(imageNamed: "PipeUp")
pipeUp.position = randomPositionUp
pipeUp.setScale(0.5)
pipeUp.zPosition = 1.0
pipeUp.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(pipeUp.size.width, pipeUp.size.height))
pipeUp.physicsBody!.dynamic = false
pipeUp.physicsBody!.affectedByGravity = false
pipeUp.physicsBody!.categoryBitMask = pipeUpCategory
pipeUp.physicsBody!.contactTestBitMask = birdCategory
pipeUp.physicsBody!.collisionBitMask = birdCategory
pipeUp.physicsBody!.usesPreciseCollisionDetection = true
addChild(pipeUp)
pipeUpAnimation.addObject(SKAction.moveToX(-pipeUp.size.width * 2, duration: 7))
pipeUpAnimation.addObject(SKAction.removeFromParent())
pipeUp.runAction(SKAction.sequence(pipeUpAnimation as [AnyObject]))
//---------------
//Pipe Down
//---------------
pipeDown = SKSpriteNode(imageNamed: "PipeDown")
pipeDown.position = randomPositionDown
pipeDown.setScale(0.5)
pipeDown.zPosition = 1.0
pipeDown.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(pipeDown.size.width, pipeDown.size.height))
pipeDown.physicsBody!.dynamic = false
pipeDown.physicsBody!.affectedByGravity = false
pipeDown.physicsBody!.categoryBitMask = pipeDownCategory
pipeDown.physicsBody!.contactTestBitMask = birdCategory
pipeDown.physicsBody!.collisionBitMask = birdCategory
pipeDown.physicsBody!.usesPreciseCollisionDetection = true
addChild(pipeDown)
pipeDownAnimation.addObject(SKAction.moveToX(-pipeUp.size.width * 2, duration: 7))
pipeDownAnimation.addObject(SKAction.removeFromParent())
pipeDown.runAction(SKAction.sequence(pipeDownAnimation as [AnyObject]))
}
func updateWithTimeSinceLastUpdate (timeSinceLastUpdate: CFTimeInterval) {
lastYieldTimeInterval += timeSinceLastUpdate
if lastYieldTimeInterval > 2 {
lastYieldTimeInterval = 0
addPipes()
}
}
override func update(currentTime: CFTimeInterval) {
var timeSinceLastUpdate = currentTime - lastUpdateTimeInterval
lastUpdateTimeInterval = currentTime
if timeSinceLastUpdate > 1 {
timeSinceLastUpdate = 1/60
lastUpdateTimeInterval = currentTime
}
updateWithTimeSinceLastUpdate(timeSinceLastUpdate)
}
func didBeginContact(contact: SKPhysicsContact) {
var firstBody:SKPhysicsBody
var secondBody:SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
}
else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.categoryBitMask & birdCategory != 0 && secondBody.categoryBitMask & pipeDownCategory != 0 {
birdDidCollidWithPipeDown(firstBody.node as! SKSpriteNode, pipeDown: secondBody.node as! SKSpriteNode)
}
}
func birdDidCollidWithPipeDown(bird: SKSpriteNode, pipeDown: SKSpriteNode) {
bird.removeFromParent()
}
}
最佳答案
您需要使 GameScene
符合 SKPhysicsContactDelegate
,像这样:
class GameScene: SKScene, SKPhysicsContactDelegate {
// ...
}
现在你可以实现你想要的委托(delegate)方法了,SKPhysicsContactDelegate
中的所有方法是可选的,他们会在适当的时候被调用。
有关协议(protocol)的更多信息,我建议查看 The Swift Programming Language: Protocols
关于swift - 无法将类型 "Game Scene"的值分配给类型 "SKPhysicsContactDelegate"的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398750/
我正在使用 JavaFX 2.2.7-b01 编写应用程序。 这是我目前拥有的代码示例。如何允许调整应用程序窗口的大小但保持最初配置的纵横比?换句话说,如果用户调整窗口大小,则窗口宽度应始终保持为窗口
所以我正在努力将我的 cocos2d 游戏移植到 Sprite Kit。 在 cocos2d 中有两种情况,我会在整个游戏场景中叠加一个菜单。第一种情况是暂停,第二种情况是游戏结束。 在 cocos2
我在代码的最后一行遇到错误。 - (SCNScene *)getWorkingScene { SCNScene *workingSceneView = self.scene; if
我需要在代码中手动设置插入符号位置。getCaretPosition()下有一个javafx.scene.control.TextInputControl,但没有设置方法。 如何设置插入符的位置? 最
方法scene(_ scene: UIScene, continue userActivity: NSUserActivity)用户单击通用链接后启动应用程序时不会调用。 当用户单击通用链接后再次打开
我正在使用 ARKit 图像跟踪配置,一旦检测到图像,图像上就会弹出 3D 场景。 但是当我设置两个不同的图像触发两个不同的场景文件时,一张图像总是在同一张图像上弹出两个不同的场景文件。我敢肯定图像不
如何更改存储在网格中的对象的属性?我尝试了这个,但它给了我上面的错误: Group group = new Group(); double dimension_x=100; d
我在填充 javafx tableview 时遇到问题。 我目前正在开发基于 GUI 的事件管理工具(适用于大学),但我一直在尝试填充 Tableview 列表,该列表应该位于边框 Pane 布局的中
大家好,我认识 javafx,我正在尝试将 BorderPane 转换为 anchronPane,同时发生错误,我不知道该怎么做,我正在学习教程,所以请帮忙 import java.io.IOExce
我有创建图像的代码:(m_img 是 javafx.scene.image.Image) Image m_img = new Image("file:" + p_Fil.getAbsoluteFile
当最初从FXML加载Scene时,如何在Java代码中为Scene添加一个新节点? 我已经从FXML加载了,如下所示 Parent root = FXMLLoader.load(getClass().
在以下代码上: ScrollPane scrollPane = new ScrollPane(); 我遇到异常 java.lang.NoClassDefFoundError: javafx/scene
我从 JavaFX 开始。 错误发生在我执行我的程序时,在我尝试这样做之前,它工作正常并且按钮点击有效,但那是在我打算让按钮点击更改文本之前。
我正在制作一个滑动动画以将一个场景切换到另一个场景,但是当我调用此方法时,它在切换场景时有延迟。我发现原因是类Scene的一个方法snapshot()。有没有人有解决办法? 代码: public vo
当发现“条形码”时,我尝试以编程方式更改场景,但我不断收到错误... 导入的模块: import UIKit import AVFoundation import SpriteKit import S
我试图通过场景工具包节点旋转,但它没有旋转。 我想让它绕 y 轴旋转。它是一个球体。 let node = SCNNode() node.geometry = SCNSphere(radius: 1)
在应该加载场景的按钮中,我正在尝试学习使用 guard 语句,但对它在四个“转义”中的每一个中所做的事情感到非常困惑。也不知道在没有场景的情况下应该怎么处理。 此处正确使用的是: continue、r
本文整理了Java中javafx.scene.input.ZoomEvent类的一些代码示例,展示了ZoomEvent类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Ma
我正在使用 JavaFx 和 Scenebuilder,并希望在 Eclipse 中为自己创建一个名为“Taskplanner”的本地应用程序。 我创建了一个新舞台并使用场景设置它(请参阅 Main.
我在舞台上有一个场景。场景的宽度为 337.0 像素。但是,当我将它添加到舞台时,舞台的大小为 337.6 像素,由于 0.6 像素的差异,在屏幕的右边缘留下了一个白色间隙。 我尝试使用 stage.
我是一名优秀的程序员,十分优秀!