Я создал класс кнопок со свойствами 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