2010-08-22 6 views
0

내가 엑스 코드와 목표 - C의 초보자 그리고 난 아래에 부착 된 게임의 코드 샘플에 대한 몇 가지 질문이 있습니다. 그것은 객관적인 C, iphone4 시뮬레이터를위한 Xcode로 작성되었습니다. IB에서 이미지를 만드는 대신 코드는 4 가지 종류의 벽돌 그림 (bricktype1.png ...)을 사용하여 (프로그래밍 방식으로) 5 X 4 크기의 벽돌을 만드는 것으로 가정합니다. . 나는 벽돌이하는 .m 작성 .H 제대로 파일 및 방법에 정의 된컴파일 오류가

내 질문에 다음과 같은 코드입니다.

- (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 호선의 다음 내용은 어떻게 작동합니까? 이미지에 brickType의 요소 (.png 이름)를 지정합니까?

brickTypes [카운트 ++ 4 %] 예를 들어

가 화상 객체에 파일명 bricktype1.png 중 하나를 리턴? true의 경우, "count"의 최대치는 5로 끝납니다. (X는 각 Y에 대해 5 번씩 증가합니다). 그러나 "개수"는 brickTypes의 최대 '색인 값'인 3을 초과합니다! 라인 2에서

3)

, 전에이 라인 에서 이미 .PNG에 할당 된 이름을 가지며 연결되는 이미지 오브젝트가 벽돌 [X] [Y]에 할당 하는가?

4) 3 호선과 5 호선은 어떻게해야합니까? 왜 Line3의 왼쪽에 newFrame이 있지만 Line5의 오른쪽에 나타나는가?

5) 4 호선은 무엇입니까?

답변

0

컴파일되면 1 행에서 "ImageCache undeclared"오류가 발생하지만 프로젝트에 이미 png가 추가되었습니다. 문제점은 무엇이며이를 수정하는 방법은 무엇입니까?

ImageCache는 생성해야하는 개체의 이름입니다. 당신이 하나를 만들지 않았기 때문에 그것은 정의되지 않았습니다.

어떻게 줄에 다음 1 일을합니까? 이미지에 brickType의 요소 (.png 이름)를 지정합니까?

모듈러 4 (%는 모듈러스 연산자)를 배열의 인덱스로 사용하고 카운트를 증가시킵니다. 모듈 크기가 배열 크기를 초과하지 않습니다. 이것이 모듈러스 연산이 방지합니다. 당신은 공부를 제안합니다 : 라인 2에서 Modulo Operation

, 수행이 벽돌 [X] [Y]에 할당되기 전에이 라인에서 이미 .PNG에 할당 된 이름을 가지고 있으며, 링크되어있는 이미지 객체?

확실하지 않은 질문이지만 예, 이미지가로드되었습니다.

3 호선과 5 호선은 어떻게해야합니까? 왜 Line3의 왼쪽에 newFrame이 있지만 Line5의 오른쪽에 나타나는가?

newFrame을 기존 이미지와 동일한 프레임으로 설정 한 다음 newFrame의 새로운 원점을 설정하는 CGPoint를 만듭니다. 3 번, 4 번, 5 번 선은 이미지의 프레임을 가져오고 원점을 새 값으로 설정 한 다음 이미지를 newFrame으로 바꿉니다.

+0

'벽돌 [X] [Y] = [[[ UIImageView alloc] initWithImage : image] autorelease]; ' 죄송합니다, 무엇이 반환되는지 혼란스러워하십시오. 위 코드에서 각 부분과 이름에 무엇이 반환되는지 알아야합니다. 좋아요 : UIImageView alloc이 클래스 객체를 반환합니까? 그런 다음 클래스 메서드 initWithImage를 호출합니까? 1 행에서 생성 된 포인터 인 'image'라는 매개 변수를 전달합니까? 그리고 'image'는 'ImageCache'객체를 가리 킵니까? ImageCache에는 bricktype1.png가 포함되어 있습니까? 마지막으로 벽돌 [0] [0] = * 이미지? 왼쪽은 배열 포인터입니까? 오른쪽 "이미지"라는 포인터를 보유하고 개체 UIImageView 무엇입니까? – NorthKyut

0

1) ImageCache는 표준 클래스가 아니므로 클래스는 게임 프로젝트의 어느 곳에서나 정의되어야합니다. import "ImageCache.h" (또는 ImageCache에 정의 된 헤더 파일)이 누락되었습니다.

2) 우선, 모듈로 4 인 count을 취한다. 즉, count을 4로 나눈 다음 나머지를 취하십시오. 나머지는 brickTypes에 대한 색인으로 사용됩니다. 따라서 항상 0과 3 사이의 값을 얻을 수 있습니다 (포함). 그런 다음 count가 1 씩 증가합니다 (postfix ++ 연산자는 먼저 변수 값을 반환하고 이후에는 변수를 1 씩 증가시킵니다). brickTypeNSString *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

명확한 설명에 감사드립니다. 나는 이제 3-5 번 줄의 목적을 이해했다. 그러나 4에서 'newFrame.origin'은 CGPointMake (x * 64, (y * 40) + 50)에 새로운 좌표를 부여했는데 왜 여전히 5 행이 필요합니까? 암호. 또한 당신의 explaination 시작에서 "It must be ..."나는 정말로 혼란 스럽습니다. 특히 다른 structs를 포함하고있는 구조체입니다. 그리고 나는 당신의 답장에서 완전히 없어졌습니다. 그래픽으로 설명하거나 코드 예제를 만들 수 있습니까? – NorthKyut

+0

'frame'은 CGRect를 반환합니다. 그 정의는 다음과 같습니다 : struct CGRect { CGPoint origin; CGSize 크기; }; typedef struct CGRect CGRect; CGPoint와 CGSize는 다시 구조체입니다. 따라서 CGRect는 구조체이며 origin과 size라는 두 개의 다른 구조체를 포함합니다.이제'[foo frame]'과'[foo setFrame : bar]'는 CGRect에 대해서만 알고 있지만 CGRect의 원점과 크기에 대해서는 알지 못합니다. 즉, 먼저 CGRect를 복사해야합니다 (3 행). 그런 다음 해당 사본을 수정할 수 있습니다 (4 행). 그러나 'newFrame'은 아직 변경 사항을 알지 못하므로 수정 된 사본을 다시 5 번째 줄의'newFrame '으로 전달해야합니다. – DarkDust

+0

CGRect 정의보기 : http://iphonedevelopertips.com/c/cgrect- cgsize-and-cgpoint.html CGPoint 및 CGSize가 포함되어 있으며 다시 구조체입니다. 그러나 "패키지"(원점 + 크기를 가진 CGRect)는 단지 하나의 메모리 영역이며, 이것 만 복사하거나 수정할 수 있습니다. 이제'[foo frame]'과'[foo setFrame : bar]'는 CGRect를 복사 할 수 있지만 CGRect의 일부는 복사 할 수 없습니다 (CGRect의 원점과 크기). 즉, 먼저 CGRect를 복사해야합니다 (3 행). 그런 다음 해당 사본을 수정할 수 있습니다 (4 행). 그러나'newFrame'은 아직 변경 사항을 알지 못하므로, 5 번째 라인에서 'newFrame'으로 수정 된 사본을 다시 전달해야합니다. – DarkDust

관련 문제