• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 点击或拖动时缩放节点无法始终如一地运行

[复制链接]
菜鸟教程小白 发表于 2022-12-12 12:43:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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 节点时,它们不会按比例放大,但有时会。当我拖动它们时,动画似乎显得非常滞后。此外,当我放下节点(即删除触摸输入)时,缩小效果也不会始终如一地发生(有时会,有时不会)。到底是怎么回事?如果你们需要更多源代码,请告诉我。



Best Answer-推荐答案


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

如何解决缩放问题:

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

如何解决拖拽问题:

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

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

如果您碰巧需要一个变量与您正在使用的函数在同一范围内,那么您可能需要考虑使用 guard。守卫的工作方式是,如果不满足某些条件,它将退出当前范围,因此,例如,您在代码中遇到一个点,您说 card 必须存在于该点之外,然后您执行 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap