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.x
heroMale が宣言されていない識別子であることを示す 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