您好,我正在使用 swift 在 spritekit 中制作一个简单的 2d sidescroller 游戏,我遇到了一个我无法解决的问题。我有一个名为 (createPlatforms) 的函数来生成一些平台(每个平台都在另一个平台之上)并且平台从右到左移动。我还添加了一个名为 isJumping 的 Bool 变量,我希望如果变量 isJumping 为真,则平台 physicsbody 的值为 nil,以便玩家可以跳到它上面并降落在它上面。我有点设法做到了。它适用于第一个平台,但不适用于其他平台。玩家跳到第一个平台上方并降落在上面,但他不能跳到第二个或第三个平台上方。有时大约有 10% 的时间它适用于所有平台,他可以跳到上面并降落在它们上,但大多数时候它不起作用。
提前谢谢你。
我的跳转方法:
func jump() {
isJumping = true
let jumpBlock = SKAction.runBlock({
() in
self.Dragon.physicsBody?.velocity = CGVectorMake(0, 0)
self.Dragon.physicsBody?.applyImpulse(CGVectorMake(0, 140)) // Jump Impulse
})
self.runAction(jumpBlock)
runAfterDelay(0.3) { /* 0.3 Seconds */
self.isJumping = false
}
}
//Delay function
func runAfterDelay(delay: NSTimeInterval, block: dispatch_block_t) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue(), block)
}
生成平台的方法:
func createPlatforms() {
Platform1 = SKSpriteNode(imageNamed:"Platform")
Platform2 = SKSpriteNode(imageNamed:"Platform")
Platform3 = SKSpriteNode(imageNamed:"Platform-Small")
Platform1.size = CGSize(width: frame.width / 3, height: frame.height / 25)
Platform2.size = CGSize(width: frame.width / 3, height: frame.height / 25)
Platform3.size = CGSize(width: frame.width / 6, height: frame.height / 25)
Platform1.position = CGPoint(x: self.frame.width + 330, y: self.frame.height - 285)
Platform2.position = CGPoint(x: self.frame.width + 500, y: self.frame.height - 210)
Platform3.position = CGPoint(x: self.frame.width + 570, y: self.frame.height - 135)
Platform1.physicsBody = SKPhysicsBody(rectangleOfSize: Platform1.size)
Platform1.zPosition = 6
Platform1.physicsBody?.categoryBitMask = PhysicsCatagory.Platform1
Platform1.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform1.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform1.physicsBody?.dynamic = false
Platform2.physicsBody = SKPhysicsBody(rectangleOfSize: Platform2.size)
Platform2.zPosition = 7
Platform2.physicsBody?.categoryBitMask = PhysicsCatagory.Platform2
Platform2.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform2.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform2.physicsBody?.dynamic = false
Platform3.physicsBody = SKPhysicsBody(rectangleOfSize: Platform3.size)
Platform3.zPosition = 8
Platform3.physicsBody?.categoryBitMask = PhysicsCatagory.Platform3
Platform3.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform3.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform3.physicsBody?.dynamic = false
Platform1.runAction(moveAndRemove)
Platform2.runAction(moveAndRemove)
Platform3.runAction(moveAndRemove)
self.addChild(Platform1)
self.addChild(Platform2)
self.addChild(Platform3)
let distance = CGFloat(self.frame.width + 1000)
let moveGroundObjects = SKAction.moveByX(-distance * 1.3, y: 0, duration: NSTimeInterval(0.011 * distance))
let removeGroundObjects = SKAction.removeFromParent()
moveAndRemove = SKAction.sequence([moveGroundObjects, removeGroundObjects])
runAfterDelay(7) {
self.createPlatforms()
}
}
让platform的physicbody为nil的方法:
func makePlatformsNil() {
if isJumping == true {
Platform1.physicsBody = nil
Platform2.physicsBody = nil
Platform3.physicsBody = nil
} else if isJumping == false {
Platform1.physicsBody = SKPhysicsBody(rectangleOfSize: Platform1.size)
Platform1.physicsBody?.categoryBitMask = PhysicsCatagory.Platform1
Platform1.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform1.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform1.physicsBody?.dynamic = false
Platform1.physicsBody?.allowsRotation = false
Platform2.physicsBody = SKPhysicsBody(rectangleOfSize: Platform2.size)
Platform2.physicsBody?.categoryBitMask = PhysicsCatagory.Platform2
Platform2.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform2.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform2.physicsBody?.dynamic = false
Platform2.physicsBody?.affectedByGravity = false
Platform3.physicsBody = SKPhysicsBody(rectangleOfSize: Platform3.size)
Platform3.physicsBody?.categoryBitMask = PhysicsCatagory.Platform3
Platform3.physicsBody?.collisionBitMask = PhysicsCatagory.Dragon
Platform3.physicsBody?.contactTestBitMask = PhysicsCatagory.Dragon
Platform3.physicsBody?.dynamic = false
Platform3.physicsBody?.affectedByGravity = false
}
}
有人可以帮帮我吗?我因为三个弱点而陷入困境,我现在真的很沮丧:-/我相信我的问题可以由比我更有编码经验的人轻松解决
最佳答案
这里的代码少了很多,更干净也更容易管理。 (所有平台应该共享同一个类别,Dragon类别需要小于Platform)
注意:未在 XCode 上进行验证测试
func didBeginContact(contact: SKPhysicsContact) {
let (firstBody,secondBody) = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? (contact.bodyA,contact.bodyB) : (contact.bodyB,contact.bodyA)
// check if on Platform
if (firstBody.categoryBitMask == PhysicsCatagory.Dragon && secondBody.categoryBitMask == PhysicsCatagory.Platform) {
if firstBody.velocity.dy < -0.0 {
secondBody.collisionBitMask |= physicsCatagory.Dragon
}
}
}
func didEndContact(contact: SKPhysicsContact) {
let (firstBody,secondBody) = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? (contact.bodyA,contact.bodyB) : (contact.bodyB,contact.bodyA)
// check if on Platform
if (firstBody.categoryBitMask == PhysicsCatagory.Dragon && secondBody.categoryBitMask == PhysicsCatagory.Platform) {
//No matter what way dragon is moving, if he is off the platform, let's turn off the collision
secondBody.collisionBitMask &= ~(physicsCatagory.Dragon)
}
}
关于ios - SpriteKit 和 Swift,如果条件为真,则将平台设置为 nil 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508650/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里