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
Génial, fonctionne très bien. – deeb