我还在玩iOS中的SpriteKit,并且已经进行了大量的阅读和大量的实验.关于坐标,框架和子节点,我发现了*我感到很困惑.
考虑这段代码,我试图在我的宇宙飞船精灵周围绘制一个绿色框用于调试目的:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
// VERSION 1
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
let debugFrame = SKShapeNode(rect: spaceship.frame)
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
// VERSION 2
// spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
spaceship.setScale(0.50)
self.addChild(spaceship)
}
Run Code Online (Sandbox Code Playgroud)
如果我用上面标有"VERSION 1"的行添加太空船精灵的集合,我得到这个:

这显然是错的.但是,如果我评论了行上面标有"版本1",而是使用了行标"版本2",我得到我想要的东西:

请注意,标记为版本1和版本2的行的实际代码是相同的:spaceship.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
那么为什么当我设置宇宙飞船精灵的位置时这很重要?
根据我的思维方式,宇宙飞船精灵的位置与debugFrame的位置无关,因为debugFrame是宇宙飞船精灵的孩子,因此,它的坐标应该相对于宇宙飞船精灵的框架 - 对吗?
谢谢WM
*这与我昨天提出的问题有些相关:
在iOS上的SpriteKit中,缩放纹理的精灵会产生不正确的帧?
但是a)我现在明白了一个,而且b)这个是不同的,它应该得到自己的问题.
更新:
嗯 - 谢谢,伙计们对于下面的想法,但我仍然没有得到它,也许这会有所帮助.
我修改了我的代码以打印出相关的位置和框架:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
println("Spaceship0 Pos \(spaceship.position) Frame = \(spaceship.frame)")
// VERSION …Run Code Online (Sandbox Code Playgroud) SKShapeNode比方说我为它创建和创建子项(例如十字及其两条相交线).十字是父,十字线是孩子.你怎么能改变所有父母孩子的alpha值?目前只使用:
parent.alpha = 0.5
Run Code Online (Sandbox Code Playgroud)
不会更改其子项的alpha值.
如果有人能够创建可以解决此问题或使用任何其他方式的着色器,请回复.这篇文章是对我之前的帖子的回应:( 斯威夫特:使相同颜色的半透明重叠线在交叉时不变色)我试图让半透明线相交的较暗点消失,如果有人能够解决这个问题.
以下是一些代码示例:
let nodeParent = SKShapeNode()
let nodeOne = SKShapeNode(circleOfRadius: 5)
let nodeTwo = SKShapeNode(circleOfRadius: 5)
//Set the color of the circles, I'm not sure if this is the right way
nodeOne.fillColor = UIColor.init(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
nodeTwo.fillColor = UIColor.init(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
nodeParent.addChild(nodeOne)
nodeParent.addChild(nodeTwo)
addChild(nodeParent)
nodeParent.alpha = 0.5
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在使用SKAction中的repeatActionForever方法来更改SKShapeNode的颜色.这是我的代码:
SKShapeNode *ship = [SKShapeNode node];
[ship setPath:CGPathCreateWithRoundedRect(CGRectMake(-15, -15, 40, 17), 6.25, 6.25, nil)];
ship.fillColor = [SKColor redColor];
ship.glowWidth = 3;
[ship runAction:[SKAction repeatActionForever:[SKAction sequence:@[
[SKAction colorizeWithColor:[SKColor blueColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction colorizeWithColor:[SKColor redColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],
[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3]]]]];
return ship; //because it's a method
Run Code Online (Sandbox Code Playgroud)
它看起来对我来说,但船不改变颜色.我做错了什么,谢谢.
我想创建一个内容为图像(.png)的圆,并且基于SKShapeNode类引用,我认为我可以使用SKShapeNode.filltexture()函数来设置图像的纹理.但是当我运行下面的代码时,我得到了圆圈,但是我试图加载的"猫黑"的图像没有显示.我检查了我的Image.Assets是否有正确名称的图像,所以其他东西就出现了.有任何想法吗?我附上以下输出:
func newCircle(photo:String, position:CGPoint) -> SKShapeNode {
let circle = SKShapeNode.init(circleOfRadius: 27)
circle.fillTexture = SKTexture.init(image: UIImage(named: "cat-black")!)
circle.strokeColor = UIColor.greenColor()
circle.lineWidth = 4
circle.name = "aggroNode"
circle.position = position
return circle
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个分为象限的圆圈.我试图让每个象限的末端四舍五入,每个象限之间有一个给定的间隙,但我得到了一些奇怪的行为.我想我错过了一些东西.下面是我得到的图像和相关代码.我希望结局类似于Apple Watch活动环.
class GameScene: SKScene {
let radius = CGFloat(100)
var topRightPathNode : SKShapeNode!
var bottomRightPathNode : SKShapeNode!
var bottomLeftPathNode : SKShapeNode!
var topLeftPathNode : SKShapeNode!
override func didMove(to view: SKView) {
}
override init(size: CGSize) {
super.init(size: size)
let topRightPath = arcSegment(center: CGPoint.zero, radius: radius, strokeWidth: 18, gapWidth: 6)
// TOP RIGHT
topRightPathNode = SKShapeNode(path: topRightPath)
topRightPathNode.fillColor = SKColor.white
topRightPathNode.lineWidth = 0
topRightPathNode.position = CGPoint(x: 320, y: 240)
addChild(topRightPathNode)
// BOTTOM RIGHT
var reflectOnY = CGAffineTransform(scaleX: 1.0, y: -1.0) …Run Code Online (Sandbox Code Playgroud) 我有一个SKShapeNode(在这种情况下是矩形),我试图沿着它的中心旋转.然而,它沿着屏幕的左下角旋转.由于我无法为SKShapeNode设置锚点,如何实现我的要求(沿着中心旋转形状).这是我正在尝试的代码.
let rectangle = SKShapeNode()
rectangle.path = UIBezierPath(rect: CGRectMake(view.frame.width/4, view.frame.height/2, view.frame.width/2, view.frame.width/2)).CGPath
rectangle.fillColor = UIColor.yellowColor()
rectangle.strokeColor = UIColor.yellowColor()
let oneRevolution = SKAction.rotateByAngle(360, duration: 100.0)
let repeat = SKAction.repeatActionForever(oneRevolution)
rectangle.runAction(repeat)
Run Code Online (Sandbox Code Playgroud)

我试图通过首先将 SKShapeNode 转换为纹理来将 SKShapeNode 转换为 Sprite 节点。然而结果是看不见的精灵。物理体通常在那里,但没有显示图形。我想我尝试转换 SKShapeNode 的方式有问题,但我想不出是什么。你知道出了什么问题吗?感谢所有帮助!
let createdShape = SKShapeNode(path: path)
createdShape.physicsBody = SKPhysicsBody(edgeLoopFromPath: createdShape.path)
createdShape.physicsBody?.categoryBitMask = PhysicsCategory.Shape
createdShape.physicsBody?.contactTestBitMask = PhysicsCategory.None
createdShape.name = "paintedArea"
createdShape.strokeColor = shapeBorderColor
createdShape.lineWidth = 5.0
createdShape.fillColor = shapeFillColor
createdShape.alpha = 1.0
createdShape.zPosition = shapeZPosition
let texture = view?.textureFromNode(createdShape)
println(texture?.description)
let sprite = SKSpriteNode(texture: texture)
sprite.physicsBody = createdShape.physicsBody
sprite.position = createdShape.position
sprite.color = UIColor.blueColor()
self.addChild(sprite)
Run Code Online (Sandbox Code Playgroud) 如何在矩形中画一个洞?我想绘制一个矩形,里面有一个空洞,背景可以显示.
我正在使用SKShapeNode创建一个矩形,但我不知道如何在其中创建一个洞(圆圈).
我试图用SKShapeNode纹理旋转,但它不起作用。基本上,我有一个带有纹理的圆圈,我试图使用与以下操作相同的方式使其旋转SKSpriteNode:
let spin = SKAction.rotateByAngle(CGFloat(M_PI/4.0), duration: 1)
Run Code Online (Sandbox Code Playgroud)
问题是圆圈在旋转,但纹理没有旋转。我可以使用以下代码检查这一点:
let wait = SKAction.waitForDuration(0.5)
let block = SKAction.runBlock({
print(self.circle.zRotation)
})
let sequence = SKAction.sequence([wait, block])
self.runAction(SKAction.repeatActionForever(sequence))
Run Code Online (Sandbox Code Playgroud)
这是我用于创建的代码SKShapeNode:
let tex:SKTexture = SKTexture(image: image)
let circle = SKShapeNode(circleOfRadius: 100 )
circle.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + 200)
circle.strokeColor = SKColor.clearColor()
circle.glowWidth = 1.0
circle.fillColor = SKColor.whiteColor()
circle.fillTexture = tex
self.addChild(circle)
// Runing the action
circle.runAction(spin)
Run Code Online (Sandbox Code Playgroud)
请帮忙。提前致谢!
PS:我知道使用 anSKSpriteNode会更好,但我的目标是将方形图像放置在圆形框架中,我认为使用 anSKShapeNode会是完美的。如果有人知道如何创建通告 …
目前我正在使用Core Graphics作为形状,并将形状转换为CAShapeLayer与CABasicAnimation路径动画不同的形状.
然而,由于游戏的复杂性,如果要介入SpritKit,使用SKShapeNode,(丢弃CAShapeLayer和使用SKShapeNode)我能够平滑地将其设置为不同的形状吗?
我没有看到一种SKAction可以让你改变路径的方法SKShapeNode.
提前致谢.
skshapenode ×10
sprite-kit ×10
swift ×8
ios ×5
skspritenode ×2
xcode ×2
alpha ×1
children ×1
rotation ×1
skaction ×1
sktexture ×1
swift3 ×1