Spritekit 和 OpenGL:平滑的烟雾轨迹

2023-12-21

我想在我的 Spritekit 游戏中实现这种效果,其中有一个smooth角色后面的踪迹。

See the trail behind the coin in jetpack joyride: enter image description here

And this trail behind the hero in Jupiter Jump: enter image description here

Or this super smooth trail behind the hero in Ski Safari: enter image description here

这似乎是其他游戏引擎的标准功能?我认为 spritekit 粒子发射器只会提供块状/标记的轨迹,而不是平滑的轨迹。我应该使用某种精灵自定义着色器吗?还有其他创意吗?


您的问题没有包括一个关键问题,即要使用的运动类型。我的答案是基于触摸屏幕到达目的地,但另一种选择是使用核心运动。无论使用哪种方法,基本代码原理都是相同的。只有实施会改变。

我在示例中使用了矩形尾部图像,因为我希望您能够复制并运行示例代码。您应该用圆形图像/纹理替换矩形,以使尾部侧面更平滑。

修改 fadeOutDuration 值将导致更长或更短的持续尾部。

修改stepsDivider会导致尾部的节点增多或减少。

#import "GameScene.h"

@implementation GameScene {
    SKSpriteNode *playerNode;
    CGPoint destinationPoint;
    NSMutableArray *myArray;
    NSMutableArray *myDiscardArray;
    BOOL working;
    int numberOfSteps;
    float xIncrement;
    float yIncrement;
    float fadeOutDuration;
    int stepsDivider;
}

-(void)didMoveToView:(SKView *)view {
    self.backgroundColor = [SKColor blackColor];

    playerNode = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(30, 30)];
    playerNode.position = CGPointMake(200, 200);
    [self addChild:playerNode];

    myArray = [[NSMutableArray alloc] init];
    myDiscardArray = [[NSMutableArray alloc] init];

    working = false;
    fadeOutDuration = 0.5;
    stepsDivider = 10;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];

        if(working == false) {
            destinationPoint = location;

            if(fabsf(location.x - playerNode.position.x) > fabsf(location.y - playerNode.position.y)) {
                numberOfSteps = fabsf(location.x - playerNode.position.x) / 10;
            } else {
                numberOfSteps = fabsf(location.y - playerNode.position.y) / 10;
            }

            xIncrement = (location.x - playerNode.position.x) / numberOfSteps;
            yIncrement = (location.y - playerNode.position.y) / numberOfSteps;

            working = true;
        }
    }
}

