Скомпилированная ошибка в Xcode для игры iphone и другие вопросы - PullRequest
0 голосов
/ 22 августа 2010

Я новичок в xcode и target-c, и у меня есть несколько вопросов, касающихся примера кода игры, который прилагается ниже.Это написано в объективе C, Xcode для симулятора iphone4.Он является частью кода игры «Отскок мяча от кирпича». Вместо того, чтобы создавать изображение IB, код предполагает создание (программно) кирпичей 5 X 4 с использованием картинок 4 разных видов кирпичей (bricktype1.png ...)У меня правильно определены кирпичи в файле .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) Когда он скомпилирован, ошибка "ImageCache «незадекларировано» в строке 1. Но я уже добавил png в проект. В чем проблема и как ее исправить? (Если возможно, предложите код и объясните, что он делает и куда его помещать.)

2) Как работает следующее в строке 1: назначает ли элемент (имя .png) brickType для изображения?

brickTypes [count ++% 4]

Например, возвращает одно из имени файла bricktype1.png объекту изображения? Если true, каково максимальное значение «count», заканчивающееся на 5? (Поскольку X увеличивается 5 раз для каждого Y)Но тогда «count» превысит значение max 'indexе 'из BrickTypes, который является 3!

3) Есть ли в строке 2 выделенный объект изображения с именем и связан с .png уже в этой строке до того, как будет назначен кирпичу [x] [y]?

4) Что делают Line3 и Line5?Почему newFrame слева в строке 3, а справа в строке 5?

5) Что делает строка 4?

Ответы [ 2 ]

0 голосов
/ 22 августа 2010

1) ImageCache не является стандартным классом, поэтому класс должен быть определен где-то в игровом проекте. Вам не хватает import "ImageCache.h" (или любого заголовочного файла, в котором определен ImageCache).

2) Сначала берется count по модулю 4. То есть: разделите count на 4 и возьмите остальное. Этот остаток используется в качестве индекса для brickTypes. Таким образом, вы всегда получите значение от 0 до 3 (включая). Затем счет увеличивается на 1 (оператор postfix ++ сначала возвращает значение переменной, а затем увеличивает переменную на единицу). Поскольку 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)

0 голосов
/ 22 августа 2010

Когда он скомпилирован, ошибка «ImageCache undeclared» в строке 1. Но я уже добавил png в проект. В чем проблема и как ее исправить?

ImageCache - это имя объекта, который вы должны создать. Поскольку вы его не создали, он не определен.

Как работает следующее в строке 1? Назначает ли элемент (имя .png) brickType для изображения?

Он использует счетчик по модулю 4 (% является оператором модуля) в качестве индекса для массива, а затем увеличивает счетчик. Он не будет превышать размер массива - это то, что предотвращает операция модуля. Предлагаю учиться: Операция по модулю

В строке 2 имеет ли выделенный объект изображения имя и связан ли он с .png уже в этой строке, прежде чем он будет присвоен кирпичу [x] [y]?

Не уверен, что понимаю вопрос, но да, изображение было загружено.

Что делают Line3 и Line5? Почему newFrame слева в строке 3, а справа в строке 5?

Они устанавливают newFrame в тот же кадр, что и существующее изображение, а затем создают CGPoint, с помощью которого они устанавливают новый источник для newFrame. Строки 3, 4 и 5 получают кадр изображения, устанавливают его источник в новое значение, а затем заменяют изображение новым кадром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...