创建类对象目标c

时间:2013-05-05 22:37:16

标签: objective-c

我最近开始将我的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,然后最后遍历这个并调用循环方法或我在其中创建的任何方法。

4 个答案:

答案 0 :(得分:7)

与Java不同,Objective-C没有泛型。它没有多大意义,因为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

答案 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”子类并在其中绘制。

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

如果您需要关于其中任何特定部分的具体答案,您应该在检查是否已经在某处回答之后为每个问题提出一个新问题。

相关问题