0

私が達成しようとしているのは、Cocos2d SneakyInput SneakyJoystick を使用して、box2d/cocos2d ゲームで LHSprite (レベル ヘルパーを使用して作成) キャラクター/プレイヤーの動きを制御する機能です。

私はそれを機能させることができますが、sneakyJoystick ジョイスティックは私のゲームプレイと同じレイヤーにあり、ゲーム画面がキャラクターに「追従」しているように見えます-カメラ/画面が移動すると、ジョイスティックは実際に画面から移動します.

ジョイスティックを別のレイヤー (「MyUILayer」) に設定し、それを使用して「GameLayer」でキャラクターを制御しようとしました。

これが私がこれをやろうとした方法です:

「MyUILayer」には、次の卑劣なジョイスティック コンポーネントを設定するコードがあります。

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

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

今、'GameLayer' で 'MyUILayer' の 'leftJoystick' と呼ばれる卑劣なジョイスティックによって作成された値にアクセスしようとしました。

宣言ファイル (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());
}

「MyUILayer」の「leftJoystick」の値に基づいて、「GameLayer」の「characterBody」が動かない理由がよくわかりません。

少し長くなってすみません!- プロジェクト ファイルもアップロードしたので、プロジェクト自体をご覧ください: 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 に答える