-3

我最近开始将我的 Java 知识转移到 Objective 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。或者换句话说,我如何创建一个类似于示例中创建类对象的数组列表,然后最终循环并调用循环方法或我在其中创建的任何方法。

4

4 回答 4

8

与 Java 不同,Objective-C 没有泛型。这没有多大意义,因为 Objective-C 是动态类型的(大部分情况下)。相反,NSMutableArrayNSArray存储其实例NSObject或子类型(类似于ArrayList<Object>Java)。


这样的事情应该让你开始。

@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
于 2013-05-05T22:50:46.030 回答
0

你创建一个NSObject用 xcode 继承的新文件,声明你的 header 和你的 body,你ArrayList<Bullet>可以是一个简单的NSMutableArray. 你的循环看起来像这样

NSMutableArray *bulletlist = [[NSMutableArray alloc] init];
// fill the array

for(Bullet *bullet in bulletlist) // or a simple for loop
{
    [bullet tick];
}

有关如何创建和 declera 类的步骤,只需查看一些苹果教程 :)

于 2013-05-05T22:48:27.413 回答
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));
}
于 2013-05-05T22:49:28.650 回答
0

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

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

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

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

于 2013-05-05T23:07:45.180 回答