-(void)update:(CFTimeInterval)currentTime {

    if (working == true) {

        // create trail node at current player's position
        SKSpriteNode *myNode = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(30, 30)];
        myNode.position = playerNode.position;
        [self addChild:myNode];
        [myArray addObject:myNode];
        [myNode runAction:[SKAction fadeOutWithDuration:fadeOutDuration]];

        // check array for any nodes with zero alpha
        for(SKSpriteNode *object in myArray) {
            if(object.alpha == 0) {
                [myDiscardArray addObject:object];
            }
        }

        // remove zero alpha nodes
        if([myDiscardArray count] > 0) {
            [myArray removeObjectsInArray:myDiscardArray];
            [myDiscardArray removeAllObjects];
        }

        // update player's new position
        playerNode.position = CGPointMake(playerNode.position.x+xIncrement, playerNode.position.y+yIncrement);

        // check if player has arrived at destination
        if(((int)playerNode.position.x == (int)destinationPoint.x) && ((int)playerNode.position.y == (int)destinationPoint.y)) {
            working = false;
        }
    }
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spritekit 和 OpenGL:平滑的烟雾轨迹 的相关文章

  • 如何使用 Swift 将高分游戏保存在排行榜上?

    我使用 SpriteKit 和 Xcode 7 beta 制作了一个游戏 我尝试放置 GameCenter 和 Leaderboard 但问题是排行榜中的分数不会改变 它始终保持 0 游戏的高分不会保存在 Leaderboard 中 我不知
  • 将图像作为球分配给 SKShapeNode - Spritekit 游戏

    我正在尝试在 Swift 2 Sprite kit 游戏中向我的球添加图像 我有一个make ball 函数 但在游戏场景中没有错误 当调用该方法时 我不断收到此错误 无法分配 SKShapeNode 来输入 Ball 我不知道如何修复 并
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • Swift:如何让游戏中的角色只有落地后才能跳跃?

    我正在开发一款游戏 我的角色可以从一个陆地跳到另一个陆地 我已经把所有事情都做好了 除了我剩下的问题是 如果你继续点击屏幕 他可以永远跳跃 我希望他必须先落地才能再次跳跃 import SpriteKit import GameplayKi
  • 确定手势识别器中触摸的节点

    我有一个 SpriteKit 场景 其中可以有数千个不同的节点 我还在场景中实现了单击手势识别器 希望在触发手势识别器后能够确定场景中哪个节点被触摸 目前 我的 非工作 代码如下所示 objc func singleTap sender U
  • 为什么单个 Vec4 乘法会大大减慢我的 ogl es 2 片段着色器的速度?

    我正在为 iOS 设备编写 2D OpenGL 游戏 现在 我正在研究 iPad 第一代 上的性能 该游戏有 ogl 1 1 和 2 0 的代码路径 我可以通过 define 使用 ogl 2 0 时 分析器告诉我 我的渲染器利用率 相当稳
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • OpenGL什么时候完成函数中指针的处理?

    OpenGL有多项功能 http www opengl org wiki GLAPI glTexSubImage2D直接获取指针 他们中有一些从这些指针读取数据 http www opengl org wiki GLAPI glBuffer
  • OpenGL ES 2.0 中的透明对象

    所以我一直在 Android 上使用 OpenGL ES 2 0 但现在遇到了一个我无法解决的问题 提前道歉 看来我还不能发布两个以上的链接 所以我把我的三张图片放在 Photobucket 相册中 我正在尝试创建一个由透明区域 彩色玻璃
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • 丢弃对 OpenGL 中的程序性能有影响吗?

    我正在读书this http code google com p gdc2011 android opengl wiki TalkTranscript文章 作者写道 以下是如何通过两个简单的步骤在每个平台上编写高性能应用程序 遵循最佳实践
  • GPU-android opengl es 3.0中的亮度直方图计算

    用于亮度直方图计算 我使用了 Brad Larson 的 GPU image ios 项目中的代码 他使用混合进行直方图计算 连接顶点和片段着色器 顶点着色器 version 300 es in vec4 position out vec3
  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • 如果显示了另一个 SKView,则带有过渡的 SKView.presentScene 不起作用

    Update 请参阅我自己的答案 这是一个具有非常间接结果的保留周期 我写一篇关于它的文章 https medium com touchgram oops hitting a 5yo apple bug 17d2703519f4以及诊断的努
  • ObjectAL自动中断处理错误

    我一直在 SpriteKit 游戏运行时打电话 以测试中断 我正在使用 ObjectAL 文档中的示例 名为 使用 OpenAL 对象和 OALAudioTrack http kstenerud github io ObjectAL for
  • 如何用SKAction循环播放音乐?

    我想用 SKAction 循环背景音乐 但当我切换到另一个场景时 音乐在一行后停止 有没有办法开始循环并在不同的场景中继续播放 现在代码放置在 MyScene 的 init 方法中 这是正确的位置吗 也许 didFinishLaunchin
  • 调整 SKShapeNode 的大小

    如何调整 SKShapeNode 的大小 到目前为止我尝试过的 调整框架大小 box frame width 10 给出错误Cannot assign to the result of this expression SKAction le
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我
  • 在 iOS 上的 OpenGL ES 2.0 中创建 16 位亮度纹理

    我的文件中有 16 位数据 我正在尝试将其加载到 iOS 上的 OpenGL 亮度纹理中 如果我手动将 16 位值重新调整为 8 位 我可以按如下方式加载和显示数据 glTexImage2D GL TEXTURE 2D 0 GL LUMIN
  • 如何重复更新单个 Vulkan 渲染通道内对象数量的统一数据并使更新同步?

    我正在尝试将我的 OpenGL 3D 游戏引擎移植到 Vulkan 游戏场景中有大量的 3D 对象 每个对象都有自己的属性 模型矩阵 灯光等 并且对象是完全动态的 这意味着在游戏过程中可能会出现一些 3D 对象 而另一些可能会被移除 使用

