iOS 7 — кнопки/элемент меню SpriteKit

Я пытаюсь создать простую игру для iOS. Когда мое главное меню загружается и появляется на экране, я хочу, чтобы кнопки перемещались по бокам. Моя единственная идея - применить некоторые SKActions к SKSpriteNodes. Но поэтому мне нужно создать свой собственный класс кнопок. Есть ли более простой способ сделать это? Существуют ли уже такие классы, как CCMenuItem/CCMenu из cocos2d? Или есть способ с UIButtons?

Спасибо


person dennis-tra    schedule 20.09.2013    source источник
comment
Посмотрите на этот элемент управления: github.com/akashgupta88/AGSpriteButton   -  person ZeMoon    schedule 03.12.2014


Ответы (2)


Я создал класс кнопок со свойствами SKSpriteNode, CGRect и Radius (для круглых кнопок). Когда вы инициализируете кнопку изображением, оно устанавливает свойства CGRect и Radius в зависимости от размера изображения. Затем вы можете просто проверить, нажал ли игрок кнопку, вызвав его метод -collisionRect, который возвращает CGRect, и проверить, находится ли место «касания» внутри этого прямоугольника. Таким образом, кнопки могут перемещаться и по-прежнему получать ввод. Вот код...

////////////////////// ФАЙЛ ЗАГОЛОВКА /////////////////////////

//
//  ZSButton.h
//  PEGO
//
//  Created by Zion Siton on 07/09/2013.
//  Copyright (c) 2013 zillustrator. All rights reserved.
//

#import <SpriteKit/SpriteKit.h>

@interface ZSButton : SKNode {

    SKSpriteNode *mySprite;
    CGRect myRect;
    CGFloat myRadius;

}

@property (nonatomic, strong)SKSpriteNode *mySprite;
@property (nonatomic, assign)CGRect myRect;
@property (nonatomic, assign)CGFloat myRadius;

- (id)initWithTexture:(SKTexture *)texture;
- (BOOL)didRadialCollideWith:(CGPoint)aPoint;

@end

/////////////////// ФАЙЛ РЕАЛИЗАЦИИ ////////////////////////

//
//  ZSButtonA.m
//  PEGO
//
//  Created by Zion Siton on 07/09/2013.
//  Copyright (c) 2013 zillustrator. All rights reserved.
//

#import "ZSButton.h"

@implementation ZSButton

@synthesize mySprite, myRect, myRadius;

- (id)init {

    // Use a default button image
    return [self initWithTexture:[SKTexture textureWithImageNamed:@"ButtonDefault.png"]];

}

- (id)initWithTexture:(SKTexture *)texture {

    self = [super init];
    if (self) {

        // Assumes there is a texture
        mySprite = [SKSpriteNode spriteNodeWithTexture:texture];
        [self addChild:mySprite];

        // Assumes the collision area is the size of the texture frame
        myRect = [mySprite frame];

        // Assumes the texture is square
        myRadius = myRect.size.width * 0.5;

    }

    return self;

}

- (CGRect)myRect {

    CGPoint pos = [self position];
    CGFloat originX = pos.x - (mySprite.frame.width * 0.5);
    CGFloat originY = pos.y - (mySprite.frame.height * 0.5);
    CGFloat width = mySprite.frame.width;
    CGFloat height = mySprite.frame.height;

    myRect = CGRectMake(originX, originY, width, height);

    return myRect;

}

- (BOOL)didRadialCollideWith:(CGPoint)aPoint {

    // Get the distance between the button centre and the touch
    // ZSMath is a class I wrote that mainly performs trigonometric functions
    CGFloat distance = [ZSMath distanceFromA:[self position] toB:aPoint];

    // Perform a radial collision check
    if (distance < [self myRadius]) {

        // HIT!!!
        return YES;
    }

    // MISS!!!
    return NO;

}

@end

////////////////// ДЛЯ ИНИЦИАЛИЗАЦИИ КНОПКИ...

// Initialize BACK BUTTON
        backButton = [[ZSButton alloc] initWithTexture:
                      [[ZSGraphicLoader sharedGraphicLoader] frameByName:kBACK_BUTTON]];
        [self addChild:backButton];

////////////////// ДЛЯ ПРОВЕРКИ КОНФЛИКТА/НАЖИМА ПОЛЬЗОВАТЕЛЯ

for (UITouch *touch in touches) {

    // Get the user's touch location
    CGPoint location = [touch locationInNode:self];

    // If the user taps on BACK Button Rectangle
    if (CGRectContainsPoint(backButton.myRect, location))
    {
        // DO A RADIAL CHECK
        if ([backButton didRadialCollideWith:location])
        {
            // DO BACK BUTTON STUFF
        }

    }

}
person user2796283    schedule 20.09.2013

Создание собственного класса кнопок, наследуемого от SKSpriteNode, и добавление действий занимает всего несколько минут и работает очень хорошо. UIButton и SKScene, кажется, не очень хорошо взаимодействуют друг с другом в отношении касаний, и на самом деле нет необходимости рассматривать описанный подход как действительно хорошо работающий. Вы можете добавить к кнопке свои собственные текстуры и цвета, используя унаследованные элементы SKSpriteNode.

person Skill M2    schedule 26.09.2013
comment
я добавил ползунок в свою игру, работает хорошо, но, надеюсь, Apple упростит добавление его на сцену в качестве SKNode, а не UISlider и т. д. - person DogCoffee; 01.10.2013