我认为没有办法做到这一点,但有没有办法检测2个SKSpriteNodes何时相互交叉,但仍然允许它们重叠,所以它们实际上并没有相互反弹?
我知道我可以只有一个没有物理体,然后写一些代码来检查他们的坐标,但我想也许我可能会在Sprite Kit中遗漏一些东西,我可以用SK方法检测到它.
有没有办法改变已经用另一个图像初始化的精灵的图像?
我试过了:
Run Code Online (Sandbox Code Playgroud)if ([node.name isEqualToString:@"NameX"]) { SKAction *fadeOut = [SKAction fadeOutWithDuration:0.3]; SKAction *fadeIn = [SKAction fadeInWithDuration:0.3]; [self.sprite runAction:fadeOut]; [self runAction:fadeOut completion:^{ self.sprite = [SKSpriteNode spriteNodeWithImageNamed:@"NameY"]; [self.sprite runAction:fadeIn] }];}
我正在尝试创建SKSpriteNode的子类,它可以检测用户交互(点按,双击并按住),然后按照委托.在我看来,这似乎是一个相对普遍的需求,但是:
我错了吗?我不禁觉得SpriteKit应该有一些标准来处理这么基本的东西.我知道有UIGestureRecognizer,但它似乎与特定的SKNode而不是UIViews非常兼容.
这就是我目前所拥有的.基于Apple的示例,我在主类文件中包含了所有非设备特定的代码:
import SpriteKit
enum ActionType: Int {
case Single
case Double
case Hold
}
protocol EnvironmentElementDelegate {
func handleActionOnElement(element: EnvironmentElement, actionType: ActionType)
}
class EnvironmentElement: SKSpriteNode {
let delegate: EnvironmentElementDelegate!
init(imageNamed: String, elementNamed: String, delegate: EnvironmentElementDelegate) {
self.delegate = delegate
let texture = SKTexture(imageNamed: imageNamed)
super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
self.name = elementNamed
userInteractionEnabled = true
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Run Code Online (Sandbox Code Playgroud)
...然后将所有特定于iOS的代码放在单独的扩展文件中:
import SpriteKit
extension EnvironmentElement {
override func touchesBegan(touches: …Run Code Online (Sandbox Code Playgroud) 我试图在具有固定板的益智游戏中添加对Voice Over accessibility的支持.但是,我很难UIAccessibilityElements出现.
现在我重写accessibilityElementAtIndex,accessibilityElementCount并indexOfAccessibilityElement在我的SKScene.
他们返回一组可访问的元素:
func loadAccessibleElements()
{
self.isAccessibilityElement = false
let pieces = getAllPieces()
accessibleElements.removeAll(keepCapacity: false)
for piece in pieces
{
let element = UIAccessibilityElement(accessibilityContainer: self.usableView!)
element.accessibilityFrame = piece.getAccessibilityFrame()
element.accessibilityLabel = piece.getText()
element.accessibilityTraits = UIAccessibilityTraitButton
accessibleElements.append(element)
}
}
Run Code Online (Sandbox Code Playgroud)
其中piece是子类,SKSpriteNode并getAccessibilityFrame定义为:
func getAccessibilityFrame() -> CGRect
{
return parentView!.convertRect(frame, toView: nil)
}
Run Code Online (Sandbox Code Playgroud)
现在,一个(尺寸错误的)accessibility元素似乎出现在错误的地方.
有人能指出我正确的方向吗?
非常感谢
编辑:
我已经尝试了一个hack-ish工作,将UIView放在SKView上,UIButton元素放在与SKSpriteNodes相同的位置.但是,可访问性仍然不希望工作.视图按如下方式加载:
func loadAccessibilityView()
{
view.isAccessibilityElement = false
view.accessibilityElementsHidden = false
skView.accessibilityElementsHidden = …Run Code Online (Sandbox Code Playgroud) 我一直在使用 SKTexture 按以下方式更改 didBeginContact 中的 SKSpriteNode 颜色和大小。
if firstBody.categoryBitMask == spriteCategory && secondBody.categoryBitMask == enemyCategory {
var newSprite = firstBody.node
let newImage = SKTexture(imageNamed: "newSprite.png")
(newSprite as? SKSpriteNode)?.size = newImage.size() //magic
oldToNewSpriteAction = SKAction.setTexture(newImage)
newSprite!.runAction(oldToNewSpriteAction)
}
Run Code Online (Sandbox Code Playgroud)
现在我正在创建一个没有 SKTextures 的示例代码,按以下方式设置我的 SKSpriteNodes:
oldSprite = SKSpriteNode(color: SKColor.blueColor(), size: oldSpriteSize)
newSprite = SKSpriteNode(color: SKColor.BrownColor(), size: newSpriteSize)
Run Code Online (Sandbox Code Playgroud)
如何在没有 SKTextures 的情况下更改 didBeginContact 中的精灵颜色和大小?
我在一个SKSpriteNode(名称:square)和一个SKLabel(name:label)中创建了一个场景Case.sks(使用Level Editor).在我的主场景GameScene.sks中,我使用带有"Case"的SKReferenceNode作为参考.
我需要从我的主场景中访问"方形"精灵.
我的第一个想法是直接调用子节点:
let firstSquare = childNode(withName: "square") as! SKSpriteNode
Run Code Online (Sandbox Code Playgroud)
但我得到了:
Fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
所以我尝试过:
let caseRef = childNode(withName: "Case") as! SKReferenceNode
let firstSquare = caseRef.childNode(withName: "square") as! SKSpriteNode
Run Code Online (Sandbox Code Playgroud)
但我得到了第一个广场线:
Fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
如何获取参考场景的子节点?
如何从SKSpriteNode?访问图像文件名?我一直试图谷歌这个,但似乎没有答案可用.这是我的代码中无用的部分:
current_ingredient?.name = String(describing: current_ingredient?.texture)
print("Filename: \(current_ingredient?.name)")
Run Code Online (Sandbox Code Playgroud)
print命令返回:
Filename: Optional("Optional(<SKTexture> \'ingredient14\' (110 x 148))")
Run Code Online (Sandbox Code Playgroud)
所以,问题是,我怎么才得到"ingredient14"?
我能够在项目的.sks文件中设置我自己的自定义对象的alpha掩码,但我不知道如何以编程方式进行.
有人在我的其他问题之一中告诉我SpriteKit比UI. 我在网上搜索了如何开始使用SpriteKit,我得到了这个:https : //www.raywenderlich.com/145318/spritekit-swift-3-tutorial-beginners。我把图片和所有东西都放进去了,我把这段代码放在了:
import SpriteKit
class GameScene: SKScene {
// 1
let player = SKSpriteNode(imageNamed: "player")
override func didMove(to view: SKView) {
// 2
backgroundColor = SKColor.white
// 3
player.position = CGPoint(x: size.width * 0.1, y: size.height * 0.5)
// 4
addChild(player)
}
}
Run Code Online (Sandbox Code Playgroud)
(他们让我输入的代码),当我运行它时,我只看到一个空白屏幕。在教程中,它有一个忍者,但我的只是一个空白屏幕。
有人能帮忙吗?
如何用一根手指“触摸并拖动”旋转 SpriteNode,以便:
我尝试过的事情:
使用 CGAffineTransform 的 CGAffineTransformMakeRotation来影响 SpriteKit 中旋钮的旋转。但我无法弄清楚如何在 SpriteNode 上使用 CGAffineTransformMakeRotation。我可以将不同类型的对象放入我的场景中或在它上面,但这是不对的。
例如,Matthijs Hollemans 的 MHRotaryKnob https://github.com/hollance/MHRotaryKnob
。我将 Hollemans 旋钮从 Objective C 转换为 Swift 4,但在尝试在 SpriteKit 中使用它来旋转精灵时遇到了麻烦。我不明白,因为我不知道如何knobImageView.transform = CGAffineTransformMakeRotation (newAngle * M_PI/180.0);在 Swift 中使用 SpriteKit。我知道我可以使用 Hollemans Objective C 类并将 UIImage 推送到我的场景顶部,但这似乎不是最好也最优雅的解决方案。
我还将Wex的解决方案从 Objective C 翻译成 Swift Rotate image on center using a finger touch Using Allan Weir的关于处理代码中 CGAffineTransform 部分的建议/sf/answers/2920685281/ 但是那不起作用。
我试过直接在我的精灵上设置zRotation而不使用 .physicalBody …
skspritenode ×10
sprite-kit ×10
swift ×8
ios ×4
objective-c ×2
swift2 ×1
swift3 ×1
swift4.1 ×1
xcode ×1
xcode8-beta2 ×1