Как получить доступ к свойству CGColor UIColor в CGContextSetFillColorWithColor? - PullRequest
15 голосов
/ 02 мая 2010
CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor);

Я пытаюсь следовать книге О'Рейли «Разработка игр для iPhone», но на странице 73 Глава 3 я получаю эту ошибку:

error: request for member 'CGColor' in something not a structure or union

Согласно странице с ошибками в книге это неподтвержденные ошибки в книге. Каким функциональным кодом можно заменить эту строку?

Дополнительные сведения

Пример проекта можно скачать здесь .

Я столкнулся с ошибкой в ​​функции рендеринга, следуя инструкциям книги со стр. 72 по стр. 73 по созданию класса gsMain (он отличается от примера проекта pg77) в функции рендеринга gsMain.m

Фрагмент кода, который книга дает инструкции для создания класса gsMain, выглядит следующим образом:

//gsMain.h
@interface gsTest : GameState { }  
@end

//gsMain.m 
@implementation gsMain 

-(gsMain*) initWithFrame:(CGRect)frame andManager:(GameStateManager*)pManager 

    { 
        if (self = [super initWithFrame:frame andManager:pManager]) { 
        NSLog(@"gsTest init"); 
    } 
return self; 
} 

-(void) Render 
{ 
    CGContextRef g = UIGraphicsGetCurrentContext(); 
    //fill background with gray 
    CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor); //Error Occurs here
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, 
    self.frame.size.height)); 
//draw text in black 
CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor); 
[@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0,20.0) 
        withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]]; 
} 
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    NSUInteger numTaps = [touch tapCount]; 
    //todo: implement touch event code here 
} 
@end

Chapter3_Example_p77 должен показывать результат упражнений со стр. 71 по 77, но он сильно отличается от данных инструкций, приведенных в 71 по 77. Следующий код представляет собой законченный, скомпилированный класс, загруженный по вышеуказанной ссылке.

//gsMain.h
#import <Foundation/Foundation.h>
#import "GameState.h"
@interface gsMain : GameState {

}

@end

//  gsMain.m
//  Example
//  Created by Joe Hogue and Paul Zirkle

#import "gsMain.h"
#import "gsTest.h"
#import "Test_FrameworkAppDelegate.h"

@implementation gsMain

-(gsMain*) initWithFrame:(CGRect)frame andManager:(GameStateManager*)pManager {
if (self = [super initWithFrame:frame andManager:pManager]) {
    //do initializations here.
}
return self;
}

- (void) Render {
[self setNeedsDisplay]; //this sets up a deferred call to drawRect.
}

- (void)drawRect:(CGRect)rect {
CGContextRef g = UIGraphicsGetCurrentContext();
//fill background with gray
CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
//draw text in black.
CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
[@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:
    [UIFont systemFontOfSize:   [UIFont systemFontSize]]];

//fps display from page 76 of iPhone Game Development
int FPS = [((Test_FrameworkAppDelegate*)m_pManager) getFramesPerSecond];
NSString* strFPS = [NSString stringWithFormat:@"%d", FPS];
[strFPS drawAtPoint:CGPointMake(10.0, 60.0) withFont:[UIFont systemFontOfSize:
    [UIFont systemFontSize]]];
}

//this is missing from the code listing on page 77.
-(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    UITouch* touch = [touches anyObject];
    NSUInteger numTaps = [touch tapCount];
    if( numTaps > 1 ) {
    [m_pManager doStateChange:[gsTest class]];
}
}

@end

Ответы [ 3 ]

23 голосов
/ 31 декабря 2013

А как же [ [ UIColor grayColor ] CGColor ]?

Используете ли вы последний SDK? Я предполагаю, что у вашего UIColor.h заголовка есть свойство для CGColor? (Я бы проверил ваши настройки SDK - когда я открыл пример проекта, он был установлен на iOS 3.x)


В Swift 3.x: UIColor.gray.cgColor

6 голосов
/ 02 мая 2010

Я скомпилировал пример p77 для Simulator 3.1.3 и не столкнулся с какими-либо предупреждениями или ошибками компилятора.

код:

- (void)drawRect:(CGRect)rect {
    CGContextRef g = UIGraphicsGetCurrentContext();
    //fill background with gray
    CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    //draw text in black.
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];

    //...
}

, кажется, компилируется в порядке. Возможно, вы могли бы указать, какой из трех примеров вы компилируете и для какой целевой версии ОС?

5 голосов
/ 02 мая 2010

Убедитесь, что вы #include <UIKit/UIKit.h>.

И это -grayColor, а не -greyColor.

...