jjzjj

ios - 点击或拖动时缩放节点功能不一致

coder 2024-01-16 原文

我希望我的 SKSprite 节点在被点击并在屏幕上拖动时放大(放大)。当用户移除触摸输入时,他们需要缩小最后一个位置。这是我现在用来实现此效果的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        let card = atPoint(location) as? Card
        if card?.cardType == .main{
            card?.zPosition = 30
            card?.run(SKAction.scale(to: 1.3, duration: 0.15))
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        let card = atPoint(location) as? Card
        if card?.cardType == .main{
            card?.zPosition = 30
            card?.removeFromParent()
            addChild(card!)
            card?.run(SKAction.scale(to: 1.0, duration: 0.15))
        }
    }
}

Card 是我定义的一个继承自 SKSpriteNode 的类。

问题似乎是,有时当我触摸 sprite 节点时,它们不会放大,有时会。当我拖动它们时,动画似乎非常滞后。此外,当我放下节点(即删除触摸输入)时,缩小效果也不会始终如一地发生(有时会发生,有时不会发生)。到底是怎么回事?如果你们需要更多源代码,请告诉我。

最佳答案

请不要复制和粘贴此答案,尝试自己完成工作并将您的代码与此答案进行比较。

如何解决缩放问题:

当您调用运行操作时,新操作不会取消之前的操作,因此您同时运行两个操作,这可能会发生冲突。相反,使用一个键来删除之前的操作。

如何解决拖拽问题:

您需要在 touch begind 方法中保留正在拖动的节点。然后当你进行拖动时,你就会知道要设置什么位置。

另请查看我如何清理代码以减少行数并删除“?”在很多变量调用中。在你去使用之前?要么 !在变量上解决您的问题,检查是否有更好的方法来处理代码流。采用 !只有当你可以 100% 保证 nil 永远不会发生并且包装在临时变量中效率低下时。采用 ?仅当您期望代码继续运行时,即使变量为 nil 并且包装在临时变量中效率低下。

如果您碰巧需要一个变量与您正在使用的函数在同一范围内,那么您可能需要考虑使用 guard。守卫的工作方式是,如果不满足某些条件,它将退出当前范围,例如,您在代码中遇到一个点,您说卡片必须存在于该点之外,然后您执行 guard let card = atPoint(位置)作为?卡片。有关守卫的更多信息,请参阅 http://nshipster.com/guard-and-defer/更好地了解其工作原理。

var movableCard : Card?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)

        if let card = atPoint(location) as? Card, card.cardType == .main{
            card.zPosition = 30
            movableCard = card
            //Not sure what node this card is suppose to move to
            card.run(SKAction.scale(to: 1.3, duration: 0.15),withKey:"scaling")
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)
        if let card = movableCard{

            card.position = location
        }
    }
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self)

        if let card = movableCard{
            card.zPosition = 30
            card.moveToParent(self)
            movableCard = nil
            card.run(SKAction.scale(to: 1.0, duration: 0.15),withKey:"scaling")
        }
    }
}

关于ios - 点击或拖动时缩放节点功能不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464810/

有关ios - 点击或拖动时缩放节点功能不一致的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  8. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  9. ruby - Sinatra:点击 URL 时运行 ruby​​ 代码 - 2

    我想在每次访问url/code时运行一个脚本(code.rb)。如何运行脚本?require'sinatra'get'/'do#runthescriptend 最佳答案 要么fork另一个进程:system('rubycode.rb')...或者简单地将脚本加载到当前上下文中:load'code.rb'#*not*require 关于ruby-Sinatra:点击URL时运行ruby​​代码,我们在StackOverflow上找到一个类似的问题: https:

  10. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

随机推荐