SpriteKit — CGRects, Sprites, Touch — пока ничего не работает

Я в основном хочу выполнить действие после прикосновения к спрайту. Пока это мой код, но в настоящее время он, похоже, не выполняет нужную мне функцию. Кто-нибудь может что-нибудь заметить? Спасибо

NB: код устанавливает решетку точек с прямоугольными спрайтами между точками, которые должны представлять области касания. то есть, когда одна из сенсорных областей прикасается и выполняется действие. Если мое объяснение того, как это выглядит, плохое, обратитесь к этому:

http://cl.ly/image/1W1e263B2b08/Screen%20Shot%202014-02-20%20at%2020.43.17.png

#define kRowCount 8
#define kColCount 6
#define kDotGridSpacing CGSizeMake (50,-50)
#import "BBMyScene.h"

@implementation BBMyScene

@synthesize dot;
@synthesize htoucharea;
@synthesize vtoucharea;




-(id)initWithSize:(CGSize)size {    
if (self = [super initWithSize:size]) {
    /* Setup your scene here */

    self.userInteractionEnabled = YES;

    //  Set up Background
    self.backgroundColor = [SKColor colorWithRed:0.957 green:0.957 blue:0.957 alpha:1]; /*#f4f4f4*/


    // Set up Lattice of Dots
    CGPoint baseOrigin = CGPointMake(35, 385);
    for (NSUInteger row = 0; row < kRowCount; ++row) {


        CGPoint dotPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y);


        for (NSUInteger col = 0; col < kColCount; ++col) {

            dot = [SKSpriteNode spriteNodeWithImageNamed:@"dot"];
            dot.position = dotPosition;
            NSString *dotName = [NSString stringWithFormat:@"dot_%d_%d", row, col];
            dot.name = dotName;
            [self addChild:dot];
            dotPosition.x += kDotGridSpacing.width;



        }

    }


    //Set up horizontal touch areas
    for (NSUInteger row = 0; row < kRowCount; ++row) {

        CGPoint htouchareaPosition = CGPointMake(baseOrigin.x + 0.5*(kDotGridSpacing.width), row * (kDotGridSpacing.height) + baseOrigin.y);

        for (NSUInteger col = 0; col < kColCount-1; ++col) {

            htoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:0.18 green:0.702 blue:0.91 alpha:0.5] size:CGSizeMake(35,25)];
            htoucharea.position = htouchareaPosition;
            NSString *htouchareaName = [NSString stringWithFormat:@"htoucharea_%d_%d", row, col];
            htoucharea.name = htouchareaName;
            htoucharea.userInteractionEnabled = YES;

            htouchareaPosition.x += kDotGridSpacing.width;

            [self addChild:htoucharea];


        }

    }







    // Set up vertical touch areas
    for (NSUInteger row = 0; row < kRowCount-1; ++row) {

        CGPoint vtouchareaPosition = CGPointMake(baseOrigin.x, row * (kDotGridSpacing.height) + baseOrigin.y + 0.5*(kDotGridSpacing.height));

        for (NSUInteger col = 0; col < kColCount; ++col) {

            vtoucharea = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithRed:1 green:0.478 blue:0.478 alpha:0.5] size:CGSizeMake(25,35)];
            vtoucharea.position = vtouchareaPosition;
            NSString *vtouchareaName = [NSString stringWithFormat:@"vtoucharea_%d_%d", row, col];
            vtoucharea.name = vtouchareaName;
            vtoucharea.userInteractionEnabled = YES;
            [self addChild:vtoucharea];
            vtouchareaPosition.x += kDotGridSpacing.width;


        }

    }



}

return self;
}

-(CGRect)getSpriteRect:(SKNode *)inSprite
{
CGRect sprRect = CGRectMake(htoucharea.position.x, htoucharea.position.y, 35, 25);


return sprRect;
}





- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// get the touch
UITouch *touch = [touches anyObject];

// get the location of the touch in the main view of the view controller
CGPoint touchPoint = [touch locationInView:self.view];

CGRect hRect = [self getSpriteRect:htoucharea];


if (CGRectContainsPoint(hRect, touchPoint))
{
    NSLog(@"Hello");
}

}

person benblanchard    schedule 20.02.2014    source источник


Ответы (2)


Ваш указатель htoucharea будет указывать только на последний созданный вами h-спрайт. Этот код может работать на одном спрайте. Без проверки не уверен. Вы можете либо поместить все свои спрайты в массив и протестировать прямоугольник каждого из них относительно точки касания, либо вы можете разделить спрайты на подклассы и получить каждый отчет, если к ним прикоснулись.

Метод массива, вероятно, проще понять. Когда вы создаете каждый спрайт, добавляйте его в изменяемое свойство массива. Тогда у вас будет их для проверки.

person mad pig    schedule 20.02.2014
comment
Спасибо за ваш быстрый ответ и ответ! - person benblanchard; 21.02.2014

Лично я принял во внимание тот факт, что SKSpriteNode является потомком UIResponder, и спрайты сами регистрируют прикосновения через touchesBegan: withEvent:. Я реализовал все это с помощью шаблона делегата, где сцена действует как делегаты спрайтов. Затем внутри моего подкласса спрайтов у меня просто есть:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [self.delegate touchesBeganOnSprite:self];
}

то внутри моей сцены я могу:

- (void)touchesBeganOnSprite:(SKSpriteNode *)sprite{
    // do whatever I like with the sprite...
}

Конечно, вы можете использовать touchesBegan:withEvent: и без шаблона делегата. Либо с помощью уведомлений, либо путем выполнения вызовов селектора/метода для свойства scene узла. (Я лично считаю, что шаблон делегата - это путь).

person T. Benjamin Larsen    schedule 21.02.2014