0

レイヤーにアクセスするのに少し問題があり、それが私を狂わせています。基本的に、私のレイヤーシーンの階層は次のとおりです。

Compiler.m --CCLayer --は+(CCScene)メソッドを保持し、他のすべてのCCLayerをロードします。
Construct.m-CCLayer-box2dエンジンとそのコンポーネントを
保持しますBackground.m-CCLayer-背景を保持します。
Hud.m-CCLayer-はHUDを保持します。

コンパイラ実装クラス内で、シーンと関連するすべてのノードをコンパイラCCLayerに追加します。

@implementation Compiler


+(CCScene *) scene{
    Compiler *compiler = [CompileLayer node];
    CCScene *scene = [CCScene node];
    [scene addChild: compiler];

    //Add A Background Layer.
    Background *layerBackground = [Background node];
    layerBackground.position = CGPointMake(100,100);
    [compiler addChild: layerBackground z: -1 tag:kBackground];


    //Add The Construct.
    Construct *construct = [Construct node];
    [compiler addChild: construct z: 1];

    //Add A Foreground Layer Z: 2
    //After background is working.

    //Add the HUD
    HudLayer *hud = [Hud node];
        [compiler addChild: hud z:3];
}  

これはすべて正常に機能し、私のレイヤーはコンパイラーに追加され、コンパイラーのシーンは、予測どおりにデリゲートによってアクセスされます。

私の問題は、Constructレイヤー内のBackground CCLayers-CCsprite * backgroundにアクセスして、Constructゲームヒーローの位置に応じて移動できるようにすることです。

私はさまざまなメソッドを試しましたが、現在、インスタンスメソッドではなくクラスメソッドを使用してCCSprite * backgroundを定義し、ConstructLayerでアクセスできるようにすることにしました。
また、@ propertyを使用してアクセスし、クラスのインスタンス変数を初期化してみました。

これが私の背景CCLayerです:

@implementation Background
-(id) init
{
    self = [super init];
    if (self != nil)
    {
        CCSprite *temp = [Background bk];
        [self addChild:temp z:0 tag:kBackGround];
    }
    return self;

}

+(CCSprite *)bk{
    //load the image files
    CCSprite *background = [CCSprite spriteWithFile:@"background.jpg"];

    //get the current screen dimensions
    //CGSize size = [[CCDirector sharedDirector] winSize];
    background.anchorPoint = CGPointMake(0,0);
    background.position = ccp(0,0);
    return background;
}
@end

これは機能し、画像を背景レイヤーにロードします。

そして最後に、コンストラクトレイヤーから背景画像にアクセスしようとします。

@interface Construct : CCLayer{
     CCSprite *tempBack;
}
@end

@implementation Construct

-(id) init{
     tempBack = [Background bk]; //The background equals an instance variable
}

-(void) tick:(ccTime)dt {
     tempBack.position.x ++; // To do Something here.
     tempBack.opacity = 0.5; // Some more stuff here. 

}
@end

これは機能しません。いくつかの点で「nil」ポインタを受け取ります。tempBackがバックグラウンドに正しくアクセスしないか、まったくアクセスしません。

背景CCLayersクラス変数+(CCSprite)bkにアクセスして変更するにはどうすればよいですか?

4

1 に答える 1

1

tempBackiVarはコンパイラ層で自動リリースされ、保持されないため、おそらく機能しません。initメソッドは次のようになります。

-(id) init{
     tempBack = [[Background bk] retain]; //The background equals an instance variable
}

releaseまた、deallocでそれを忘れないでください。また、クラスメソッドによって返されるバックグラウンドスプライトが異なるため、これが機能するかどうかはわかりませんbk(印刷temptempBack変数アドレスを試してみてください)。

通知の更新

背景レイヤーで、スプライトを作成してレイヤーに追加します。その後、このコードスニペットを追加して通知をサブスクライブします。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBackground:) name:@"PlayerChangedPosition" object:nil];

次に、コンストラクトレイヤーのupdateメソッド(または他のスケジュールされたメソッド)で、新しいプレーヤー座標を使用してこの通知を送信します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"PlayerChangedPosition" object:player];

バックグラウンドのレイヤーで、次のupdateBackground:(NSNotification *)aNotificationメソッドを実装します。

- (void)updateBackground:(NSNotification *)aNotification {
    // object message returns player object passed when posting notification
    CGPoint newCoords = [[aNotification object] position];
    // adjust background position according to player position
}
于 2011-04-01T03:39:40.283 に答える