views:

543

answers:

2

I am an absolute objective-c, c, and openGL newbie. Hence, when I found coco2d I was pretty thankful for having a lot of stuff done for me. Regardless, I'm still having issues.

After I managed to get an animated sprite moving around based on touches I decided to clean up my code a bit into a updateLogic method and than a updateDrawing method inside of my timer instead of doing it all ugly inside of the timer. So far I've cobbled together this Frankenstein's monster that won't compile:

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

As you can see by my code, I'm obviously not the greatest programmer. Error log:

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
+1  A: 

Call your updateXXX functions like this:

[self updateLogic];
[self updateDrawings];

Because you're calling them like this: updateLogic(), the linker is looking for a C-style function implementation when linking your executable together and not finding it.

drewh
Awesome, works great.
deeb
A: 

You got an answer from drewh for your current problem, but turning on warnings (warning flags "-Wall") would have told you the problem at compile time instead of link time, complainging about updateLogic() not being defined.

Peter N Lewis