检查SCNNode SCNAction是否完成

2024-05-06

我创建了一个 SceneKit 3D 迷宫世界,玩家可以在其中移动。有些动作(例如跳跃)涉及上下移动相机,同时在几秒钟的时间内改变视角方向。在此期间,我想忽略用户的点击和滑动,这通常会导致其他类型的运动,例如转身和向前移动。

我可以创建一个与跳跃持续时间相匹配的计时器并设置一个 Bool,但我希望有一种更简单的方法来检查相机的 SCNNode。

有没有一种简单的方法可以查看相机的 SCNNode 是否不再运行用于跳转的 SCNAction,以便我可以在其他点击和滑动操作之前添加此逻辑?

或者也许有一个 SCNAction 可以设置我可以放在跳转序列的开始和结束处的 Bool ?

这是我的跳转代码:

        let jumpUp: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), jumpHeight), duration: jumpTime)
        let jumpAppex: SCNAction = SCNAction.wait(duration: jumpWaitTime)
        let fallDown: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), cameraHeight), duration: jumpTime)

        var lookDown: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(π), duration: jumpTurnTime)
        let noLook: SCNAction = SCNAction.wait(duration: jumpTime*2.0)
        var lookBack: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: 0, duration: jumpTurnTime)

        switch playerDirection.direction
        {
            case .south:
                lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
                lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
            case .north:
                lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(northZ), duration: jumpTurnTime)
                lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(northZ), duration: jumpTurnTime)
            case .east:
                lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(eastZ), duration: jumpTurnTime)
                lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(eastZ), duration: jumpTurnTime)
            case .west:
                lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(westZ), duration: jumpTurnTime)
                lookBack = SCNAction.rotateTo(x: CGFloat(π/2), y: 0, z: CGFloat(westZ), duration: jumpTurnTime)
        }

        let sequenceJump = SCNAction.sequence([jumpUp, jumpAppex, fallDown])
        let sequenceLook = SCNAction.sequence([lookDown, noLook, lookBack])

        mazeScene.mazeCamera.runAction(sequenceJump)
        mazeScene.mazeCamera.runAction(sequenceLook)

Thanks

Greg


我认为行动是非常奇怪的事情。

这个想法深受 cocos2D 的启发(基本上是 1:1 映射和“盗窃”),在 cocos2D 中它们被用作避免与游戏循环、状态和时间(某种程度上)直接交互的方式。动作提供了一种用于处理时间以及活动的创建和调用的模块化和抽象,以及对其结论的非常原始的处理。

阅读此处,您可以看到 SpriteKit 和 SceneKit 的 Actions 与最初的想法有多么相似:http://python.cocos2d.org/doc/programming_guide/actions.html http://python.cocos2d.org/doc/programming_guide/actions.html

由于其创造的分歧和不断发展的性质,有人忘记让他们意识到自己的状态,尽管事实上它们影响节点状态的某些方面。 Action 对象具有“运行”状态几乎是完全合理的。但据我所知,他们没有。

相反,您可以检查节点是否具有给定的操作,如果有,则推断该操作正在运行。

尽管大多数操作都会在一段时间内执行某些操作,但您也无法查询它们在持续时间内完成了多远,也无法查询它们刚刚触发或接下来将发送哪些值。但是有一些操作可以执行此操作,特别是为了应对所有操作都缺少此功能的事实,这意味着如果您想要此操作,则需要使用提供此功能的特殊操作。

对于本应与生俱来的设施,这种对自身的递归性是动作中最烦人的部分,而没有从熟悉时间线和关键帧的人的角度进行深思熟虑。

总体而言,总而言之:您无法查询操作的状态,也不能查询其进度,也不能查询它刚刚执行或下一步将使用的值。这绝对是荒谬的。

我不知道这一点在 Actions 的各种演变中是如何被忽视的……它们是时间管理和模块化活动的创建者。在其中包含状态和进度报告似乎很合乎逻辑……好吧,我不知道……很奇怪他们没有这样做。

所以,回答你的问题:

  1. 您可以使用完成处理程序,即在操作完成时调用一些代码,以设置值或调用其他函数或清理内容,或者您​​想要的任何内容。

  2. 序列操作,在 SCNAction.sequence...这是一种让操作按顺序运行的方法,并在内部使用一些在您需要时运行代码块的操作,这些操作在您需要时调用设置您需要的内容行动的顺序。如果操作当前具有的时间和属性值是透明的,那么所有这些都可以避免......但是......

  3. 您还可以使用一些特殊操作,这些操作可以通过对它们所做的更改来了解它们正在编辑的值。我只熟悉浮动设置能力SKEase套件 https://github.com/craiggrummitt/SpriteKitEasingSwift,但你可能可以在 SceneKit 和 SpriteKit 中做到这一点(如果你是一个比我更好的编码员)。 SKEaseKit 隐藏了一些非常有用的值更改操作。

例如,我像这样使用它,其中这个混乱在持续时间(时间)内将值从 0 更改为 1,在这种情况下是线性的,并且每个帧(希望)更新此 GrowthAction 所在节点的 .xScale跑步:

let growAction = SKEase.createFloatTween(
                start: 0,
                ender: 1,
                timer: time,
                easer: SKEase.getEaseFunction(.curveTypeLinear,
             easeType: .easeTypeOut),
          setterBlock: {(node, i) in
            node.xScale = i}
            )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查SCNNode SCNAction是否完成 的相关文章

