用操纵杆移动精灵?

时间:2011-03-21 00:45:09

标签: iphone xcode ios4 cocos2d-iphone

如何在Cocos2d中使用操纵杆将动作应用于Sprite?

1 个答案:

答案 0 :(得分:2)

你要做的就是有一个sprite和一个已经完成的SneakyJoyStick。要做SneakyJoyStick,只需google sneakyinput并点击第三个链接。

完成此操作后,您的项目已打开(duh ...),请查看以下代码:

这是HelloWorldLayer.h :(它可以是不同的,只要它是一个层)

#import "cocos2d.h"

@class SneakyJoystick;

@interface HelloWorldLayer : CCColorLayer {
    SneakyJoystick *leftJoyStick;
    CCSprite *character;
    CCNode *mainCharacter;
    CGPoint stickPosition;
    float degrees;
    CGPoint velocity;
    BOOL autoCenter;
    BOOL isDPad;
    BOOL hasDeadzone; //Turns Deadzone on/off for joystick, always YES if ifDpad == YES
    NSUInteger numberOfDirections; //Used only when isDpad == YES

    float joystickRadius;
    float thumbRadius;
    float deadRadius; //Size of deadzone in joystick (how far you must move before input starts). Automatically set if isDpad == YES

    //Optimizations (keep Squared values of all radii for faster calculations) (updated internally when changing joy/thumb radii)
    float joystickRadiusSq;
    float thumbRadiusSq;
    float deadRadiusSq;
}

@property (nonatomic, readonly) CGPoint stickPosition;
@property (nonatomic, readonly) CGPoint playerPosition;
@property (nonatomic, readonly) CGPoint playerPosition2;
@property (nonatomic, readonly) float degrees;
@property (nonatomic, readonly) CGPoint velocity;
@property (nonatomic, assign) BOOL autoCenter;
@property (nonatomic, assign) BOOL isDPad;
@property (nonatomic, assign) BOOL hasDeadzone;
@property (nonatomic, assign) NSUInteger numberOfDirections;

@property (nonatomic, assign) float joystickRadius;
@property (nonatomic, assign) float thumbRadius;
@property (nonatomic, assign) float deadRadius;

-(id)initWithRect:(CGRect)rect;

@end

这是HelloWorldLayer.m:

    // Import the interfaces
#import "HelloWorldLayer.h"
#import "SneakyJoystick.h"
#import "SneakyJoystickSkinnedBase.h"
#import "ColoredCircleSprite.h"

#define SJ_PI 3.14159265359f
#define SJ_PI_X_2 6.28318530718f
#define SJ_RAD2DEG 180.0f/SJ_PI
#define SJ_DEG2RAD SJ_PI/180.0f

@interface SneakyJoystick(hidden)
-(void)updateVelocity:(CGPoint)point;
-(void)setTouchRadius;
@end

// HelloWorldLayer implementation
@implementation HelloWorldLayer

@synthesize
stickPosition,
degrees,
velocity,
autoCenter,
isDPad,
hasDeadzone,
numberOfDirections,
joystickRadius,
thumbRadius,
deadRadius,
position,
playerPosition,
playerPosition2;

-(id)initWithRect:(CGRect)rect
{
    self = [super init];
    if(self){
        stickPosition = CGPointZero;
        playerPosition = ccp(150,150);
        degrees = 0.0f;
        velocity = CGPointZero;
        autoCenter = YES;
        isDPad = NO;
        hasDeadzone = NO;
        numberOfDirections = 4;

        self.joystickRadius = rect.size.width/2;
        self.thumbRadius = 32.0f;
        self.deadRadius = 0.0f;

        //Cocos node stuff
        position_ = rect.origin;
    }
    return self;
}

-(void)updateVelocity:(CGPoint)point
{
    // Calculate distance and angle from the center.
    float dx = point.x;
    float dy = point.y;
    float dSq = dx * dx + dy * dy;

    if(dSq <= deadRadiusSq){
        velocity = CGPointZero;
        degrees = 0.0f;
        stickPosition = point;
        return;
    }

    float angle = atan2f(dy, dx); // in radians
    if(angle < 0){
        angle       += SJ_PI_X_2;
    }
    float cosAngle;
    float sinAngle;

    cosAngle = cosf(angle);
    sinAngle = sinf(angle);

    // NOTE: Velocity goes from -1.0 to 1.0.
    if (dSq > joystickRadiusSq || isDPad) {
        dx = cosAngle * joystickRadius;
        dy = sinAngle * joystickRadius;
    }

    velocity = CGPointMake(dx/joystickRadius, dy/joystickRadius);
    degrees = angle * SJ_RAD2DEG;

    // Update the thumb's position
    stickPosition = ccp(dx, dy);
}

+(id) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    HelloWorldLayer *layer = [HelloWorldLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super initWithColor:ccc4(255,255,255,255)] )) {
        self.isTouchEnabled = YES;

        SneakyJoystickSkinnedBase *leftJoy = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
        leftJoy.position = ccp(72,72);
        leftJoy.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
        leftJoy.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
        leftJoy.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0,0,128,128)];
        leftJoyStick = [leftJoy.joystick retain];
        [self addChild:leftJoy];

        character = [CCSprite spriteWithFile:@"player.jpg"];

        mainCharacter = character;
        [self addChild:mainCharacter];

        [self schedule:@selector(tick:)];

        [[CCDirector sharedDirector] setAnimationInterval:0.0000001f/10000.0f];

    }
    return self;
}

-(void)tick:(float)delta
{
    character.position = ccp(character.position.x + (leftJoyStick.velocity.x),
                             character.position.y + (leftJoyStick.velocity.y));

}

@end
是的,这就是它!