在游戏的SKScene中添加Button
来源:互联网 发布:腾讯数据库 编辑:程序博客网 时间:2024/06/03 17:15
偶然发现SpriteKit
中的SKNode
也有userInteractionEnabled
属性,就像UIKit
中的userInteractionEnabled
一样,于是我对以前的代码进行重构,发现了在游戏中添加交互button的新的方式(估计很多大神们早就发现了)
在SKScene中添加SKNode对象作为Button
不得不承认,我以前在SKScene
中添加一个Button
的过程是这样的:
添加一个SKNode
(一般都是它的子类:SKLabelNode
和SKSpriteNode
)属性
1
SKLabelNode *button = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
设置其填充的内容和放置位置,还有SKNode
的name
1
2
3
4
5
6
button.text = @"Click me";
button.name = @"button";
button.fontSize = 40;
button.fontColor = [SKColor purpleColor];
button.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild:button];
在SKScene
重写touchesEnded: withEvent:
方法,并在方法中判断触摸到哪个SKNode
1
2
3
4
5
6
7
8
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch * touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:location];
if ([touchedNode.name isEqualToString:@"button"]) {
//TODO:
}
}
如果某个场景中需要设置很多Button,比如游戏设置界面,那么在touchesEnded: withEvent:
方法中就会出现好多if判断,这么多分支,每个分支可能还有很多操作,这样增加了SKScene的体积,使得代码可读性变差,维护也困难
通过继承来封装自己的Button
UIKit
中的userInteractionEnabled
大家一定都很熟悉,它默认值是YES
,也就是默认接受触摸事件,偶然发现SKNode
也有userInteractionEnabled
属性,但是默认值是NO
,而且SKNode
是继承UIResponder
的,这么说,我们可以在SKNode中一展拳脚了,不必再麻烦SKScene了
下面添加一个用于跳转到主菜单场景页面的Button为例:
新建一个类,名字叫MainSceneButton,继承SKLabelNode
,并构造出时候方法
1
2
3
4
5
6
7
8
-(id)init{
if (self = [super initWithFontNamed:@"Chalkduster"]) {
self.text = @"MENU";
self.fontSize = 20;
self.userInteractionEnabled = YES;
}
return self;
}
这里碰到一个问题:如果用上面的代码初始化,将会出现 EXC_BAD_ACCESS
错误,问题的解决方法是在超类初始化时用init方法代替,然后再设置字体:
1
2
3
4
5
6
7
8
9
-(id)init{
if (self = [super init]) {
self.fontName = @"Chalkduster";
self.text = @"MENU";
self.fontSize = 20;
self.userInteractionEnabled = YES;
}
return self;
}
至于原因,我也没弄清楚,估计是SKLabelNode
的bug吧,因为初始化SKSpriteNode
时用initWithTexture: color: size:
方法就不会报错
在MainSceneButton中重写touchesEnded: withEvent:
方法
1
2
3
4
5
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
SKScene * myScene = [[MainScene alloc] initWithSize:self.scene.size];
[self.scene.view presentScene:myScene transition: reveal];
}
MainScene是我的一个SKScene,通过点击MainSceneButton来切换到MainScene
最后在某个场景中将button添加上去,跟之前的类似
1
2
3
MainSceneButton *mainScene = [[MainSceneButton alloc] init];
mainScene.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild:mainScene];
感觉这样做是不是很像以前继承一个UIView然后封装自己的Custom View呢?给SKScene瘦身的方法还有很多,参照给UIViewController瘦身的方法,我们还可以把其他SKNode也从SKScene中剥离出去,一些用于设置SKNode的方法也会随之剥离到自定义的类中,便于以后维护代码
- 在游戏的SKScene中添加Button
- Android在代码中添加一个Button的方法
- unity3D 在UGUI中动态添加button的监听事件
- 关于在一个子窗口中添加的navigation中添加button出现的错误。
- 怎样在EXt.Button中添加图标
- 在button中添加两行文字
- 在JAVA语言的游戏中添加启动画面
- android中button控件的添加
- IOS中button的标题添加下划线
- 在ListView中添加Button并且自定义布局和获取输入框中值的方法
- SKView,SKScene,SKSpriteNode和SKAction的认识
- UITableViewCell中添加Button
- 在SDI应用程序中如何添加Button并响应
- 如何在Sencha Touch List Item中添加一个Button
- 在导航栏中添加音量加减button
- Android中在Button文本上添加图片
- 在Demo游戏中添加一个player
- 在游戏中添加Chipmunk 物理引擎
- mysql主从同步-错误记录
- Android仿微信通讯录功能,好友排序+字母索引
- 网络编程和反射机制
- 了解枚举类型(2)
- angular中的路由简单使用
- 在游戏的SKScene中添加Button
- HTTP攻击与防范--PHP安全配置
- opencl:原子命令实现自旋锁(spinlock)的使用限制
- Android图解浅析事件拦截机制
- 第八届河南省程序设计大赛
- android开发之java代码中字符串对比忽略大小写。java程序员必回,可用来比对验证码等问题
- Lua与c/cplus交互
- Android LayoutInflater详解
- getHeight 与 getMeasuredHeight的区别