我曾在一些个人项目中使用过Xcode和iOS,并且一直使用非面向对象的设计......只是因为我一直在做大部分学习/实验的事情。
现在我一直试图将一些面向对象的设计实现到我之前制作的一个游戏中。我的想法是,我有一艘可以射击子弹的太空船。在过去,我基本上将UIImageView添加到故事板,然后将其连接到.h文件,并从那里做了一些事情,如移动它或任何东西(使用CGPointMake)。
现在的想法是创建一个方法(以及很快的其他类),它将以编程方式创建UIImageView,分配它,将其添加到superview等......到目前为止,我已经完成了这项工作,很容易东西,但下一部分有点难。我在哪里存储这个本地变量" bullet"?我已经将它保存到NSMutableArray并执行以下操作: (实际上这里是我的方法)
-(void)movement {
for (int i = 0; i < [array1 count]; i ++) {
UIImageView *a = [array1 objectAtIndex:i];
a.center = CGPointMake(a.center.x + 2, a.center.y);
if (a.center.x > 500) {
[array1 removeObjectAtIndex:i];
[a removeFromSuperview];
}
}
}
-(void)getBullet {
UIImageView *bullet = [[UIImageView alloc] initWithFrame:CGRectMake(ship.center.x + 20, ship.center.y - 2, 15, 3)];
bullet.image = [UIImage imageNamed:@"bullet2.png"];
bullet.hidden = NO;
[self.view addSubview:bullet];
[array1 addObject:bullet];
}
(顺便说一句,array1在.h文件中声明) 还有一个控制移动方法的计时器
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(movement) userInfo:nil repeats:YES];
第一个问题是:这样做的正确方法是什么?例如,存储子弹直到从superview中删除它,我应该以另一种方式存储吗?
另一个问题是,当我从superview中删除UIImageView时,是否会将其从内存中删除,以免它耗尽系统资源?
谢谢你的帮助! (如果我想到其他问题,将会更新
更新 我想指出目前这个功能不正常。当我点击&#34;拍摄&#34;我创建的按钮(基本上调用getBullet方法)子弹出现但不移动..不知道为什么。这也是我提出这个问题的部分原因。
答案 0 :(得分:1)
我为您提供完全不同的解决方案。不要使用内置的UIKit
来执行图形计算并在屏幕上移动内容,而是尝试使用UIKit
以外的外部框架。 UIKit
框架非常擅长其预期的工作,它更倾向于基于触摸的用户界面而不是游戏开发。以下内容摘自Apple的UIKit
文档。
UIKit框架提供构建和管理iOS应用程序用户界面所需的类。它提供了专为触摸屏界面设计的应用程序对象,事件处理,绘图模型,窗口,视图和控件。正如您所看到的,
UIKit
是为了光滑的用户界面而制作的,不要在屏幕周围设置精灵(宇宙飞船,子弹)的动画。
最好的选择是俯视另一条道路。首先要做的是SpriteKit
。由Apple制作并已包含在Xcode
中,SpriteKit
是您工作的完美工具。专为游戏开发而设计,它能够一次在屏幕上无缝动画多个精灵(在你的情况下是子弹),并有一个内置的物理引擎。这很容易学习,并且有可能将你的想法变成一场伟大的游戏。
SpriteKit
文档can be found here的链接。