0

我是一个绝对的 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
4

2 回答 2

1

像这样调用你的 updateXXX 函数:

[self updateLogic];
[self updateDrawings];

因为您像这样调用它们: updateLogic(),所以链接器在将您的可执行文件链接在一起但没有找到它时正在寻找 C 风格的函数实现。

于 2009-06-29T21:32:05.347 回答
0

您从 drawh 那里得到了当前问题的答案,但是打开警告(警告标志“-Wall”)会在编译时而不是链接时告诉您问题,抱怨未定义 updateLogic()。

于 2009-06-30T03:55:39.193 回答