【问题标题】:SKShader in iOS 8, no GLVector in swift?iOS 8中的SKShader,swift中没有GLVector?
【发布时间】:2014-11-09 15:19:28
【问题描述】:

在尝试用 Swift 翻译 this 时,我发现我的代码无法编译

let movementShader = SKShader(fileNamed: "reflection.fsh")
movementShader.addUniform(SKUniform(name: "size", SCNVector3: SCNVector3Make(0.0, 0.0, 0.0)))

说我的电话中有一个额外的参数。

这里很新,有什么想法吗?

谢谢

【问题讨论】:

  • SKUniform 没有 init(name:SCNVector3:) 初始化程序。而且你不能从 Swift 调用它确实有的向量初始化器(比如init(name:floatVector3:)),因为它们使用 GLKit 类型。这些是 Swift 不支持的 C 联合类型,因此它不会导入任何使用它们的 API。
  • SCNVector3 可在 Swift 中使用,因此如果您在 SKUniform 的 ObjC 类别中定义 initWithSCNVector3:,这可能是一个很好的解决方法。
  • 谢谢,你能提供一个起点吗?
  • 我的答案有完整的解决方案,你试过了吗?

标签: ios sprite-kit


【解决方案1】:

这是一个示例实现。在SKShader 上创建一个Objective-C 类别,我称之为Unions。在 .h 文件中声明一个方法:

#import <SpriteKit/SpriteKit.h>

@interface SKShader (Unions)

+(SKShader*)shaderForX:(float)x y:(float)y z:(float)z;
@end

然后转到.m文件并实现:

#import "SKShader+Unions.h"

@implementation SKShader (Unions)

+(SKShader*)shaderForX:(float)x y:(float)y z:(float)z
{
    SKShader *shader = [SKShader shaderWithFileNamed:@"shader.fsh"];
    SKUniform *texture = [SKUniform uniformWithName:@"customTexture" texture:[SKTexture textureWithImageNamed:@"shade"]];
    SKUniform *uniformSCNVector = [SKUniform uniformWithName:@"size" floatVector3:GLKVector3Make(x, y, z)];

    [shader setUniforms:@[texture,uniformSCNVector]];
    return shader;
}
@end

不要忘记为您的项目创建一个桥接头。这是一个名为"YourProjectName-Bridging-Header.h" 的.h 文件,包含#import "SKShader-Unions.h" 指令。

现在您可以从 Swift 文件中调用:

let shader = SKShader(forX: x, y: y, z: y)

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多