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

Ich versuche O'Reilly Buch, iPhone Game Development, aber auf Seite 73 Kapitel 3 Ich erhalte diesen Fehler zu folgen:Zugriff auf die CGColor-Eigenschaft von UIColor in CGContextSetFillColorWithColor?

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

Nach dem Buch des errata page dies ist ein unbestätigter errata in der Buch. Mit welchem ​​Funktionscode kann diese Zeile ersetzt werden?

Weitere Details

Das Beispielprojekt kann here heruntergeladen werden.

mir den Fehler bei der Render-Funktion wurde begegnet durch die Anweisungen des Buchs folgende von Seite 72 bis Seite 73, um die gsMain Klasse (das unterscheidet mich von dem Beispielprojekt pg77) an der Render-Funktion gsMain.m

zu bauen der Code-snippet, dass das Buch gsMain Klasse zu bauen instruiert ist wie folgt:

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

die Chapter3_Example_p77 sollte ab Seite des Ergebnis der Übungen zeigen, 71 bis 77, aber es ist sehr verschieden von den Anweisungen gegeben in 71 bis 77. Der folgende Code ist die vollständige, kompilierbare Klasse, die von oben heruntergeladen wurde Verknüpfung.

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

Antwort

6

ich das p77 Beispiel für Simulator 3.1.3 kompiliert und nicht in irgendwelchen Compiler-Warnungen oder Fehler laufen.

Der Code:

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

    //... 
} 

erscheint in Ordnung zu kompilieren. Vielleicht können Sie angeben, welches der drei Beispiele Sie kompilieren und für welche Version des Ziel-Betriebssystems?

+0

Dank für das Laufen, das kompilieren. Mit Ihrer Hilfe sehe ich endlich das Problem. Ich kompiliere eine Version, die ich nach den Anweisungen des Buches erstellt habe (in den zusätzlichen Details der Frage). Was zu dem von dir kompilierten p77-Beispiel führen sollte. Die Renderfunktion im 'p77-Ergebnis' unterscheidet sich erheblich von den Anweisungen in p71-p73. Ich denke, ich muss einfach die gsMain-Klasse von p77 kopieren, anstatt den Anweisungen auf dem eigentlichen Buch zu folgen. – Azeworai

+0

Ich fing an, das Beispiel p71 Projekt zu referenzieren und ich kompiliere für iPhoneOS 3.1.2 – Azeworai

6

Stellen Sie sicher, dass Sie #include <UIKit/UIKit.h>.

Und es ist -grayColor, nicht -greyColor.

+0

Yep bekam das danke. Ich habe nur den Text abgeschrieben, um die Anweisungen des Buches zu zeigen. – Azeworai

21

Was ist mit [ [ UIColor grayColor ] CGColor ]?

Verwenden Sie das neueste SDK? Ich nehme an, Ihr UIColor.h Header hat eine Eigenschaft für CGColor? (Ich würde Ihre SDK-Einstellungen überprüfen - wenn ich das Beispielprojekt öffnete es auf iOS 3.x festgelegt wurde)


In Swift 3.x: UIColor.gray.cgColor