在图层中使用SneakyJoystick来控制不同图层中的游戏角色

时间:2012-10-06 15:28:35

标签: cocos2d-iphone box2d joystick

我想要实现的是能够在我的box2d / cocos2d游戏中使用Cocos2d SneakyInput SneakyJoystick来控制我的LHSprite(使用关卡助手创建)Character / Player的移动。

我可以让它工作,但是,偷偷摸摸的摇杆操纵杆与我的游戏玩法处于同一层,并且看起来好像我的游戏画面“跟随”了角色 - 当相机/操纵杆实际移出屏幕时屏幕移动了。

我尝试将操纵杆设置在一个单独的图层('MyUILayer')中,并使用它来控制我的'GameLayer'中的角色。

以下是我尝试这样做的方法:

在'MyUILayer'中我有代码来设置以下sneakyJoystick组件:

@interface MyUILayer : CCLayer {
    SneakyJoystick *leftJoystick;
    SneakyButton * jumpButton;
    SneakyButton * attackButton;
}

@property (readonly) SneakyButton *jumpButton;
@property (readonly) SneakyButton *attackButton;
@property (readonly) SneakyJoystick *leftJoystick;

现在,在'GameLayer中,我试图访问'MyUILayer'中名为'leftJoystick'的sneakyJoystick创建的值。

在声明文件(GameLayer.h)中:

    #import "MyUILayer.h"
    @interface GameLayer : CCLayer {
    //.............
        LHSprite *character;
        b2Body *characterBody;
        SneakyJoystick *characterJoystick;
        SneakyButton *jumpButton;
        SneakyButton *attackButton;
//.............
    }

在GameLayer.mm中:

        //in my INIT method
{
        MyUILayer *UILAYER = [[MyUILayer alloc]init];
        characterJoystick = UILAYER.leftJoystick;
        [self scheduleUpdate];
// Define what 'character' is and what 'characterBody' is ('character is a LHSprite, and 'characterBody' is a b2Body)
}
//in my tick method
{    
b2Vec2 force;
    force.Set(characterJoystick.velocity.x * 10.0f, 0.0f);

    characterBody->ApplyForce(force, characterBody->GetWorldCenter());
}

我真的不明白为什么'GameLayer'中的'characterBody'在'MyUILayer'中不会根据'leftJoystick'的值移动。

对不起,如果它有点长啰! - 我还上传了我的项目文件,因此您可以查看项目本身:https://dl.dropbox.com/u/2578642/ZOMPLETED%202.zip

非常感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:1)

问题在于您将MyUILayer与GameLayer关联的方式。在myscene.mm上,您正在创建一个MyUILayer和一个GameLayer,并将它们添加到场景中。还行吧。但是,你在GameLayer上创建一个新的MyUILayer,然后关联那个操纵杆。您应该使用如下属性关联MyScene.mm中的操纵杆:

在MyScene.mm中

// Control Layer
MyUILayer * controlLayer = [MyUILayer node];
[self addChild:controlLayer z:2 tag:2];

// Gameplay Layer
GameLayer *gameplayLayer = [GameLayer node];
gameplayLayer.attackButton = controlLayer.attackButton;
gameplayLayer.leftJoystick = controlLayer.leftJoystick;
gameplayLayer.jumpButton = controlLayer.jumpButton;
[self addChild:gameplayLayer z:1 tag:1];

在GameLayer.h中添加

@property (nonatomic, retain) SneakyButton *jumpButton;
@property (nonatomic, retain) SneakyButton *attackButton;
@property (nonatomic, retain) SneakyJoystick *leftJoystick;

在GameLayer.mm中添加

@synthesize jumpButton = jumpButton;
@synthesize attackButton = attackButton;
@synthesize leftJoystick = characterJoystick;

在GameLayer.mm中,删除init方法中的UILAYER代码

- (id)init
{
    self = [super init];
    if (self) {
        //instalize physics
        [self initPhysics];
        [self lvlHelper];
        [self characterLoad];
        [self runAction:[CCFollow actionWithTarget:character worldBoundary:CGRectMake(0, -100, 870, 420)]];
        [self scheduleUpdate];
    }
    return self;
}