2010-05-02 11 views
15
CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor); 

Sto cercando di seguire il libro di O'Reilly, iPhone Game Development, ma a pagina 73 Capitolo 3 I ottenere questo errore:Come accedere alla proprietà CGColor di UIColor in CGContextSetFillColorWithColor?

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

Secondo il libro di errata page si tratta di un'errata non confermato nel libro. Con quale codice funzionale è possibile sostituire quella linea?

Dettagli aggiuntivi

Il progetto di esempio può essere scaricato here.

stavo incontrando l'errore alla funzione di rendere seguendo le istruzioni del libro a partire da pagina 72 a pagina 73 per la costruzione della classe gsMain (il suo diverso dal pg77 progetto di esempio) alla funzione di rendering di gsMain.m

il frammento di codice che il libro insegna a costruire classe gsMain è come segue:

//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 

il Chapter3_Example_p77 dovrebbe mostrare il risultato degli esercizi da pagina 71 a 77, ma è molto diverso dalle date istruzioni fornite nel 71 a 77. Il codice seguente è la classe compilata e compilata scaricata da quanto sopra collegamento.

//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 

risposta

6

ho compilato l'esempio p77 per Simulator 3.1.3 e non incorrere in eventuali avvisi o errori del compilatore.

Il codice:

- (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]]]; 

    //... 
} 

appare per compilare bene. Forse potresti specificare quale dei tre esempi stai compilando e per quale versione del SO di destinazione?

+0

Grazie per l'esecuzione che compilano. Con il tuo aiuto finalmente vedo il problema. Sto compilando una versione che ho creato seguendo le istruzioni del libro (nei dettagli aggiuntivi della domanda). Il che dovrebbe portare all'esempio p77 che hai compilato. La funzione di rendering nel 'risultato di p77' è molto diversa dalle istruzioni del libro in p71-p73. Penso che dovrò solo copiare la classe gsMain di p77 invece di seguire le istruzioni sul libro vero e proprio. – Azeworai

+0

Ho iniziato a fare riferimento al progetto p71 di esempio e sto compilando per iPhoneOS 3.1.2 – Azeworai

6

Assicurati di avere #include <UIKit/UIKit.h>.

Ed è -grayColor, non -greyColor.

+0

Sì, grazie. Ho appena copiato il testo per mostrare le istruzioni del libro. – Azeworai

21

Che dire di [ [ UIColor grayColor ] CGColor ]?

Stai utilizzando l'ultimo SDK? Presumo che l'intestazione UIColor.h abbia una proprietà per CGColor? (Vorrei controllare le impostazioni SDK - quando ho aperto il progetto di esempio è stato impostato per iOS 3.x)


In 3.x Swift: UIColor.gray.cgColor