2013-05-05 125 views
-3

我开始将我的java knowlege转换为最近的目标c,并开始用xcode制作应用程序。尽管如此,我还是有一些困惑的东西。首先在Java中,当我在做自上而下的游戏,要拍弹的,我会做到这一点有点像:创建类对象objective c

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。或者换句话说,我该如何创建一个类似于创建类的对象的示例中的数组列表,然后通过这个循环并调用一个循环方法或者我在里面创建的任何方法。

+1

Java和Objective-C是完全不同的语言,具有完全不同的对象模型。 – 2013-05-05 22:45:46

+0

其实我可以转移我的知识......除此之外,它一直很好。我得到了NSMutableArrays的工作,但我想知道如何添加一个实际的类到该数组。 – 36redsoxfan 2013-05-05 22:49:26

+0

你是什么意思“添加一个实际的课程”? Objc没有像Java和C++这样的泛型,你只需要在它之前添加一个对象,就像在1.5之前的java中那样,当时没有泛型。 – Kevin 2013-05-05 22:51:33

回答

7

的Objective-C没有泛型,与Java不同。它没有多大意义,因为Objective-C是动态类型的(大部分)。相反,NSMutableArrayNSArray存储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 
+0

我不得不选择这个作为最佳答案。现在我完全理解了!谢谢! – 36redsoxfan 2013-05-05 22:59:17

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]; 
} 

的步骤如何创建和declera一类,只是检查一些苹果教程:)

+0

“基础”框架中的所有类都提供了类(或静态)构造函数以及那些对对象起作用的类。因此:'NSMutableArray * bulletlist = [NSMutableArray array];' – marko 2013-05-05 22:52:53

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)); 
} 
+0

Thankyou!我有点困惑,我应该如何通过mutablearray循环。 – 36redsoxfan 2013-05-05 22:55:17

+0

没关系我不需要再循环它 – 36redsoxfan 2013-05-05 22:59:41

+0

无论如何编辑来说明迭代。 – danh 2013-05-06 00:28:06

0

你的“主类”应该是一个UIViewController。它应该创建一个全屏的UIView在手机上。然后它将一个“CALayer”对象添加为该视图图层的子图层。

有多种方法可以绘制成CALayer,在这种情况下最好的方法是创建一个CALayer的“BulletLayer”子类并在其中进行绘制。

视图是用户可以看到并触摸的屏幕的矩形。图层是存储在视频卡[非常快速]的内存中的一组像素,可以由您的代码操作。为获得最佳性能,您只能绘制像素一次,然后将它们移动到屏幕上(可以使用动画等)。

如果您想要了解任何特定部分的具体答案,您应该在检查每个问题是否已在某个地方得到答复后,为每个问题提出一个新问题。