2009-06-29 9 views
0

Je suis un newbie absolu-c, c, et openGL. Par conséquent, quand j'ai trouvé coco2d j'étais assez reconnaissant pour avoir fait beaucoup de choses pour moi. Peu importe, j'ai toujours des problèmes. Après avoir réussi à faire bouger un sprite animé basé sur des touches, j'ai décidé de nettoyer un peu mon code dans une méthode updateLogic et une méthode updateDrawing dans ma minuterie au lieu de tout faire moche à l'intérieur du timer. Jusqu'à présent, j'ai bricolé un monstre de Frankenstein ce qui ne compilera pas:Appels et déclarations de méthode dans l'objectif-c pour cocos2d-iphone

GameScene.h

#import <UIKit/UIKit.h> 
#import "cocos2d.h" 
#import "TestSprite.h" 


@interface GameScene : Scene 
{ 

} 


@end 

@interface GameLayer : Layer 
{ 
    //Related to TestSprite 
    TestSprite *testSprite; 
    int pointX; 
    int pointY; 
    bool goingUp; 
    int TestSpriteSpeed; 
} 
//Functions 
-(void) updateLogic; 
-(void) updateDrawings; 
-(void) moveTestSprite; 

@property (nonatomic, retain) TestSprite *testSprite; 


@end 

GameScene.m

#import "GameScene.h" 
#import "MenuScene.h" 

@implementation GameScene 
- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     //Background management and stuff to go here 
     [self addChild:[GameLayer node] z:1]; 
    } 
    return self; 
} 
@end 

@implementation GameLayer 

@synthesize testSprite; 

- (void) dealloc 
{ 
    [testSprite release]; 
    [super dealloc]; 
} 

-(id) init 
{ 
    self = [super init]; 

    if (self) 
    { 
     isTouchEnabled = YES; 

     //Create our test sprite 
     TestSprite *sprite = [[TestSprite alloc] init]; 
     self.testSprite = sprite; 
     [sprite release]; 

     //Add the test sprite to the Scene 
     [self add:testSprite]; 
     [testSprite setPosition:cpv(0,0)]; 

     //Schedule a timer 
     [self schedule: @selector(timer:) interval:0.01]; 


    } 
    return self; 
} 

-(void) moveTestSprite 
{ 
    //Reached optimal y? 
    if ([testSprite position].x - pointX == 0) {goingUp = TRUE;} 
    if ([testSprite position].y - pointY == 0) {goingUp = FALSE;} 
    if (goingUp) 
    { 
     if (pointY > [testSprite position].y) 
     { 
      testSprite.position = cpv([testSprite position].x,[testSprite position].y+1); 
     } 
     if (pointY < [testSprite position].y) 
     { 
      testSprite.position = cpv([testSprite position].x,[testSprite position].y-1); 
     } 
    } 
    else 
    { 
     if ([testSprite position].x > pointX) 
     { 
      testSprite.position = cpv([testSprite position].x-1,[testSprite position].y); 
     } 
     if ([testSprite position].x < pointX) 
     { 
      testSprite.position = cpv([testSprite position].x+1,[testSprite position].y); 
     } 
    } 
} 

-(void) updateLogic 
{ 
} 

-(void) updateDrawings 
{ 
    moveTestSprite(); 
} 



-(void) timer: (ccTime) dt 
{ 
    updateLogic(); 
    updateDrawings(); 
} 

- (BOOL) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *) event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint point = [touch locationInView: [touch view]]; 
    /* two ugly hacks here. First in pointX: for some reason the point coords and sprite coords were reversed so the number was flipped 
    secound: factored in the size of sprite 44x64 to have the sprite's center end on the clicked spot. a size property would be better*/ 
    pointY = abs(point.y-480)-32; 
    pointX = point.x-22; 
    //Finds if the difrence between the two points on the y is greater than on the x and than decides which was to go first 
    if (abs([testSprite position].x - pointX) < abs([testSprite position].y - pointY)) {goingUp = TRUE;} 
    return YES; 
} 

@end 

Comme vous pouvez le voir par mon code, je m évidemment pas le meilleur programmeur. Erreur journal:

Undefined symbols: 
    "_updateLogic", referenced from: 
     -[GameLayer timer:] in GameScene.o 
    "_updateDrawings", referenced from: 
     -[GameLayer timer:] in GameScene.o 
    "_moveTestSprite", referenced from: 
     -[GameLayer updateDrawings] in GameScene.o 

Répondre

1

Appelez vos fonctions updateXXX comme ceci:

[self updateLogic]; 
[self updateDrawings]; 

Parce que vous les appeler comme ceci: updateLogic(), l'éditeur de liens est à la recherche d'une implémentation de la fonction de style C lors de l'association exécutable ensemble et ne pas le trouver.

+0

Génial, fonctionne très bien. – deeb

0

Vous avez obtenu une réponse de drewh pour votre problème actuel, mais en activant les avertissements (les drapeaux d'avertissement "-Wall") vous auraient indiqué le problème au moment de la compilation plutôt que le temps de liaison.

Questions connexes