我最近开始将我的java知识转换为目标c,并开始使用xcode制作应用程序。我确实有一些我很困惑的事情。首先在Java中,当我正在制作自上而下的游戏并需要拍摄射弹时,我会这样做:
public class Bullet{
int x,y;
public bullet(double x, double y){
this.x = x;
this.y = y;
}
public void tick(){
//logic goes in here to move bullet
}
}
然后我会有一个带有arraylist的课程:
public class MainClass{
ArrayList<Bullet> bulletlist;
public main(){
//create an arraylist that takes Bullet objects
bulletlist = new ArrayList<Bullet>();
//add a new bullet at the coordinate (100,100)
bulletlist.add(new Bullet(100,100));
}
//gameloop(we'll pretend that this gets called every millisecond or so)
public void gameloop(){
//loop through list
for(int i = 0; i < bulletlist.size(); i++){
//run the method tick() at the current index
bulletlist.get(i).tick();
}
}
}
所以...我的问题是如何将此代码转换为目标c。或者换句话说,我如何创建一个类似于创建类对象的示例中的arraylist,然后最后遍历这个并调用循环方法或我在其中创建的任何方法。
答案 0 :(得分:7)
与Java不同,Objective-C没有泛型。它没有多大意义,因为Objective-C是动态类型的(大多数情况下)。相反,NSMutableArray
和NSArray
存储NSObject
或其子类型的实例(类似于Java中的ArrayList<Object>
)。
这样的事情应该让你开始。
@interface MainClass()
@property(nonatomic, strong) NSMutableArray *bullets;
@end
@implementation MainClass
- (id)init {
if (self = [super init]) {
self.bullets = [NSMutableArray array];
[self.bullets addObject:[[Bullet alloc] initAtX:100 y:100]];
}
return self;
}
- (void)gameLoop {
[self.bullets makeObjectsPerformSelector:@selector(tick)];
}
@end
答案 1 :(得分:0)
您使用xcode创建由NSObject
继承的新文件,声明您的标题和正文,ArrayList<Bullet>
可以是简单的NSMutableArray
。你的循环可能看起来像这样
NSMutableArray *bulletlist = [[NSMutableArray alloc] init];
// fill the array
for(Bullet *bullet in bulletlist) // or a simple for loop
{
[bullet tick];
}
有关如何创建和取消类的步骤,只需查看一些苹果教程:)
答案 2 :(得分:0)
看起来像这样:
// bullet.h
@interface Bullet : NSObject
@property(assign, nonatomic) CGPoint position;
- (id)initWithPosition:(CGPoint)position;
@end
// bullet.m
@implementation Bullet
- (id)initWithPosition:(CGPoint)position {
self = [self init];
if (self) {
_position = position;
}
return self;
}
@end
然后,在其他一些使用项目符号的类中(如视图控制器),声明一个数组以保留项目符号......
#import "Bullet.h"
// put this in the class's interface
@property(nonatomic, strong) NSMutableArray *bullets;
...并添加一个像这样的新子弹:
[self.bullets addObject:[[Bullet alloc] initWithPosition:CGPointMake(100,100}];
...并迭代这样的子弹:
for (Bullet *bullet in self.bullets) {
NSLog(@"bullet position is %@", NSStringFromCGPoint(bullet.position));
}
答案 3 :(得分:0)
你的“主类”应该是一个UIViewController。它应该在手机上创建一个全屏的UIView。然后它添加一个“CALayer”对象作为该视图图层的子层。
有多种方法可以绘制到CALayer中,在这种情况下最好的方法是创建CALayer的“BulletLayer”子类并在其中绘制。
视图是用户可以看到和触摸的屏幕矩形。图层是存储在视频卡[非常快]内存中的一组像素,可以由您的代码操作。为获得最佳性能,您只需绘制一次像素,然后在屏幕上移动它们(可以通过动画等完成)。
如果您需要关于其中任何特定部分的具体答案,您应该在检查是否已经在某处回答之后为每个问题提出一个新问题。