随机推荐

  • guava 是否有一个采用自定义哈希/等于函数的 Map 实现?

    任何人都知道Guava是否有与Functionaljava等效的版本HashMap http functionaljava googlecode com svn artifacts 3 0 javadoc fj data HashMap h
  • 有条件地在分类列中创建“其他”类别

    我有一个DataFrame df用一列 category使用以下代码创建 import pandas as pd import random as rand from string import ascii uppercase rand s
  • C 结构不扫描所有输入

    我有这个C代码 include stdio h main struct books char name 100 author 100 int year copies book1 book2 printf Enter details of f
  • Python try- except 块的 DRY 方法?

    客观的 我有几行代码 每行代码都能够产生相同类型的错误 并保证相同类型的响应 如何防止 try except 块出现 不要重复 问题 背景 我使用 ReGex 从文本文件中抓取格式不良的数据 并将其输入到自定义对象的字段中 该代码工作得很好
  • Laravel Ajax 下拉过滤器

    我正在尝试使用 Ajax 制作一个过滤器 我想在下拉列表中选择的类别发生变化时显示图像 现在 我正在视图中显示所有图像 并且我想要进行 Ajax 调用 返回过滤后的 images 数组以在视图中显示 但我被困住了 我不知道如何从控制器正确返
  • Pandas 交叉表矩阵 dot nansum

    我正在寻求帮助 使用类似 np nansum 的函数从现有数据帧创建子数据帧 我想将此表转换为非空列和的矩阵 dan ste bob t1 na 2 na t2 2 na 1 t3 2 1 na t4 1 na 2 t5 na 1 2 t6
  • 如何查找(并可能删除)个人文件

    Slack API 有一个方法files list 但这似乎只列出在公共频道上共享的文件 而不是在私人对话中共享的文件 作为团队管理员 我想删除旧文件 我不需要查看它们 我可以要求团队成员手动删除它们 但这对他们来说是一个非常缓慢且费力的过
  • 比较修订版本时 SVN 访问被拒绝

    我们正在使用 SVN 存储库 当我们尝试将本地未修改的文件与存储库中文件的最新版本进行比较时 我收到以下错误 换句话说 有人签入了更改 如果我更新 我将得到他们的更改 但首先我想看看他们的更改是什么 不要认为这很重要 但我们正在使用 Xco
  • 在 Windows 中的 django 中设置 cron 作业

    我想设置cronjob in my Django项目 但我正在使用windows 我试过django cron 但它不适用于windows 我该如何使用cronjob在我的项目中安排时间 使用django cron则不然 不能在Window
  • 下拉列表对齐问题(HTML/CSS)

    我以前问过这样的问题 但我使用的代码与上次不同 我正在尝试创建一个下拉菜单 主列表中的某些元素有一个下拉列表 新闻和团队 由于某种原因 它们移到了右侧 我希望下拉列表中的项目与其父项对齐 任何帮助 将不胜感激 Thanks http cod
  • @DataJpaTest 中的存储库初始化为 null

    我正在尝试在 Spring Boot 应用程序中为存储库编写一些测试 但是存储库自动连接为null 测试类的代码如下 package jpa project repo import org junit Assert import org j
  • Ember.ArrayProxy 更改不触发车把 #each 更新

    我怀疑有一种方法可以更新 Ember Array 代理来触发 ember 的通知 但我不知道如何实现 我正在覆盖 内容 属性来更新数组 数组会更新 但视图不会更新 App items Ember ArrayProxy create cont
  • Python:更改 json 解码的列表类型

    在 Python 2 7 中我可以使用object pairs hook在内置 json 模块中更改解码对象的类型 有没有办法对列表做同样的事情 一种选择是遍历作为钩子参数获得的对象 并将它们替换为我自己的列表类型 但是还有其他更聪明的方法
  • 传入通知的增强意图服务警告

    收到通知后 我的日志中出现两个错误 EnhancedIntentService Service took too long to process intent com google android c2dm intent RECEIVE A
  • iOS 15 通讯通知图片未显示

    我一直在尝试将我的 本地和推送 通知更新为通信通知 当用户收到来自其朋友之一的通信事件时 我希望显示的通知包含该朋友的个人资料图片 就像新的 iMessage 应用程序一样 观看专门的 WWDC2021 会议后 我向我的 SwiftUI 应
  • 为什么不调用复制构造函数?

    在此代码中 include
  • 从 C# 调用 powershell cmdlet

    我正在尝试学习如何从 C 调用 PS cmdlet 并且遇到了 PowerShell 类 它对于基本使用来说工作得很好 但现在我想执行这个 PS 命令 Get ChildItem where Length gt 1000000 我尝试通过
  • RequestScoped bean CDI 上的 HttpServletRequest 注入

    我正在寻找一种方法来注入 RequestScoped自定义类到我的 StatelessJAX RS端点 我希望每次应用程序收到请求时 我的自定义类都会注入到我的 JAX RS 端点中 定制类 RequestScoped public cla
  • 使用 Puppeteer 检查元素是否被禁用

    我有一个按钮 其初始状态为disabled
  • Spritekit 和 OpenGL:平滑的烟雾轨迹

    我想在我的 Spritekit 游戏中实现这种效果 其中有一个smooth角色后面的踪迹 See the trail behind the coin in jetpack joyride And this trail behind the