随机推荐

  • 通过pip安装lxml时出错:需要Microsoft Visual C++ 14.0

    我使用的是 Windows 10 机器 最近从 python 2 7 迁移到 3 5 当尝试通过 pip 安装 lxml 时 它会停止并抛出此错误消息 构建 lxml etree 扩展错误 需要 Microsoft Visual C 14
  • 在Python子目录中创建文件?

    在我的 Python 脚本中 我需要在子目录中创建一个新文件而不更改目录 并且需要从当前目录不断编辑该文件 My code os mkdir datetime dst for ip in open list txt with open ip
  • 使用加权概率和值查找数组中的项目

    上周我正在做的一个简单程序遇到了一些问题 这里有人帮助了我 现在我遇到了另一个问题 我目前有这个代码 var findItem function desiredItem var items item rusty nail probabili
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • 在自动触发的默认侦听器之前触发 Hibernate 自定义事件侦听器

    我创建了一个自定义 Hibernate 事件监听器 扩展了 org hibernate event PreInsertEventListener 自定义侦听器会重写 onPreInsert 方法 并在使用 DAO 将 联系人 实体保存到数据
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 猪如何过滤不同的对(对)

    我是猪的新手 我有一个 Pig 脚本 它在两个元素之间生成制表符分隔的对 每行一对 例如 John Paul Tom Nik Mark Bill Tom Nik Paul John 我需要过滤掉重复的组合 如果我使用 DISTINCT 我会
  • 如何在列表视图中每行右侧显示 4 个图标

    我想在列表视图的每一行右侧设置 3 个图标 我正在制作购物应用程序 我希望在列表视图中用户选择任何产品时 这样他 她可以以 3 种方式查看产品 就像用户选择图标一样1 这样用户可以在网格视图中看到产品 如果用户选择图标 2 这样用户可以在图
  • Visual Studio 2017 ASP.Net 发布独立的 Dot Net Core 应用程序

    我在 Visual Studio 2017 中有一个 Net Core ASP Net 应用程序 我正在尝试对该应用程序进行独立部署 如果我从 CLI 运行以下命令 它会完全按照我想要的方式工作并生成 exe dotnet publish
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • 使用基于 ConvLSTM2D 的 Keras 模型从较低分辨率图像估计高分辨率图像

    我正在尝试使用以下内容ConvLSTM2D从低分辨率图像序列估计高分辨率图像序列的架构 import numpy as np scipy ndimage matplotlib pyplot as plt from keras models
  • SQLAlchemy 闭包表关系定义

    我最近开始使用 SQL Alchemy 开展一个涉及攀岩区域和路线的项目 区域是分层的 因为单个区域可以包含多个区域 而多个区域又可以包含其他区域 路线直接与单个区域关联 但也与该区域的父区域关联 等等 为了实现这一点 我选择使用Bill
  • 如何配置 Ansible 跳过两个堡垒主机?

    我想编写一个 Ansible 剧本 使用 Ansible 2 7 5 它将在到达目标服务器之前跳过两个主机来执行诸如安装 docker 和 python 等操作 我能够让 Ansible 通过一台主机跳转到server1通过将其添加到我的h
  • 如何在Powershell中将字符串转换为UInt64?字符串到数字的转换

    考虑以下 Powershell 片段 Uint64 Memory 1GB string MemoryFromString 1GB Uint64 ConvertedMemory Convert ToUInt64 MemoryFromStrin
  • 如何在不指定值的情况下向 std::map 添加有效键?

    我有一个 std map 我想添加一个有效的键以稍后对其进行迭代 但不给出任何值 稍后将在迭代过程中给出 我现在就是这样做的 std vector
  • MVC4如何在没有导航属性的情况下加载相关数据

    我对 MVC 相当陌生 并且已经使用 EF database first 创建了一个 MVC4 应用程序 该数据库不包含外键定义 我无法添加它们 我不拥有该数据库 以下是数据库中的两个示例类 public partial class All
  • C# - 如何检测 SQLite DB 是否被锁定?

    我正在开发一个使用 SQLite 的多线程 C 程序 我遇到一个问题 有时运行 SQLiteCommand ExecuteNonQuery 来更新某些行会抱怨 SQLite 错误 5 数据库已锁定 我知道发生这种情况是因为数据库在插入或更新
  • Dapper MySQL 返回值

    我在 ASP net Identity 项目中使用 dapper 和 MySql 时遇到问题 我想将用户插入到表 users 中 并希望从这次插入中返回自动生成的 id 但我收到语法错误 我不知道为什么 这是我的方法插入代码 public
  • JAR 清单代码库不匹配

    我在 dropbox 中有一个小程序 在 droppages 中有一个链接 该小程序是自签名的 按照代码操作 Manifest Version 1 0 Ant Version Apache Ant 1 9 1 X COMMENT Main
  • 检查SCNNode SCNAction是否完成

    我创建了一个 SceneKit 3D 迷宫世界 玩家可以在其中移动 有些动作 例如跳跃 涉及上下移动相机 同时在几秒钟的时间内改变视角方向 在此期间 我想忽略用户的点击和滑动 这通常会导致其他类型的运动 例如转身和向前移动 我可以创建一个与