小编J.T*_*ein的帖子

Swift 3(SpriteKit):更改影响所有子项的父级的alpha值

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)

我在使用线而不是圆圈时截取了问题的屏幕截图:

谢谢.

children alpha sprite-kit skshapenode swift

7
推荐指数
1
解决办法
635
查看次数

Swift 3(SpriteKit):停止永久循环的SKAction有一个延迟

我一直试图制作一个永远运行的SKAction,我可以随时停止.我这样做了:

override func didMove(to view: SKView) {

    run(SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.01),
            ])), withKey: "frameDrawing"
    )
}
Run Code Online (Sandbox Code Playgroud)

然后在drawFrame函数中我像这样停止SKAction:

func drawFrame() {
    //(code)
    if stop {
        removeAction(forKey: "frameDrawing")
    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,SKAction仅在停止变为真后运行3或4次后停止.我希望它在stop设置为true时立即停止,而不是在重复3或4次后立即停止.

如果有人知道如何解决这个问题,请告诉我,因为我尝试了很多东西,他们从来没有解决过这个问题.谢谢!

编辑:这是我的代码:

var drawingFrame = SKAction()
class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {

    drawingFrame = SKAction.repeatForever (
        SKAction.sequence ([
            SKAction.run(drawFrame),
            SKAction.wait(forDuration: 0.03),
            ]))
    run(drawingFrame)
}

func drawFrame() {
   //(code)
    if stop {
        drawingFrame.speed = 0.0
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想知道为什么我在开始时将SKAction drawingFrame设置为空SKAction,那是因为我需要在两个函数之前定义SKAction.否则,两个函数都没有定义.

编辑任何有相同问题的人:我已经使用自己的想法和@ appzYourLife的解决方案解决了问题.每次都有效的最有效方法是只在stop等于false时才运行代码.但是,请确保停止程序的if语句超出该括号,以便SKAction最终停止.这是工作代码:

var drawingFrame = …
Run Code Online (Sandbox Code Playgroud)

sprite-kit skaction swift

6
推荐指数
1
解决办法
915
查看次数

Swift 3(SpriteKit):锁定SKSpriteNode的x轴及其physicsBody

我真的需要知道如何锁定SKSpriteNode的x轴及其physicsBody.我需要保留SKSpriteNode dynamicaffectedByGravity.节点在斜坡上,因此这就是x轴因重力而移动的原因.但是,我不希望此SKSpriteNode的x轴因重力而移动.有没有办法锁定x轴以实现这一目标?谢谢你的帮助:D

编辑:我试图将约束应用于x值,如下所示:

let xConstraint = SKConstraint.positionX(SKRange(constantValue: 195))
node.constraints?.append(xConstraint)
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,我不知道为什么以及如何解决它.有人知道解决方案吗?

编辑2: SKPhysicsJointPin实际上看起来更有前途.在对这个问题的第一个回答/回答的评论中,我一直试图想出如何在我的情况下正确使用它.

我的代码示例:

let node = SKSpriteNode(imageNamed: "node")

enum collisionType: UInt32 {
    case node = 1
    case ground = 2
    case other = 4 //the other node is unrelated to the ground and node
}

class GameScene: SKScene, SKPhysicsContactDelegate {

override func didMove(to view: SKView) {
    //Setup node physicsBody
    node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
    node.physicsBody?.categoryBitMask = collisionType.node.rawValue
    node.physicsBody?.collisionBitMask = //[other node that isn't the ground …
Run Code Online (Sandbox Code Playgroud)

sprite-kit skphysicsbody skspritenode swift

6
推荐指数
2
解决办法
785
查看次数

Swift 4:获取 UIImage 中像素的 RGB 值

我知道有很多关于如何在UIImage给定 a 中获取像素颜色的帖子,CGPoint但据我所知,它们都已经过时了。它们中的大多数包含CGImageGetDataProvider并且CGDataProviderCopyData在 Swift 4 中是错误的:

'CGImageGetDataProvider' 已被属性 'CGImage.dataProvider' 替换 'CGDataProviderCopyData' 已被属性 'CGDataProvider.data' 替换

Xcode 建议使用这些替代品,但它们不存在,所以我在尝试重新创建 Swift 4 函数以获取UIImage.

这是典型的 Swift 3 函数:

extension UIImage {

    subscript (x: Int, y: Int) -> UIColor? {

        if x < 0 || x > Int(size.width) || y < 0 || y > Int(size.height) {
            return nil
        }

        let provider = CGImageGetDataProvider(self.cgImage!)
        let providerData = CGDataProviderCopyData(provider!)
        let data = CFDataGetBytePtr(providerData)

        let numberOfComponents = 4 …
Run Code Online (Sandbox Code Playgroud)

colors uicolor ios swift

6
推荐指数
1
解决办法
4749
查看次数

Swift 3(SpriteKit):游戏结束后重置GameScene

我想'重置'并'重启'GameScene所以就好像GameScene首次被调用一样.我已经查看了不同的方法,但每次我收到警告,我正在尝试将节点添加到已有父节点的父节点.但是,在我的代码中,我删除了所有现有节点,所以我真的很困惑如何重置GameScene.这就是我现在这样做的方法(当我想从头开始重新启动GameScene并在GameScene类中调用时,会调用此代码):

let scene = GameScene(size: self.size)
scene.scaleMode = .aspectFill
let animation = SKTransition.fade(withDuration: 1.0) 
self.view?.presentScene(scene, transition: animation)
self.removeAllChildren()
self.removeAllActions()
self.scene?.removeFromParent()
Run Code Online (Sandbox Code Playgroud)

1.Edited:我意识到为什么我会收到这个警告:"我正在尝试将节点添加到已经拥有父节点的父节点",因为我拥有类外部场景的所有变量以及全局变量.但是,现在当游戏重新开始时,游戏就在左下角.为什么会这样,我该如何解决这个问题?-固定

2.Edited:现在一切正常,但现在我担心的是,deinit{}即使删除每个节点并且fps不会随着时间的推移而丢失,也不会调用它.这是我在GameViewController中设置场景和我的GameScene中的所有内容(每个与场景相关的实例基本上都是相关的):

import UIKit
import SpriteKit
import GameplayKit

var screenSize = CGSize()

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "GameScene") {
            // Set the scale mode to scale to fit the window …
Run Code Online (Sandbox Code Playgroud)

reset sprite-kit skscene swift

4
推荐指数
1
解决办法
4354
查看次数

Swift:如果不等于 nil,则设置变量

我正在使用 Swift,我想知道如何在 1 行代码中实现这一点:

If a != nil, myVariable = a

else if a == nil, myVariable = b
Run Code Online (Sandbox Code Playgroud)

我需要这样做,以便它适合

var myVariable = a {
    didSet{
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在 1 行中做到这一点,所以我不必在其他地方更改它并触发 didSet{}?

像这样的东西:

if var myVariable = a 
else myVariable = b {
    didSet{
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

或者...

var if a != nil {myVariable = a}
else {myVariable = b} {
    didSet{
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能需要一些时间来理解我的意思,我尽力解释它。

编辑 ---> 编译器说:

nil 合并运算符 '??' 的左侧 具有非可选类型 '[[Bool]]',因此从不使用右侧

和 …

var optional swift

2
推荐指数
1
解决办法
549
查看次数

ReplayKit:RPScreenRecorder.shared().startCapture() 不工作

ReplayKit最近真的让我很沮丧。因为某些原因

RPScreenRecorder.shared().startCapture(handler: { (sample, bufferType, error) in
Run Code Online (Sandbox Code Playgroud)

当我调用它时实际上不起作用,因为我在其中有一个print()语句并且它从未被调用过。

我的代码ViewController是:

import UIKit
import AVFoundation
import SpriteKit
import ReplayKit
import AVKit

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, RPPreviewViewControllerDelegate {

    var assetWriter:AVAssetWriter!
    var videoInput:AVAssetWriterInput!

func startRecording(withFileName fileName: String) {
        if #available(iOS 11.0, *)
        {

            assetWriter = try! AVAssetWriter(outputURL: fileURL, fileType:
                AVFileType.mp4)
            let videoOutputSettings: Dictionary<String, Any> = [
                AVVideoCodecKey : AVVideoCodecType.h264,
                AVVideoWidthKey : UIScreen.main.bounds.size.width,
                AVVideoHeightKey : UIScreen.main.bounds.size.height
            ];

            videoInput  = AVAssetWriterInput (mediaType: AVMediaType.video, outputSettings: videoOutputSettings)
            videoInput.expectsMediaDataInRealTime = true
            assetWriter.add(videoInput) …
Run Code Online (Sandbox Code Playgroud)

avfoundation video-recording swift avkit replaykit

2
推荐指数
1
解决办法
2486
查看次数

了解保留周期的位置并将其删除

我想知道是否有一种简单的方法(或至少是一种方法)来找出程序中存在保留周期的位置.此外,如果我知道这些保留周期存在的位置,取决于它们的类型(例如变量或闭包),我该如何使它们变弱.我需要使用self(我的GameScene)停止所有保留周期,以便在我不再需要它时解除分配并且我想重新启动它.

任何提示,建议,答案和反馈将不胜感激(并提供特定的代码和示例将是首选).谢谢.

编辑: @ Sweeper的回答正是我想要的.如果你遇到同样的问题,他的回答会有所帮助.谢谢@Sweeper!

weak-references retain-cycle sprite-kit swift swift3

1
推荐指数
1
解决办法
1311
查看次数