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