我正在Swift中编写一个辅助函数,用于SpriteKit游戏,它将检查是否已正确设置了冲突拘留.
我想检查我的GameScene是否实现了协议SKPhysicsContactDeletegate并且还包含该didBeginContact功能.
我有以下代码,在Xcode的自动完成的帮助下编写:
if GameScene(conformsToProtocol(SKPhysicsContactDelegate)) {
if GameScene(respondsToSelector(didBeginContact(SKPhysicsContact))) {
print("Self implements SKPhysicsContactDelegate and didBeginContact appears to be present")
}
}
Run Code Online (Sandbox Code Playgroud)
然后Xcode抱怨我的conformsToProtocol抱怨
'参数标签'(_ :)'与任何可用的重载都不匹配'
没有任何建议如何解决.它也反对respondsToSelector,说明这一点
'无法将类型的值'(SKPhysicsContact).Type'(又名'SKPhysicsContact.Type')转换为预期的参数类型'SKPhysicsContact'
如何检查我的GameScene是否符合此协议并实现此功能?
编辑:这是我的代码基于答案:
if GameScene.self is SKPhysicsContactDelegate {
print("Yes it's a delegate")
}
Run Code Online (Sandbox Code Playgroud)
输出: Yes it's a delegate
let yy = (GameScene.self as? SKPhysicsContactDelegate)?.didBeginContact
print("yy is \(yy)")
Run Code Online (Sandbox Code Playgroud)
输出: yy is nil
if (GameScene.self as? SKPhysicsContactDelegate)?.didBeginContact != nil {
print("Yes it's a delegate and the function is there")
} …Run Code Online (Sandbox Code Playgroud) Python的新手并且已经完成了一些阅读,我在自定义类类方法而不是实例方法中创建了一些方法.
所以我测试了我的代码但是我没有改变一些方法调用来调用类而不是实例中的方法,但它们仍然有效:
class myClass:
@classmethod:
def foo(cls):
print 'Class method foo called with %s.'%(cls)
def bar(self):
print 'Instance method bar called with %s.'%(self)
myClass.foo()
thing = myClass()
thing.foo()
thing.bar()
Run Code Online (Sandbox Code Playgroud)
这会产生:
class method foo called with __main__.myClass.
class method foo called with __main__.myClass.
instance method bar called with <__main__.myClass instance at 0x389ba4>.
Run Code Online (Sandbox Code Playgroud)
所以我想知道为什么我可以在实例(thing.foo)上调用类方法(foo),(虽然它是传递给方法的类)?这有点道理,因为'thing'是'myClass',但是我期待Python给出一个错误,说'foo是一个类方法并且无法在实例上调用'.
这只是继承的预期后果,'thing'对象从其超类继承foo方法吗?
如果我尝试通过类调用实例方法:
myClass.bar()
Run Code Online (Sandbox Code Playgroud)
然后我得到:
TypeError: unbound method bar() must be called with myClass instance...
Run Code Online (Sandbox Code Playgroud)
这很有道理.
我有以下用于 GraphViz 的 .dot 语言文件:
digraph {
graph [ dpi = 300 ];
Hello -> World
Hello -> World
Hello -> World
}
Run Code Online (Sandbox Code Playgroud)
呈现为:
但我不想要重复的链接,即我希望它呈现为:
是的,我可以向生成点文件的程序添加逻辑,但是如果有一个 GraphVix 参数来执行此操作,它将非常有用。
谢谢。
编辑:在这里提高死者,但是将其标记为重复的问题在 2 个节点之间有多个连接,但每个连接都有不同的标签,因此并不完全相同,尽管使用“strict”关键字的建议确实有效。
尝试将SKSpriteNode子类化,以使我的游戏代码更清晰,我显然不理解某些东西.这是一个非常简单的例子:我Alien.swift使用以下内容创建一个新的Swift文件:
import SpriteKit
class Alien: SKSpriteNode {
}
Run Code Online (Sandbox Code Playgroud)
在我的游戏中,我做:
let alienSprite: Alien = Alien()
print("It's an \(alienSprite)")
Run Code Online (Sandbox Code Playgroud)
我得到:
这是一个(SKSpriteNode)名称:'(null)......'
甚至Xcode也说它是'aliensSprite':
为什么在运行时不打印它是'alienSprite'?
编辑:在这里合并我的一条评论 - 我实际上是从我的.sks文件中获取精灵,我将它放在场景编辑器中并设置其自定义类.我尝试用以下方法来接它:
let alien = childNodeWithName("alien") as! alienSprite
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Cannot cast SKSpriteNode to alientSprite
Run Code Online (Sandbox Code Playgroud) 我问自己一个关于z/os日志的问题:
我只是想知道所有开始的操作是否总是被$ HASP373和IEF403I调用?对于由$ HASP395和IEF404I调用的状态Ended?
好的 - 我确定这是重复的,而且 Whirlwind 或 KnightOfDragons 已经发布了一个解决方案,但我找不到它。
我正在使用 Sprite-Kit 在 Swift 中编写 Space Invader 的克隆。我遇到的问题是,当入侵者炸弹击中我的船时,代码有时会记录 2 或 3 次碰撞,从而立即结束游戏。这是处理炸弹/船舶碰撞的“didBeginContact”部分:
case category.bomb.rawValue | category.ship.rawValue:
print("Bomb hit ship!")
let bomb = contact.bodyA.categoryBitMask == category.bomb.rawValue ? contact.bodyA.node : contact.bodyB.node
bomb?.physicsBody?.contactTestBitMask = 0 // Seems to prevent multiple contacts with same bomb
ship.physicsBody!.contactTestBitMask = 0 // We'll reset this after the death animation
bomb?.removeAllActions()
ship.removeAllActions()
bomb?.removeFromParent()
ships -= 1
if ships == 0 { endScene(won: false, withMessage: "A bomb got you!") }
Run Code Online (Sandbox Code Playgroud)
当我运行游戏时,我看到:
Bomb …Run Code Online (Sandbox Code Playgroud) 在Swift中有什么方法可以告诉我什么时候SKSpriteNode已经从场景中删除了?我不认为它实际上是在removeFromParent调用时完成的,但我认为它是在以后完成的,当时Sprite-Kit认为这样做很方便.
我正在尝试了解整个生命周期,我注意到didBeginContact即使在精灵被移除后,精灵仍然可能涉及接触和碰撞.
如果我打印出内容children(即包含场景中所有子节点的数组),我看到removeFromParent调用时精灵被删除,但精灵仍然可用(至少,对于SK游戏循环的执行) .
编辑:这个问题来自我之前的一个问题,即关于didBeginContact一次接触被多次调用(Sprite-Kit为单次接触注册多次碰撞)并发现在第一次接触期间移除精灵并未阻止后续接触.(因为SK事先已经"联系"了联系人.)所以我想知道精灵什么时候被删除了.
我对 docker 完全陌生,并且是第一次使用它。
我已经为 Mac OS 安装了 Docker 桌面并成功运行了“Hello-world”容器。我现在正在尝试从https://hub.docker.com/r/omerio/graphviz-server(这是我真正想要 Docker 的)运行这个“omerio/graphviz-server” ,尽管“docker pull omerio/ graphviz-server' 命令成功完成:
devops$ docker pull omerio/graphviz-server
Using default tag: latest
latest: Pulling from omerio/graphviz-server
863735b9fd15: Pull complete
4fbaa2f403df: Pull complete
44be94a95984: Pull complete
a3ed95caeb02: Pull complete
ae092b5d3a08: Pull complete
d0edb8269c6a: Pull complete
Digest: sha256:02cd3e2355526a927e951a0e24d63231a79b192d4716e82999ff80e0893c4adc
Status: Downloaded newer image for omerio/graphviz-server:latest
Run Code Online (Sandbox Code Playgroud)
启动容器的命令(在https://hub.docker.com/r/omerio/graphviz-server 上'docker run -d -p : omerio/graphviz-server'给出):给了我错误消息:
devops$ docker run -d -p : omerio/graphviz-server
docker: invalid publish opts format (should be …Run Code Online (Sandbox Code Playgroud) 在此网页上:http : //viz-js.com/,我们看到一个从文本文件渲染的图形。
如果将鼠标悬停在图形元素之一上,其标签将显示在弹出窗口中。(在此示例中为“开始”)
问题:是否有使标签变为可选状态或添加一些JavaScript以将弹出窗口的文本复制到剪贴板的方法?
我对此的实现具有很长的节点名称(最多44个字符),我希望能够以某种方式进行复制。
谢谢。
编辑:到目前为止尝试的操作。
使用Chrome的“检查”选项,我发现SVG中的节点似乎具有“节点”的类名,因此我尝试了以下JavaScript,但无效:
$('.big').hover(function () {
// will not work, no user action
$('input').select();
document.execCommand('copy');
});
$('.big').mousedown(function () {
//works
document.execCommand('copy');
});
Run Code Online (Sandbox Code Playgroud)
而且我似乎无法使用任何CSS样式来影响图形的外观。
有时在我的SpriteKit程序中,我的碰撞和接触(使用SKPhysicsBody)没有按预期方式触发或起作用。我想我已经设置了所需的一切,但仍无法获得正确的交互。我如何轻松检查将与哪些碰撞以及设置了哪些物体以生成联系人?
sprite-kit ×4
swift ×4
graphviz ×3
class-method ×1
docker ×1
inheritance ×1
javascript ×1
macos ×1
mainframe ×1
python ×1
python-2.7 ×1
subclassing ×1
svg ×1
zos ×1