我想要实现的是能够在我的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
非常感谢任何可以提供帮助的人!
答案 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;
}