用于精灵套件的Dpad

时间:2014-01-16 02:52:51

标签: sprite-kit

我有兴趣尝试创建一些游戏,即在新的精灵工具包中。然而,对于我想到的游戏,我宁愿使用方向垫和操纵杆。由于我将从科科斯搬过来,我的旧程序不再有效(因此dpad也不会)。可悲的是,我没有参与任何可能有助于在新的sprite工具包中实现一个的教程(只有操纵杆)。我想知道是否有人从github遇到一个简单的dpad类或者他们想要分享的东西或有用的链接。谢谢

2 个答案:

答案 0 :(得分:5)

这是一种方式:

//Joystick node
- (SKSpriteNode *)controlPadNode
{
    SKSpriteNode *controlPadNode = [SKSpriteNode spriteNodeWithImageNamed:@"game-controller-front"];
    controlPadNode.position = CGPointMake(controlPadX,controlPadY);
    controlPadNode.name = @"controlPadNode";
    controlPadNode.zPosition = 1.0;
    return controlPadNode;
}

//handle touch events
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    //if control pad touched
    if ([node.name isEqualToString:@"controlPadNode"]) {
        touchX = location.x;
        touchY = location.y;
        controlButtonDown = true;
    }
}

//when touch moves
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    //if control pad touched
    if ([node.name isEqualToString:@"controlPadNode"]) {
        touchX = location.x;
        touchY = location.y;
        controlButtonDown = true;
    }
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];

    //if control pad touched
    if ([node.name isEqualToString:@"controlPadNode"]) {
        controlButtonDown = false;
    }
}

//update method
-(void)update:(NSTimeInterval)currentTime {

    if (controlButtonDown) {

        //the control pad
        SKNode *controlNode = [self childNodeWithName:@"controlPadNode"];

        //the node you want to move
        SKNode *node = [self childNodeWithName:@"spaceShipNode"];

        //compute the angle between parameters pad and the horizontal
        float angle = atan2f (touchY - controlPadY, touchX - controlPadX) ;

        //move the control pad for the player to have a sense of movement
        SKAction *moveControlPad = [SKAction moveTo:CGPointMake(touchX, touchY) duration:0.00001];
        double distance = sqrt(pow((touchX - controlPadX), 2.0) + pow((touchY - controlPadY), 2.0));

        //make sure the control pad only moves 40 pixels
        if( distance < 40 ){
            [controlNode runAction:moveControlPad];
        }

        //move the ship
        SKAction *moveShip = [SKAction moveByX: 6*cosf(angle) y:6*sinf(angle) duration:0.005];
        [node runAction: moveShip];        

    }
}

编辑:

也可以使用它在触摸结束时向后移动控制板:

if (!controlButtonDown) {
    SKNode *controlNode = [self childNodeWithName:@"controlPadNode"];
    SKAction *moveControlPad = [SKAction moveTo:CGPointMake(controlPadX, controlPadY) duration:0.00001];
    [controlNode runAction:moveControlPad];
}

答案 1 :(得分:3)

在SpriteKit推出之前,我已经构建了一个基于UIKit的小型游戏引擎。我的引擎加载来自Tiled的cocos2d兼容地图,来自TexturePacker的精灵,以及它带有操纵杆,我将其从cocos2d移植到UIKit。 (我的是基于偷偷摸摸的操纵杆。)

您可以grab the whole library on GitHub并提取所需的部件。它相当模块化。