0

私は絶対的な目的の c、c、および openGL の初心者です。そのため、coco2d を見つけたときは、多くのことをしてもらったことにとても感謝していました。とにかく、私はまだ問題を抱えています。

アニメーション化されたスプライトをタッチに基づいて動き回らせることができた後、コードを少しクリーンアップして、タイマー内ですべての醜い処理を行うのではなく、タイマー内で updateLogic メソッドと updateDrawing メソッドにすることにしました。これまでのところ、コンパイルできないこのフランケンシュタインの怪物をまとめてみました。

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

私のコードからわかるように、私は明らかに最高のプログラマーではありません。エラーログ:

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 に答える