我有一个SKScene名称“Scene”,其中我实例化了SKNode的类“Button”子类的2个对象。 为了不增加我的SKScene中的代码行数,我想直接在我的班级“Button”中实现触摸方法。 这是代码:
Scene.h
#import <SpriteKit/SpriteKit.h>
@interface Scene : SKScene
@end
Scene.m
#import "Scene.h"
#import "Button.h"
@implementation Scene
- (id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
Button *button01 = [Button node];
[button01.number setString: @"1"];
button01.position = CGPointMake(CGRectGetMidX(self.frame) - 50, 160);
Button *button02 = [Button node];
[button02.number setString: @"2"];
button02.position = CGPointMake(CGRectGetMidX(self.frame) + 50, 160);
[self addChild:button01];
[self addChild:button02];
}
return self;
}
@end
Button.h
#import <SpriteKit/SpriteKit.h>
@interface Button : SKNode
@property (strong, nonatomic) NSMutableString *number;
@end
Button.m
#import "Button.h"
SKShapeNode *button;
@implementation Button
- (id)init
{
if (self = [super init])
{
self.userInteractionEnabled = YES;
_number = [[NSMutableString alloc] init];
[_number setString: @"0"];
button = [SKShapeNode node];
[button setPath:CGPathCreateWithRoundedRect(CGRectMake(-25, -25, 50, 50), 4, 4, nil)];
button.fillColor = [SKColor clearColor];
button.lineWidth = 1.0;
button.strokeColor = [SKColor whiteColor];
button.position = CGPointMake(0, 0);
SKLabelNode *label = [SKLabelNode labelNodeWithFontNamed:@"Arial"];
label.text = _number;
label.fontSize = 20;
label.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
label.position = CGPointMake(0, 0);
label.fontColor = [SKColor whiteColor];
[button addChild:label];
[self addChild:button];
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
if(CGRectContainsPoint(button.frame, location))
{
button.fillColor = [SKColor whiteColor];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
button.fillColor = [SKColor clearColor];
}
@end
问题是当我触摸button01内部时,它会改变button02颜色。好像该动作仅适用于我班级的最后一个实例。 我怎么能解决这个问题。 提前谢谢。
答案 0 :(得分:0)
由于某些原因,您的Button
将SKNode
作为超类。 SKNode
没有size
属性,您可以对其进行更改,因此它需要整个大小的父节点。将其视为场景的一层。因此,无论您何时触摸,最新的SKScene
孩子(在您的情况下为button02
)都会接触到。
解决方案:直接将Button
定义为SKShapeNode
的子类。
答案 1 :(得分:0)
问题是以下变量在Button类中具有全局范围:
SKShapeNode *button;
由于它在Button的实例之间共享,因此它包含对实例化的最后一个Button的SKShapeNode的引用。在这种情况下,按钮2.您可以通过将按钮定义为实例变量来解决此问题:
@implementation Button
{
SKShapeNode *button;
}
...