草庐IT

swift - 在 SKAction 动画之后无法禁用然后重新启用触摸

coder 2023-09-07 原文

我正在制作交互式动画场景。我希望在进入时禁用场景中的所有触摸。然后,一旦场景中的对象(子类节点)完成旋转/移动,我想重新启用屏幕上的所有触摸以允许交互。我已使用此代码禁用用户交互:

override func didMove(to view: SKView) {
    setupNodes()
    view?.isUserInteractionEnabled = false
    spinLocations()
}

这是场景文件中用于 spinLocations 的代码:

func spinLocations() {
    var allLocationArrays = [[String : CGPoint]]()
    var previousArray = hiddenLocationPositions
    for _ in 0...SearchConstant.numSpins {
        let freshArray = generateNewLocationArray(previous: previousArray)
        allLocationArrays.append(freshArray)
        previousArray = freshArray
    }
    for (item, _) in hiddenLocationPositions {
        let node = fgNode.childNode(withName: item) as! LocationNode
        node.spin(position: allLocationArrays) // this is function below
    }
    hiddenLocationPositions = previousArray
}

这是节点类中的动画代码:

func spin(position: [[String : CGPoint]]) {
    var allActions = [SKAction]()
    for array in position {
        let action = SKAction.move(to: array[self.name!]!, duration: 2.0)
        allActions.append(action)
    }
    let allActionsSeq = SKAction.sequence(allActions)
    self.run(SKAction.sequence([SKAction.wait(forDuration: 5.0), allActionsSeq, SKAction.run {
        self.position = position[position.count - 1][self.name!]!
        },]))
}

这是从这个类将触摸传回主场景的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let parent = self.parent else { return }
}

如您所见,此处未禁用触摸。

我不想在 runBlock 中添加“waitForDuration”SKAction 以在上一个操作之后更改 View 状态;我希望程序确定动画何时完成执行,然后重新启用触摸。

为了做到这一点,我推测使用完成处理程序可能会起作用,但它只会立即重新启用触摸(例如,处理处理程序以旋转会导致再次检测到触摸)。以前,我也尝试过禁用 runBlock 中的 View ,当然,那是即时运行的。如何确保在不使用“waitForDuration”的情况下在动画播放后重新检测到触摸?

最佳答案

所以,这是一个简单的示例,展示了您如何:

1) 完全禁用触摸

2) 旋转一个节点

3) 当节点完成旋转后,启用触摸

这是代码(您可以复制/粘贴它来尝试它是如何工作的):

class Object:SKSpriteNode{

    func spin(times:Int,completion:@escaping ()->()) {

       let duration = 3.0
       let angle = CGFloat(M_PI) * 2.0

       let oneRevolution = SKAction.rotate(byAngle: angle , duration: duration)
       let spin = SKAction.repeat(oneRevolution, count: times)

       let sequence = SKAction.sequence([spin,SKAction.run(completion)])

       run(sequence, withKey:"spinning")
    }

}

class WelcomeScene: SKScene {


    override func didMove(to view: SKView) {


        view.isUserInteractionEnabled = false
        print("Touches Disabled")

        let object = Object(texture: nil, color: .purple, size: CGSize(width: 200, height: 200))

        addChild(object)

        object.spin(times: 3, completion: {[weak self] in

            self?.view?.isUserInteractionEnabled = true
            print("Touches Enabled")
        })

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touch detected")
    }

    deinit {
        print("Welcome scene deinited")
    }
}

在这里,您在加载场景时禁用触摸,开始旋转对象,然后将完成 block 传递给它...此处使用该代码块:

let sequence = SKAction.sequence([spin,SKAction.run(completion)])

因此在旋转之后,该 block 将被执行。现在,有不同的方法可以做到这一点......就我个人而言,我会使用委托(delegate),但我认为这不会那么困惑......如果需要,我也可以为委托(delegate)写一个例子,但基本上,你会做的是将场景设置为自定义节点的代理,并通知它旋转已完成,因此场景可以告诉 View 重新启用触摸。

关于swift - 在 SKAction 动画之后无法禁用然后重新启用触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43387444/

有关swift - 在 SKAction 动画之后无法禁用然后重新启用触摸的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  8. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

  9. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  10. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

随机推荐