0

アクションでメソッドを呼び出す適切な方法は何ですか? また、CGPoint パラメーターを渡すためにメソッド自体はどのように見えるべきですか? あまり運がなかったので、オンラインで例を調べようとしたので、ほとんど推測していました。

私が試したのは、それを呼び出すためのこれです:

    CGPoint spriteCoord = saveStation.sprite.position;

    id a1=[CCMoveTo actionWithDuration:.4 position:ccp(saveStation.sprite.position.x,saveStation.sprite.position.y)];
    id actionSaveStationReaction = [CCCallFuncND actionWithTarget:self selector:@selector(saveStationReaction : data:) data:&spriteCoord];

    [hero.heroSprite runAction:[CCSequence actions:a1, actionSaveStationReaction, nil]];

そしてメソッド自体:

-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord = (void *)data; //error: Invalid initializer 

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}
4

4 に答える 4

5

NSValueでCGPointをラップすることに関するGamingHorrorの提案は、的を射たものです。

ただし、MacOSではなくiOS用にコーディングしていると仮定すると、valueWithByte:objCType:メソッドを使用するよりも簡単な方法があります。valueWithCGPoint:

NSValue *spriteCoordValue = [NSValue valueWithCGPoint:spriteCoord];
[CCCallFuncND actionWithTarget:self selector:@selector(saveStationReaction:data:) data:spriteCoordValue];

// and ..
-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord = [(NSValue *)data CGPointValue]; 

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}

NSValueは、同様の方法を使用してCGSizeとCGRectを処理することもできます

于 2011-10-07T03:11:01.283 に答える
5

パラメータとして id を取るメソッド (performSelector を使用するメソッド) に CGPoint (または C 構造体のような非 id 型) を送信する適切な方法は、それを NSValue オブジェクトでラップすることです。

NSValue* value = [NSValue valueWithBytes:&spriteCoord objCType:@encode(CGPoint)];

呼び出されているメソッドでは、データ ポインターを NSValue* にキャストして getValue を呼び出すことにより、NSValue オブジェクトからポイントを取得できます。

-(void) saveStationReaction:(id)sender data:(void *)data {

    CGPoint spriteCoord;
    [((NSValue*)data) getValue:&spriteCoord];

    NSLog(@"spriteCoord x = %f", spriteCoord.x);
    NSLog(@"spriteCoord y = %f", spriteCoord.y);

}
于 2011-09-30T09:57:20.373 に答える
0

CGPointその構文でa に型キャストすることはできません。試す....

CGPoint *spriteCoord = data;

CGFloat ptX = spriteCoord->x;
CGFloat ptY = spriteCoord->y;

私は試した...

CGPoint* spriteCoord = (CGPoint)data;

これはうまくいきませんでした。私の最初の提案を試してみて、それがうまくいくかどうかを確認してください. それは私のためにコンパイルされましたが、それがどのように実行されるかはわかりません。それはあなたの特定の状況に依存するかもしれません.

于 2011-09-28T05:02:11.730 に答える
0

CGPoint はオブジェクトではなく構造体であるため、直接渡すことはできませんCCCallFunc。これを処理する方法はいくつかありますが、最も速い方法は、 NSStringFromCGPoint を使用して CGPoint を NSString に変換し文字列を渡し、次に CGPointFromString を使用してCGPointに戻す方法です。

于 2011-09-28T09:14:33.640 に答える