0

私はObjective-CとC全般に不慣れです。私は周りを見回してきましたが、この問題の解決策を見つけることができませんでした。どんな助けでも大歓迎です。

次のグローバル変数があります

CCSprite* BackgroundImage; CCSprite* BackgroundGhost; CCSprite* Globe; CCSprite* Logo;

私のinitでは、関数を呼び出し、グローバル変数をパラメーターとして渡します。

if(_ourDevice == iPad)
   {

       [self CustomCodeSetAssetForIpad:BackgroundImage ghost:BackgroundGhost TheGlobe:Globe AndTheLogo:Logo];


   }

CustomCodeSetAssetForIpad のコードは次のとおりです。

-(void) CustomCodeSetAssetForIpad:(CCSprite*) _Background ghost:(CCSprite*) _BackgroundGhosts TheGlobe:(CCSprite*)_Globes AndTheLogo:(CCSprite*) _Logos
{
    _Background = [CCSprite spriteWithFile:@"1028-768-sunray.png"];
    _BackgroundGhosts = [CCSprite spriteWithFile:@"1028-768-sunray.png"];
    _Globes = [CCSprite spriteWithFile:@"BigGlobe.png"];
    _Logos  = [CCSprite spriteWithFile:@"DefaultLogo.png"];

    [_BackgroundGhosts setAnchorPoint:CGPointMake(0.5, 0)];
    [_BackgroundGhosts setScale:2];
    [_BackgroundGhosts setOpacity:120];
    //[BackgroundGhost setPosition: CGPointMake(BackgroundGhost.position.x, BackgroundGhost.position.y-500)];

    [_BackgroundGhosts setPosition:CGPointMake([[CCDirector sharedDirector]winSize].width/2, -100)];

    [_Globes setAnchorPoint:CGPointMake(0.5, 0.5)];
    [_Globes setScale:0.7];
    [_Globes setPosition:CGPointMake([[CCDirector sharedDirector]winSize].width/2, -260)];



    [_Logos setPosition:CGPointMake([self CenterOfTheScreen].x, [[CCDirector sharedDirector]winSize].height-[[CCDirector sharedDirector]winSize].height*0.2)]; 
    [_Logos setScale:0.05];


}

最初の数行は、渡されたグローバル変数をインスタンス化します。ただし、関数が完了すると、それらのオブジェクトへの参照は失われます。関数にポインターを渡すと、オブジェクトがインスタンス化されるため、インスタンス化されたオブジェクトへの参照が保持されると思いました。ここで何か不足していますか?

4

1 に答える 1

1

ああ...型の変数はclassname *、事実上、そのクラスのインスタンスへの参照です。したがって、あなたの場合、関数への引数として_Background渡されるインスタンス参照です。関数から (ポインターを介して) 複数の結果を返そうとする場合、引数は実際にclassname **は参照へのポインターである 型である必要があります。

したがって、呼び出しコードは次のようになります。

CCSprite * background = nil ;
CCSprite * ghosts = nil ;
CCSprite * globes = nil ;
CCSprite * logos = nil ;

[ self customCodeSetAssetForIpad:&background ghosts:&ghosts globes:&globes logos:&logos ] ;

そして、あなたの方法は次のようになります:

-(void)customCodeSetAssetForIPad:(CCSprite**)background ghosts:(CCSprite**)backgroundhosts globe:globes logos:(CCSprite**)logos
{
    *background = [CCSprite spriteWithFile:@"1028-768-sunray.png"];
    // ... the rest of your code ...
}

また、メソッド名と変数名をより客観的なものにする自由を取りました(メソッドと変数は小文字で始まります)

編集:私は個人的に次のように構成します:

//
// World... global things go in here
//

@interface World

@property ( nonatomic, readonly, strong ) CCSprite * background ;

+(id)theWorld // accessor to get the global world object

@end

@implementation World
@synthesize CCSprite * background = _background ;

static World * __theWorld = nil ; // global variable to hold our shared global World instance

+(void)load
{
    // when this class is loaded, create our global world object
    __theWorld = [ [ [ self class ] alloc ] init ] ;
}

+(id)theWorld
{
    return __theWorld ;
}

// return the background sprite, creating it if it hasn't be created yet
-(CCSprite*)background
{
    if ( !_background) { _background = [ CCSprite spriteWithFile:[CCSprite spriteWithFile:@"1028-768-sunray.png"] ; }
    return _background ;
}

@end
于 2012-08-23T06:50:23.370 に答える