如何在 SpriteKit 中呈现场景后立即接收触摸事件?

Posted

技术标签:

【中文标题】如何在 SpriteKit 中呈现场景后立即接收触摸事件?【英文标题】:How can I receive touch events immediately after presenting a scene in SpriteKit? 【发布时间】:2014-05-02 03:25:59 【问题描述】:

使用 SpriteKit,我有一个场景 XYZMyScene,当我触摸屏幕时会呈现另一个场景 XYZMyOtherScene。在不抬起手指的情况下,我希望touchesMoved:withEvent: 在我移动手指时触发,但直到我首先抬起手指,然后触碰新场景并四处移动时它才会触发。

有没有可能在不先抬起手指的情况下让它开火?

下面是一些简单的复制代码:

//  XYZMyScene.h

#import <SpriteKit/SpriteKit.h>

@interface XYZMyScene : SKScene

@end

//  XYZMyScene.m

#import "XYZMyScene.h"
#import "XYZMyOtherScene.h"

@implementation XYZMyScene

-(id)initWithSize:(CGSize)size     
    if (self = [super initWithSize:size])         
        self.backgroundColor = [SKColor orangeColor];
    
    return self;


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event     
    XYZMyOtherScene *otherScene = [[XYZMyOtherScene alloc] initWithSize:self.frame.size];
    [self.view presentScene:otherScene];


@end

//  XYZMyOtherScene.h

#import <SpriteKit/SpriteKit.h>

@interface XYZMyOtherScene : SKScene

@end

//  XYZMyOtherScene.m

#import "XYZMyOtherScene.h"

@implementation XYZMyOtherScene

-(id)initWithSize:(CGSize)size 
    if (self = [super initWithSize:size])         
        self.backgroundColor = [SKColor blueColor];
    
    return self;


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    NSLog(@"moving!");


@end

【问题讨论】:

我建议您将 XYZMyScene 的元素移动到 XYZMyOtherScene 并处理来自同一场景的所有内容。 @akashg - 我不知道。听起来有点像它反驳了我所学到的关于分工和 OOP 的一切。必须有更好的解决方案... 嗯,根据我对 XYZMyScene 的了解,它并没有真正起到什么作用。 【参考方案1】:

您不能将触摸从一个班级转移到另一个班级。

在不知道您的代码或您执行此操作的最终意图的情况下,我的唯一建议是为您的 XYZMyOtherScene 类设置一个类属性,并让它传递您完成任务所需的任何数据。

【讨论】:

感谢您的建议。目前,我没有想要结转的数据。几乎,我希望在我的手指离开屏幕时显示一个场景,然后在我的手指在屏幕上时显示另一个场景。有没有办法强制XYZMyOtherScene 开始收听touchesMoved:withEvent?如果是这样,也许我可以在其didMoveToView: 方法中调用它...

以上是关于如何在 SpriteKit 中呈现场景后立即接收触摸事件?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何获得Spritekit场景的大小以呈现SKNode全屏?

SpriteKit 中未呈现场景

如果使用编辑器中的场景加载,如何在 SpriteKit 中检测触摸

SpriteKit 加载新场景但精灵立即下降

Sprite Kit 最后得分数据

使用 swift 和 spritekit,你如何阻止场景在变得活跃/移动到前台后取消暂停?