0

저는 cocos2d에서 기본 게임을 만들려고하고 있으며, 영웅 스프라이트의 위치에 따라 배경을 스크롤하려고 시도하고 있습니다. . 주인공은 GameplayLayer라는 클래스의 컨트롤과 함께 만들어졌으며 스크롤되지 않은 배경에서 모두 잘 작동합니다.ObjC : 외부에서 사용자 정의 클래스의 ivar에 액세스 할 수 없습니다.

필자가 따라하는 책은 내 캐릭터가 완벽한 것처럼 보이는 중간 지점을 통과 할 때를 기준으로 스크롤링 작업을 수행하는 데 필요한 몇 가지 샘플 코드를 제공하지만 실행 중이 지 않은 것으로 보아 이것이 다른 내 영웅 클래스의 인스턴스입니다. 인스턴스와 화면에 표시되는 인스턴스 사이에는 아무런 연관이 없습니다.

내 영웅의 작업 인스턴스를 배경 스크롤링 클래스 (YrrasCoastBackgroundLayer라고도 함)에서 액세스 할 수 있도록하여이를 해결할 수 있다고 가정하고 있지만 두뇌 블록을 가지고있어 얻을 수 없습니다. 그것을보기 위해. @property를 시도했지만 Xcode는 다른 클래스에서 그것을 볼 수 없습니다. 여기

컨트롤에 매여 영웅이 작성 될 GameplayLayer 클래스, /, 등 :

#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를 수입하고,이 내용의에서 .H 파일입니다 난 그 *의 heroMale의 바르에 액세스 할 수있게하려면 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)]; 
    } 
} 

나는 heroMale이 선언되지 않은 식별자했다는 설명은 float heroXPosition = heroMale.position.x 회선에 자동 엑스 코드 오류를 받고 있어요. 어떻게 사용할 수 있습니까? 문제를 해결할 수 있습니까?

는 UPDATE :

여기 YrrasCoastBackgroundLayer에 대한 .H 파일입니다 :

#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 
+0

내 문제를 해결하지 않은 것처럼 여전히 스크롤 코드가 내장 그래서 HeroMale 클래스 .. 그리고 그 속성 ... –

답변

1

당신은에 전달하기 위해 GameplayLayer의 인스턴스가 필요합니다 여기

#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입니다 YrrasCoastBackgroundLayer 레이어

@property (nonatomic, assign) GameplayLayer gamplayLayer; 

를하고 초기화 할 때 YrrasCoastBackgroundLayer는 게임 플레이 층의와 adjustLayer 방법의 인스턴스를 전달하십시오 :

당신은 YrrasCoastBackgroundLayer에 할당 속성을 선언 할 수 있습니다

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]; 
+0

에 대한 코드를 추가 할 수 있지만 보이는하세요 그것이되어야 할 때 실행되지 않습니다. – Luke

+0

사실이 코드는 활성화되지 않습니다. if ((heroXPosition> halfOfTheScreen) && (heroXPosition <(levelSize.width - halfOfTheScreen))) { float newXPosition = halfOfTheScreen - heroXPosition; [self setPosition : ccp (newXPosition, self.position.y)]; } – Luke

+0

메서드 자체에 도달 했습니까? (디버깅 해보기) – giorashc

0

나는 YrrasCoastBackgroundLayer 회원 만 GameplayLayer이 아닌 당신이 heroMale에 액세스 할 수있는 방법을 모르겠습니다. heroMale에 액세스하려면 GameplayLayer 클래스의 object/instance가 있어야합니다. 그것이 선언되지 않은 식별자를 얻는 이유입니다 (heroMale은 YrrasCoastBackgroundLayer 클래스의 속성이 아닙니다).

종류와 관련,