Xcode for iphone game和其他问题的编译错误

时间:2010-08-22 07:09:05

标签: iphone objective-c xcode

我是xcode和objective-c的新手,我对下面附带游戏的代码示例有几个问题。它是用目标C,Xcode为iphone4模拟器编写的。它是“反弹砖反弹”游戏代码的一部分。代码不是通过IB创建图像,而是使用4种不同类型的砖图片(bricktype1.png ...)创建(编程)5 X 4砖块。我在.h文件中正确定义了砖块,并用.m。

编写了方法

我的问题是针对以下代码:

- (void)initializeBricks
{
    brickTypes[0] = @"bricktype1.png";
    brickTypes[1] = @"bricktype2.png";
    brickTypes[2] = @"bricktype3.png";
    brickTypes[3] = @"bricktype4.png";

    int count = 0;
    for (int y = 0; y < BRICKS_HEIGHT; y++)
    {
        for (int x = 0; x < BRICKS_WIDTH; x++)
        {
             UIImage *image = [ImageCache loadImage:brickTypes[count++ % 4]]; - Line1
             bricks[x][y] = [[[UIImageView alloc] initWithImage:image] autorelease];
             CGRect newFrame = bricks[x][y].frame;
             newFrame.origin = CGPointMake(x * 64, (y * 40) + 50);
             bricks[x][y].frame = newFrame;
             [self.view addSubview:bricks[x][y]];
        }  
    }  
} 

1)编译时,第1行出现“ImageCache undeclared”错误。但我已经将png添加到项目中。有什么问题以及如何解决? (如果可能的话,请建议代码并解释它的作用以及放置它的位置。)

2)第1行中的以下内容如何工作?它是否将brickType的元素(.png的名称)分配给图像?

  

brickTypes [count ++%4]

例如,将一个文件名bricktype1.png返回给图像对象?如果为真,“计数”的最大值是什么,结束于5? (因为X为每个Y递增5次)。但是“count”将超过brickTypes的最大'索引值',即3!

3)在第2行中,正在分配的图像对象是否具有名称,并且已经在此行之前与.png链接>将其分配给brick [x] [y]?< / p>

4)Line3和Line5做什么?为什么newFrame在第3行的左边但在Line5的右边显示?

5)第4行做什么?

2 个答案:

答案 0 :(得分:0)

  

编译时,第1行出现“ImageCache undeclared”错误。但我已经将png添加到项目中。有什么问题以及如何解决?

ImageCache是​​您应该创建的对象的名称。由于你还没有创建一个,它是未定义的。

  

第1行中的以下内容如何工作?它是否将brickType的元素(.png的名称)分配给图像?

它使用count modulo 4(%是模数运算符)作为数组的索引,然后递增计数。它不会超过数组大小 - 这就是模数运算所阻止的。建议你学习:Modulo Operation

  

在第2行中,正在分配的图像对象是否具有名称并且在分配给brick [x] [y]之前已经在该行链接了.png?

不确定我理解这个问题,但是,是的,图片已经加载了。

  

Line3和Line5有什么作用?为什么newFrame在第3行的左边但在Line5的右边显示?

他们将newFrame设置为与现有图像相同的帧,然后创建一个CGPoint,使用该CGPoint为newFrame设置新的原点。第3,4和5行获取图像的帧,将其原点设置为新值,然后用newFrame替换图像。

答案 1 :(得分:0)

1)ImageCache不是标准类,因此必须在游戏项目的某个地方定义类。您缺少import "ImageCache.h"(或者在其中定义了ImageCache的头文件)。

2)首先,采用count模4。即:将count除以4并取其余部分。该休息用作brickTypes的索引。因此,您将始终获得0到3之间的值(包括)。然后,count增加1(postfix ++运算符首先返回变量值,然后将变量增加1)。由于brickType似乎是NSString *brickType[4]类型(您尚未向我们展示声明),因此此代码将始终返回字符串@"bricktype1.png" ... @"bricktype4.png"

3)我不明白这个问题,抱歉。请尝试解释。

4)首先,查询砖的位置和大小(第3行)。然后,改变位置,同时保持大小不变​​(第4行)。最后,将更改的位置和大小分配给砖块。实际上,这只是将砖块移动到一个新位置。它必须以这种方式完成,因为frame是CGRect类型的属性(即:它是一个名为setFrame:(CGRect)rect的方法,但编译器提供了一种更方便的访问方式),这是一个包含其他结构的结构,所以不能只做brick[x][y].frame.origin.x = x * 64

5)它为砖块(或者更确切地说,从砖块中查询的结构)分配一个新位置。 CGPointMake(x,y)方法返回类型CGPoint的结构。结果已分配给frame的成员origin。人们还可以写:

newFrame.origin.x = x * 64;
newFrame.origin.y = (y * 40) + 50;

(这里你可以直接进行分配,因为newFrame是你堆栈上的一个结构,而不是像brick[x][y].frame这样的方法)