我是一个绝对的 Objective-c、c 和 openGL 新手。因此,当我找到 coco2d 时,我非常感谢为我做了很多事情。无论如何,我仍然有问题。
在我设法让动画精灵根据触摸四处移动后,我决定将我的代码稍微清理为 updateLogic 方法,而不是在我的计时器内部使用 updateDrawing 方法,而不是在计时器内部做所有丑陋的事情。到目前为止,我已经拼凑出这个无法编译的科学怪人怪物:
游戏场景.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
游戏场景.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
从我的代码可以看出,我显然不是最伟大的程序员。错误日志:
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