我是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行做什么?
答案 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
这样的方法)