创建 SKSpriteNode 子类的子类

2024-01-30

假设我想创建一堆不同类型的宇宙飞船。我想设置一个基本的宇宙飞船类,我可以用它来创建其他有细微差别的宇宙飞船。

我的基类看起来像这样。

// BaseSpaceship.h
@interface SpaceshipNode : SKSpriteNode
@property NSColor color;
@property CGFloat engineThrust;
+ (id)baseSpaceshipWithImageNamed:(NSString *)name;
@end

// BaseSpaceship.m
@implementation BaseSpaceship
+ (id)baseSpaceshipWithImageNamed:(NSString *)name {
    BaseSpaceship *ship = [BaseSpaceship spriteNodeWithImageNamed:name];

    ship.color = [NSColor redColor];
    ship.engineThrust = 2.0;

    return ship;
}
@end

我可以像这样在 MyScene.m 中创建一艘船。

BaseSpaceship *baseClass = [BaseSpaceship baseSpaceshipWithImageNamed:@"BaseShip"];

但是,我不确定如何创建一个子类BaseSpaceship, 例如,DestroyerSpaceship。我不确定是否应该使用静态方法。我在网上看到的例子都是使用静态方法来实例化SKSpriteNodes。这是我想出来的,但它是错误的。

// DestroyerSpaceship.h
@interface DestroyerSpaceship : BaseSpaceship
@property CGFloat missileThrust;
- (id)makeDestroyerSpaceship;
@end

// DestroyerSpaceship.m
@implementation DestroyerSpaceship
- (id)makeDestroyerSpaceship{
    DestroyerSpaceship *ship = [DestroyerSpaceship baseSpaceshipWithImageNamed:@"DestroyerShip"];
    ship.engineThrust = 2.0;
    // ship doesn't have missileThrust, program crashes
    ship.missileThrust = 3.0; 

    return ship;
}
@end

最终,我希望能够做这样的事情。

DestroyerSpaceship* a = [DestroyerSpaceship makeDestroyerSpaceship];
EvilSpaceship* b = [EvilSpaceship makeEvilSpaceship];
NiceSpaceship* c = [NiceSpaceship makeNiceSpaceship];

并让它们都继承基本属性和方法BaseSpaceship.


答案没有你想象的那么复杂。好吧,代码可能会更复杂一些,但是一旦掌握了结构,它就会变得最灵活。创建不同类型的宇宙飞船也将更具可读性。

