0

cocos2dで基本的なゲームを作ろうとしていますが、ヒーロースプライトの位置に応じて背景をスクロールしようとしているところまで来ました。ヒーローは、GameplayLayer と呼ばれるクラスのコントロールと一緒に作成され、非スクロール バックグラウンドに対してすべて正常に動作します。

私がフォローしている本は、キャラクターが中間点を通過したときにスクロールを機能させるためのサンプルコードを提供してくれました。これは完璧に見えますが、実行されていません。これは、ヒーローの別のインスタンスを作成しているためだと思いますクラスであり、そのインスタンスと画面に表示されるインスタンスとの間にリンクはありません。

バックグラウンド スクロール クラス (YrrasCoastBackgroundLayer と呼ばれます) 内からヒーローの作業インスタンスにアクセスできるようにすることでこれを修正できると想定していますが、脳のブロックがあり、それを見ることができません。@property を試してみましたが、Xcode は他のクラスでそれを認識しません。

これは GameplayLayer クラスの .h ファイルで、ヒーローが作成されたり、コントロールに接続されたりします。

#import "CCLayer.h"
#import "cocos2d.h"
#import "CommonProtocols.h"
#import "SneakyJoystick.h"
#import "SneakyButton.h"
#import "SneakyJoystickSkinnedBase.h"
#import "SneakyButtonSkinnedBase.h"
#import "HeroMale.h"
#import "GameCharacter.h"

@interface GameplayLayer : CCLayer <GameplayLayerDelegate> {
    CCSprite *playerSprite;
    SneakyJoystick *playerJoystick;
    SneakyButton *jumpButton;  
    CCSpriteBatchNode *sceneSpriteBatchNode;
    HeroMale *heroMale;
}

@property (nonatomic, readonly) SneakyJoystick *playerJoystick;
@property (nonatomic, readonly) SneakyButton *jumpButton;
@property (nonatomic, assign) HeroMale *heroMale;

@end

YrrasCoastBackgroundLayer.h ファイルは確実に GameplayLayer.h をインポートします。これは、その *heroMale ivar にアクセスできるようにしたい YrrasCoastBackgroundLayer.m ファイルのメソッドの内容です。

- (void) adjustLayer {
    float heroXPosition = heroMale.position.x;
    CGSize screenSize = [[CCDirector sharedDirector] winSize];
    float halfOfTheScreen = screenSize.width / 2.0f;
    CGSize levelSize = [[GameManager sharedGameManager] getDimensionsOfCurrentScene];

    if ((heroXPosition > halfOfTheScreen) && (heroXPosition < (levelSize.width - halfOfTheScreen))) {
        float newXPosition = halfOfTheScreen - heroXPosition;
        [self setPosition:ccp(newXPosition, self.position.y)];
    }
}

float heroXPosition = heroMale.position.xheroMale が宣言されていない識別子であることを示す Xcode エラーが表示されます。ここで使用できるようにするにはどうすればよいですか?それで問題は解決しますか?

アップデート:

YrrasCoastBackgroundLayer の .h ファイルは次のとおりです。

#import "CCLayer.h"
#import "cocos2d.h"
#import "HeroMale.h"
#import "GameplayLayer.h"

@interface YrrasCoastBackgroundLayer : CCLayer {
    // Web Tutorial
    CCParallaxNode *backgroundNode;
    CCSprite *backgroundImage;

    // Book Tutorial
    CCSpriteBatchNode *sceneSpriteBatchNode;
    CCParallaxNode *parallaxNode;
}

@property (nonatomic, assign) GameplayLayer *gameplayLayer;

@end

YrrasCoastBackgroundLayer.m は次のとおりです。

#import "YrrasCoastBackgroundLayer.h"

@implementation YrrasCoastBackgroundLayer

@synthesize gameplayLayer;

- (id) init {
    self = [super init];

if (self != nil) {

    // Web Tutorial
    backgroundNode = [CCParallaxNode node];
    [self addChild:backgroundNode z: -1];

    backgroundImage = [CCSprite spriteWithFile:@"yrras-coast-ipad-hd.png"];

    CGPoint dustSpeed = ccp(0.1, 0.1);

    [backgroundNode addChild:backgroundImage z:0 parallaxRatio:dustSpeed positionOffset:ccp(1024, [[CCDirector sharedDirector]winSize].height / 2)];

    self.gameplayLayer = gameplayLayer;

    [self scheduleUpdate];

    }
    return self;
}

- (void)update:(ccTime)deltaTime {

    // Web Tutorial
    // CGPoint backgroundScrollVel = ccp(-1000, 0);
    // backgroundNode.position = ccpAdd(backgroundNode.position, ccpMult(backgroundScrollVel, deltaTime));

    CCArray *listOfGameObjects = [sceneSpriteBatchNode children];
    for (GameCharacter *tempChar in listOfGameObjects) {
        [tempChar updateStateWithDeltaTime:deltaTime andListOfGameObjects:listOfGameObjects];
    }
    [self adjustLayer];

}

// Book Tutorial
- (void) adjustLayer {
    float heroXPosition = gameplayLayer.heroMale.position.x;
    CCLOG(@"heroXPosition is %f", gameplayLayer.heroMale.position.x);
    CGSize screenSize = [[CCDirector sharedDirector] winSize];
    float halfOfTheScreen = screenSize.width / 2.0f;
    CGSize levelSize = [[GameManager sharedGameManager] getDimensionsOfCurrentScene];
    if ((heroXPosition > halfOfTheScreen) && (heroXPosition < (levelSize.width - halfOfTheScreen))) {
        float newXPosition = halfOfTheScreen - heroXPosition;
        [self setPosition:ccp(newXPosition, self.position.y)];
    }
}

@end
4

2 に答える 2

1

レイヤーGameplayLayerに渡すには、あなたのインスタンスが必要です。YrrasCoastBackgroundLayer

で割り当て可能なプロパティを宣言できますYrrasCoastBackgroundLayer

@property (nonatomic, assign) GameplayLayer gamplayLayer;

パスを初期化するときYrrasCoastBackgroundLayerは、ゲーム プレイ レイヤーのインスタンスを実行し、adjustLayerメソッドで次のことを行います。

float heroXPosition = gameplayLayer.heroMale.position.x;

編集 :

これがシーンの作成方法であると仮定します:

  MyScene *scene = [MyScene scene];
  gameplayLayer = [[GameplayLayer alloc] init];
  bgLayer = [[YrrasCoastBackgroundLayer alloc] init];
  bgLayer.gameplayLayer = gameplayLayer; // This is where you assign the gameplay Layer to the background layer;

  [scene addChild:bgLayer];
  [scene addChild:gameplayLayer];

  // Release both layers if you dont need them anymore here (scene addChild retains them when they are added)      
  [gameplayLayer release];
  [bgLayer release];
于 2012-05-14T10:01:57.493 に答える
0

HeroMale は YrrasCoastBackgroundLayer のメンバーではなく、GameplayLayer のメンバーであるため、どのように heroMale にアクセスできるかわかりません。heroMale にアクセスするには、クラス GameplayLayer のオブジェクト/インスタンスが必要です。これが、宣言されていない識別子を取得している理由です (heroMale はクラス YrrasCoastBackgroundLayer のプロパティではありません)。

敬具、
ボー

于 2012-05-14T10:10:02.347 に答える