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,我可以随时停止.我这样做了:
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) 我真的需要知道如何锁定SKSpriteNode的x轴及其physicsBody.我需要保留SKSpriteNode dynamic和affectedByGravity.节点在斜坡上,因此这就是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) 我知道有很多关于如何在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) 我想'重置'并'重启'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) 我正在使用 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]]',因此从不使用右侧
和 …
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) 我想知道是否有一种简单的方法(或至少是一种方法)来找出程序中存在保留周期的位置.此外,如果我知道这些保留周期存在的位置,取决于它们的类型(例如变量或闭包),我该如何使它们变弱.我需要使用self(我的GameScene)停止所有保留周期,以便在我不再需要它时解除分配并且我想重新启动它.
任何提示,建议,答案和反馈将不胜感激(并提供特定的代码和示例将是首选).谢谢.
编辑: @ Sweeper的回答正是我想要的.如果你遇到同样的问题,他的回答会有所帮助.谢谢@Sweeper!
swift ×8
sprite-kit ×5
alpha ×1
avfoundation ×1
avkit ×1
children ×1
colors ×1
ios ×1
optional ×1
replaykit ×1
reset ×1
retain-cycle ×1
skaction ×1
skscene ×1
skshapenode ×1
skspritenode ×1
swift3 ×1
uicolor ×1
var ×1