0

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

我可以让它工作,但是,sneakyJoystick 操纵杆与我的游戏在同一层,并且看起来好像我的游戏屏幕“跟随”角色 - 当相机/屏幕移动时,操纵杆实际上从屏幕上移开.

我尝试将操纵杆设置在一个单独的层('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

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

4

1 回答 1

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;
}
于 2012-10-06T16:07:41.387 回答