您可以重写子类中的初始化方法。作为旁注,使用(instancetype)代替(id)(来源:实例类型@NSHipster http://nshipster.com/instancetype/).

当您向对象添加自定义主体精灵时,我会选择子类化 SKNode 而不是 SKSpriteNode (所以@interface SpaceshipNode : SKNode代替@interface SpaceshipNode : SKSpriteNode).

@interface SpaceshipNode : SKNode
  @property SKColor * color; // Use SKColor instead of NSColor
  @property CGFloat engineThrust;
@end

// ... 

@implementation SpaceshipNode

- (instancetype) init {
  if (self == [super init]) {
    NSLog(@"A new SpaceshipNode was just init'ed.");
    // set some default initial values here that all brand-new SpaceshipNodes will inherit

    // perhaps create and add a basic body sprite
    // SKSpriteNode * body = ...;
    // [self addChild:body];

    // set thrust
    self.engineThrust = 2.0;
  }
  return self;
}

然后你可以继承并创建一种新型的宇宙飞船。惊人的!

@interface DestroyerSpaceship : SpaceshipNode
  @property CGFloat missileThrust;
@end

@implementation DestroyerSpaceship

- (instancetype) init {
  // note that [super init] will call the SpaceshipNode's init method
  if (self = [super init]) {
    NSLog(@"A new DestroyerSpaceship was just init'ed.");

    // add a body sprite
    // SKSpriteNode * body = ...;
    // [self addChild:body];

    // a Destroyer is much faster than your average spaceship
    self.engineThrust = 10.0;

    // set class specific variables
    self.missileThrust = 5.f;
  }
  return self;
}

现在,您只需调用:

SpaceshipNode * newSpaceShip = [SpaceshipNode new]; // short for [[SpaceshipNode alloc] init];
DestroyerSpaceship * newDestroyer = [DestroyerSpaceship new];

这两行将记录以下内容。最后两行是由 Destroyer 引起的,它首先调用SpaceshipNode init,然后是特定于驱逐舰的init method.

一个新的 SpaceshipNode 刚刚启动。

一个新的 SpaceshipNode 刚刚启动。

一艘新的驱逐舰宇宙飞船刚刚启动。

你甚至可以像这样使用它:

SpaceshipNode * newUnidentifiedVessel = [DestroyerSpaceship new];

if ([newUnidentifiedVessel isKindOfClass:[DestroyerSpaceship class]]) {
  NSLog(@"We are under attack! Route power to shields!");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 SKSpriteNode 子类的子类 的相关文章

  • 推送/呈现模态视图控制器

    我的视图控制器中有一个表 我们称之为 TVC1 我使用了 TVC1 中的行 以便用户除了 TVC1 上的数据之外还可以输入更多数据 因此 当有人点击 TVC1 中的特定行时 它将显示另一个视图控制器 我们称之为 TVC2 然而 当显示TVC
  • CocoaPods 生成无效的项目文件(未找到标头)

    我有一个带有 Podfile 的项目文件 如下所示 platform ios 7 0 def import pods pod Specta 0 1 8 pod Expecta 0 2 1 pod RestKit 0 20 3 pod Mag
  • python多重继承,调用基类函数

    我只是尝试在 python 中进行多重继承 我想出了这个 class ParentOne def foo self print ParentOne foo is called class ParentTwo def foo self pri
  • iOS 中的词干 - 不适用于单个单词

    我在用NSLinguisticTagger用于词干提取 我能够获得句子中单词的词干 但无法获得单个单词的词干 以下是我正在使用的代码 NSString stmnt i waited NSLinguisticTaggerOptions opt
  • OpenGL ES 1.1 顶点缓冲区对象不工作

    我正在使用 OpenGL ES 1 1 开发一款 iPhone 游戏 需要使用顶点缓冲区对象来渲染 500 多个粒子而不降低性能 我的游戏能够使用非 VBO 方法成功绘制 但现在我尝试合并 VBO 却不再绘制任何内容 请帮助我找出我做错了什
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 将子视图发送到后面

    我正在尝试模仿 facebook ios 侧面菜单并让它工作 但是我遇到的问题是我无法将侧面菜单发送到后面 正如另一个问题中所讨论的那样使用 Objective C 的 iphone facebook 侧边菜单 https stackove
  • 有没有办法更改 UITabBar 或 UITabBarItem 中的文本位置?

    这是我打算放在屏幕上的自定义选项卡栏 然而 我的搭档希望文字稍微向上一些 我怎样才能这样做呢 为什么不为视图控制器设置一个空的标题属性 并将标题添加到选项卡的自定义图像中 UPDATE 为了回答的完整性 来自评论和ios标签栏在没有图像时将
  • 获取 UIView 的视图控制器(iphone)

    我这样做是为了获得视图 self superview viewWithTag 10 但我怎样才能获得该视图的视图控制器 就像您可以获得视图控制器的视图一样 我想采用另一种方式 以便我可以向该视图控制器发送消息 调用方法 例如 self su
  • 如何让Doxygen忽略继承关系?

    我试图让 Doxygen 在绘制协作图时忽略继承关系 假设我的类定义如下所示 class Derived public Base int x int y int z 现在 当我运行 Doxygen 时 我不想在生成的协作图中看到基类 乍一看
  • UITouch移动速度检测

    我正在尝试检测触摸移动的速度 但并不总能得到我期望的结果 补充 速度峰值太多 任何人都可以发现我是否在做一些时髦的事情或建议更好的方法吗 void touchesBegan NSSet touches withEvent UIEvent e
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 如何在 Objective C 类中设置布尔类型属性

    如何在 Objective C 类中使用布尔属性 我是这样做的 property nonatomic copy BOOL locationUseBool 但它给出了错误 具有 复制 属性的属性必须是对象类型 正确的申报方式是什么 您也可以这
  • Java 通用问题

    下面的代码可以编译 但如果我取消注释行 它不会编译 我很困惑为什么 HashMap 确实扩展了 AbstractMap 并且声明映射的第一行可以正常编译 import java util AbstractMap import java ut
  • NSCF 数组越界?

    我有一个相当简单的应用程序 使用 Core Data 和几个数组控制器 在 IB 中 除了 xcdatamodel 文件之外 没有它们的代码文件 当我运行应用程序时 我在日志中收到以下错误 应用程序仍然运行 但在转到 文件 gt 新文档 之
  • 从 iPhone 上传图像/音频到服务器无法发送大图像

    我不知道这是我的iPhone代码还是服务器的问题 我正在使用 NSURLConnection 将图像 音频从 iPhone 上传到服务器 如果图像和音频的大小小于 60KB 则可以正常上传 如果超过 60KB 我会从服务器收到 400 Ba
  • 在 Objective-C 中检查 Json 响应的空值

    AT null EA null AD2 OP null AdsLst EMs null ND MN null FN Sony LN J ZP 23456 CT 1 PP 0 cId 161464 Pos null WPExt null OS
  • iOS 从另一个类更新 ViewController UILabel

    我是开发新手 一直在用头撞墙试图弄清楚这一点 我确信 我错过了一些愚蠢的东西 但在尝试了各种不同的解决方案后 我仍然无法得到结果我在寻找 我希望能够从另一个类更新 ViewController 中的 UILabel 这是一个我无法运行的小演
  • 我们可以在 Objective-C 中创建可空/非空属性吗?

    我们可以在 Objective C 中创建可空 非空属性吗 如果可以 那么如何创建 您可以使用 Nullable and Nonnull预选赛 property copy nullable NSString name property co
  • iOS 版 Google Analytics 中的线程崩溃

    使用适用于 iOS 版本 3 0 9 以及一般的 3 0 x 的 Google Analytics 库 我们看到很多像下面这样的崩溃 它们似乎是随机发生的 Exception Type SIGBUS Exception Codes BUS

随机推荐

  • 检查重复项,对它们求和并在求和后删除一行

    我有一个包含一些重复项的数据框 我想对有重复项的两列的行进行求和 然后删除不需要的行 这是数据的示例 Year ID Lats Longs N n c id 2015 200 30 5417 20 5254 150 30 4142 2015
  • 如何从XAML引用嵌入式资源?

    我有几个图像想要嵌入到 exe 中 当我设置构建行动 to 嵌入式资源我在代码中发现了资源不可用的错误 并要求我将构建操作设置为Resource 我尝试了几种不同的方法
  • 如何创建和使用Java Card库包?

    正如您可能知道的 正如中提到的Java 卡开发套件用户指南为Java Card平台编写大型应用程序的关键是将代码划分为单独的包单元 软件包最重要的限制是最大组件大小为 64KB 对于 方法组件 如果应用程序的方法组件的大小超过 64KB 那
  • 使用名称中的变量从values/colors.xml中检索颜色(R.color.name + 变量)

    我的 color xml 中有一个颜色列表 它们的名称均采用 tColor1 tColor2 tColor3 等格式 我想在 for to do 循环中使用循环整数作为名称的一部分来检索它们 所以我有 for int i 0 i lt nu
  • 如何在UITableView后面添加MKMapKit?就像 svpply 一样

    这样 cell就可以覆盖MKMapView了 当表格向下滚动时 MKMapView 可以被触摸 如何 特别感谢 1 为表格视图添加标题视图 320px高度 背景色清晰 2 将MKMapView放在UITableView下 3 覆盖表视图的h
  • Eclipse hibernate pojo 生成包括外键

    我一直在遵循一个关于使用 hibernate 从 mysql 数据库生成 pojo 的优秀指南 人们可以在这里找到指南以供参考 使用 hibernate 生成 pojo http www javacodegeeks com 2013 10
  • 特定 std::bind 返回的数据类型到底是什么?

    首先我不得不说我必须知道 std bind 返回的数据类型 我有一个结构体定义为 typedef struct UINT ID CString NAME boost any Func auto doesn t work here CALLB
  • swagger-ui.html 400 错误请求

    我已将 swagger 集成到我的 Spring Boot 项目中 所有 swagger 端点都工作正常 但是 product swagger ui html给出 400 错误 经过一些调试 我发现两个端点之间存在冲突 在我的 applic
  • Android Media Codec 视频解码

    这是我的第一个问题 如果我遗漏了什么 请告诉我 使用 Android API 16 的新媒体编解码器实现来尝试解码视频 以便我可以发送要作为纹理应用的帧 纹理部分已经完成 所以我在堆栈外的一些帮助下想出了以下代码 但在runOutputBu
  • 如何在python中修改Yolo .txt文件的值

    我想修改包含 txt 文件的文件夹 txt 文件如下所示 3 0 695312 0 523958 0 068750 0 052083 3 0 846875 0 757292 0 071875 0 031250 3 0 830469 0 71
  • 如何检查 UIWebView 是否为空

    我需要检查加载完成后的网络视图是否有任何内容 我的要求很简单 它是我页面底部的一个小网络视图条 就像广告一样 I call NSURLRequest request NSURLRequest requestWithURL adURL gWe
  • 这里的地图导航 - 留下的痕迹

    我使用 Here 地图 sdk 作为导航解决方案 到目前为止一切都很好 除了有点不方便 在导航模式下 我看到计算的路线如何在 3D 模式下围绕当前位置渲染 以及当前位置如何正确显示在地图上 在onPositionUpdated打回来 但是
  • 让 Kinect SDK 在 C++ 中与 Visual Studio 2010 配合使用

    我一直在遵循微软为使用 c 设置 Kinect SDK 所做的指南 他们创建的步骤如下 在源代码中包含 windows h 要使用 NUI API 请包含 MSR NuiApi h 位置 Program Files Microsoft Re
  • Firefox DOM解析器问题

    由于某种原因 DOMParser 为每个换行符添加了一些额外的 text 元素 n对于这个网址 http rt com Root rss http rt com Root rss 以及我尝试过的许多其他 RSS 我检查了 cnn bbc f
  • React 在没有构造函数的情况下定义状态 [重复]

    这个问题在这里已经有答案了 我见过一些 React 开发人员在没有构造函数的情况下定义状态 我喜欢这样简化代码 但是这样做安全吗 class Dog extends React Component state sound Woof retu
  • 我可以在 Play! 中使用什么 SBT 构建设置? 2 框架将包含类路径上源树中的特定资源

    我想在构建中添加一个设置 该设置将从 src 树中的某个位置复制特定文件 以便它们在开发和生产模式下的类路径上可用 我不想把它们放在public文件夹 因为我不希望它们可供下载 我不想把它们放在conf文件夹 因为我想保持配置文件的干净 例
  • 查找networkx中满足特定条件的边

    我有一个网络x有向图 http networkx github io documentation latest reference classes digraph html具有节点上的属性 并且我想找到特定节点属性不同的所有边 有没有办法自
  • MongoDB 中的批量更新/更新插入?

    是否可以在 MongoDB 中进行批量更新 更新插入 而不是插入 如果是 请指出与此相关的任何文档 Thanks 您可以使用命令行程序蒙戈进口公司它应该在你的 MongoDB bin 目录中 您需要考虑使用两个选项upsert upsert
  • 具有多线程的实体框架事务

    我有一个运行多个线程的应用程序 线程不共享 ObjectContext 每个线程都有自己的 我知道它们不是线程安全的 然而 线程都在共享事务下运行 原始线程创建一个 TransactionScope 它生成的每个线程都使用主线程上的 Tra
  • 创建 SKSpriteNode 子类的子类

    假设我想创建一堆不同类型的宇宙飞船 我想设置一个基本的宇宙飞船类 我可以用它来创建其他有细微差别的宇宙飞船 我的基类看起来像这样 BaseSpaceship h interface SpaceshipNode SKSpriteNode pr