0

私はObjective-Cを初めて使用するわけではありませんが、この問題を理解できません。作成した CCSprite のサブクラスのインスタンスを作成しようとしていますが、常に (0,0) にインスタンスが作成され、移動できません。レベル情報を入れた .txt ファイルを解析し、その情報に基づいてスプライトを作成するようにコードを設定しました。

スプライトを初期化するコードは次のとおりです。

-(void)initLevel{

NSLog(@"Level %i is of length %i", lvlNum, [FileReader getLengthOfLevel:[FileReader getStartOfLevel:lvlNum atPath:lvlPack] atPath:lvlPack]);
CCSprite *spriteToMake;
int start = [FileReader getStartOfLevel:lvlNum atPath:lvlPack];
int length = [FileReader getLengthOfLevel:start atPath:lvlPack];

NSString *tmp = [FileReader getLineFromFile:lvlPack byIndex:start];
NSArray *tmpArray = [tmp componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSMutableArray *tmpArray2 = [tmpArray mutableCopy];
[tmpArray2 removeObject:@""];

requiredLinks = [(NSString*)[tmpArray2 objectAtIndex:2] intValue];

[tmpArray2 release];

for(int i = start + 1; i <= start + length; i++){
    NSString *line = [FileReader getLineFromFile:lvlPack byIndex:i];
    int x = 0;
    int y = 0;

    NSArray *temp = [line componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSMutableArray *temp2 = [temp mutableCopy];
    [temp2 removeObject:@""];

    //Determine the type of sprite
    if([(NSString*)[temp2 objectAtIndex:0] isEqualToString:@"Basic_Sprite"]){
        spriteToMake = [BasicLink sprite];
    }else if([(NSString*)[temp2 objectAtIndex:0] isEqualToString:@"Big_Sprite"]){
        spriteToMake = [BasicLink spriteWithFile:@"Big_Link.png"];
    }else{
        spriteToMake = nil;
    }

    //Create the sprite
    if(spriteToMake != nil){
        x = [(NSString*)[temp2 objectAtIndex:1] intValue];
        y = [(NSString*)[temp2 objectAtIndex:2] intValue];
        spriteToMake.position = ccp(x, y);
        NSLog(@"%@", spriteToMake);

        [self addChild:spriteToMake];
        [spriteToMake setUpdate];
    }else{
        NSLog(@"Sprite set to NULL");
    }

    NSLog(@"%i, %i, %i", x, y, [temp2 count]);

    [temp2 release];
    }
} 

サブクラスのヘッダーは次のとおりです。

@interface BasicLink : CCSprite{
CGPoint position;
CGPoint movement;
int explosionRadius, width, height;
CCScene *sceneIn;
}

@property (assign)CGPoint pos, movement;
@property (assign)int explosionRadius, width, height;
@property (assign)CCScene* sceneIn;

+(CCSprite*)sprite;
+(CCSprite*)spriteAtX:(int)x atY: (int)y;

-(void)die;
-(void)explode;
-(void)updateSprite;
-(CGRect)getBounds;
-(void)setUpdate;
-(void)move:(int)x, int(y);

@end

そして、スプライトを初期化するサブクラスの部分は次のとおりです。

@implementation BasicLink

@synthesize position, movement, explosionRadius, sceneIn, width, height;

+(CCSprite*)sprite{
    return [BasicLink spriteWithFile:@"Basic_Link.png"];
}

どんな助けでも大歓迎です。

4

1 に答える 1

0

明らかな問題は次のとおりです。

-(void)move:(int)x, int(y);

Cでは、コンマは演算子です。コンパイラは、このステートメントを次のメソッド宣言として解釈します。

- (void)move:(int)x

私はそれが何をしているのか完全にはわかりませんint(y); おそらくそれをC関数宣言として扱っています。いずれにせよ、それはメソッド宣言の一部ではありません。

移動宣言は次のようになります。

- (void)moveToX:(int)x andY:(int)y;

もう1つの小さな間違いは、クラスメソッドの戻り型です。

+(CCSprite*)sprite{
    return [BasicLink spriteWithFile:@"Basic_Link.png"];
}

それは次のようになります。

+ (BasicLink *)sprite{
    return [BasicLink spriteWithFile:@"Basic_Link.png"];
}

ただし、ここではおそらく問題ではありません。

于 2012-12-28T21:21:52.350 に答える