利用游戏玩家的使用行为 - 触摸热图

游戏开发是一种非常有益的体验。看着人们实际上玩你所做的并且被逗乐是一种很棒的感觉。但事情并不总是按照计划进行。对我们有用的东西可能不一定适合游戏玩家。 对于控件尤其如此。游戏开发人员和测试人员在整个开发周期中无休止地玩游戏后会习惯他们,他们

利用游戏玩家的使用行为 - 触摸热图

发布日期:2019-06-29 12:32
  

游戏开发是一种非常有益的体验。看着人们实际上玩你所做的并且被逗乐是一种很棒的感觉。但事情并不总是按照计划进行。对我们有用的东西可能不一定适合游戏玩家。

对于控件尤其如此。游戏开发人员和测试人员在整个开发周期中无休止地玩游戏后会习惯他们,他们无论是否容易都不能客观。这就是为什么对他们是否真的为游戏玩家工作有一些见解是至关重要的。一个很好的方法是通过询问朋友和家人或随机陌生人来测试游戏。另一种替代方法是将其包含在游戏代中,以记录玩家所触摸的位置。

这样做可能会耗费大量资源,但我们找到了一种有效执行此作的方法。

在iOS中,UIWindow充当应用程序根视图,一切都源自那里。层次结构如下图所示:

(图片来自http://www.objc.io/issue-1/containment-view-controller.html)

UIApplication获取所有消息,并通过sendEvent方法将所有内容分发到UIWindow。要使用它,需要子类化UIWindow并为sendEvent方法指定不同的实现。执行此作还需要您指定拦截委托。

APWindow.h

 @protocol APEventInterceptWindowDelegate - (BOOL)interceptEvent:(UIEvent *)事件; //如果处理了事件,则返回[email protected]结束@interface APWindow:UIWindow {? //似乎在任何UI工具包中使用变量名称'delegate'? //子类是一个非常糟糕的主意,因为它可以在一个中隐藏相同的名称? //超类并默默地打破自动旋转之类的东西。? id __unsafe_unretained eventInterceptDelegate;}@property(unsafe_unretained)id eventInterceptDelegate;@结束  

APWindow.m

  - (void)sendEvent:(UIEvent *)event {? [eventInterceptDelegate interceptEvent:event];? [super sendEvent:event];}

现在每个UIEvent都将传递给您委托的interceptEvent方法。根据这里的类引用,我们知道有三种类型的事件;触摸事件,运动事件和远程控制事件。我们只对触摸事件感兴趣。我们可以通过以下方式从UIEvent中提取这些触摸事件的确切坐标:

 for(UITouch * touch in [event allTouches]){ CGPoint point = [touchlocationInView:touch.window];} 

将这些积分存储为一个完整的会话(可能持续几秒到一个小时或更长时间)可能会很困难,因为它不会影响游戏的表现。

有些人可能会考虑将这些点存储在NutableArray中,并将该数组传递给服务器进行计算。这里的挑战是尽量减少占地面积,同时尽可能快地访问存储,以防止滞后。

另一种方法是将坐标的数量存储在二维数组中的坐标上,但这也会占用大量内存,如下面的公式所示:

M = Wd×Hd×I

Wd:宽度(以像素为单位)
高清:高度(以像素为单位)
I:一个整数(4)中的字节

通过这个公式,对于iPad视网膜(W = 2048,H = 1536),我们需要12 MB(12582912字节)的内存用于保存触摸的单个2d阵列。

但是,我们可以大大减少它。怎么样?

首先,iOS为iPad视网膜报告的大小仍然是1024x768,比例为2.如果我们创建一个具有该大小的2D数组,则需要1.5 MB(1572864字节)。这是一个巨大的差异,但我们仍然不需要这么多细节,并且鉴于我们需要通过网络传输所有这些信息,它不会有效。

现在,根据人机界面指南,我们知道可点击区域应该在44x44像素左右。有了这些信息,我们可以将阵列的大小减少十倍。

让我们定义一个合适的块大小(2的幂),这样我们就不会丢失很多信息。

M =(Wd / S)×(Hd / S)×I

S =块大小,在我们的情况下为16

最大大小(1024x768)现在只需要3 KB(3072字节)的内存,甚至可以通过网络进行传输。

要访问数组的索引,只需将值除以块大小。

Mx = Px / S
M y = P y / S

游戏开发是一种非常有益的体验。看着人们实际上玩你所做的并且被逗乐是一种很棒的感觉。但事情并不总是按照计划进行。对我们有用的东西可能不一定适合游戏玩家。

对于控件尤其如此。游戏开发人员和测试人员在整个开发周期中无休止地玩游戏后会习惯他们,他们无论是否容易都不能客观。这就是为什么对他们是否真的为游戏玩家工作有一些见解是至关重要的。一个很好的方法是通过询问朋友和家人或随机陌生人来测试游戏。另一种替代方法是将其包含在游戏代中,以记录玩家所触摸的位置。

这样做可能会耗费大量资源,但我们找到了一种有效执行此作的方法。

在iOS中,UIWindow充当应用程序根视图,一切都源自那里。层次结构如下图所示:

(图片来自http://www.objc.io/issue-1/containment-view-controller.html)

UIApplication获取所有消息,并通过sendEvent方法将所有内容分发到UIWindow。要使用它,需要子类化UIWindow并为sendEvent方法指定不同的实现。执行此作还需要您指定拦截委托。

APWindow.h

 @protocol APEventInterceptWindowDelegate - (BOOL)interceptEvent:(UIEvent *)事件; //如果处理了事件,则返回[email protected]结束@interface APWindow:UIWindow {? //似乎在任何UI工具包中使用变量名称'delegate'? //子类是一个非常糟糕的主意,因为它可以在一个中隐藏相同的名称? //超类并默默地打破自动旋转之类的东西。? id __unsafe_unretained eventInterceptDelegate;}@property(unsafe_unretained)id eventInterceptDelegate;@结束  

APWindow.m

  - (void)sendEvent:(UIEvent *)event {? [eventInterceptDelegate interceptEvent:event];? [super sendEvent:event];}

现在每个UIEvent都将传递给您委托的interceptEvent方法。根据这里的类引用,我们知道有三种类型的事件;触摸事件,运动事件和远程控制事件。我们只对触摸事件感兴趣。我们可以通过以下方式从UIEvent中提取这些触摸事件的确切坐标:

 for(UITouch * touch in [event allTouches]){ CGPoint point = [touchlocationInView:touch.window];} 

将这些积分存储为一个完整的会话(可能持续几秒到一个小时或更长时间)可能会很困难,因为它不会影响游戏的表现。

有些人可能会考虑将这些点存储在NutableArray中,并将该数组传递给服务器进行计算。这里的挑战是尽量减少占地面积,同时尽可能快地访问存储,以防止滞后。

另一种方法是将坐标的数量存储在二维数组中的坐标上,但这也会占用大量内存,如下面的公式所示:

M = Wd×Hd×I

Wd:宽度(以像素为单位)
高清:高度(以像素为单位)
I:一个整数(4)中的字节

通过这个公式,对于iPad视网膜(W = 2048,H = 1536),我们需要12 MB(12582912字节)的内存用于保存触摸的单个2d阵列。

但是,我们可以大大减少它。怎么样?

首先,iOS为iPad视网膜报告的大小仍然是1024x768,比例为2.如果我们创建一个具有该大小的2D数组,则需要1.5 MB(1572864字节)。这是一个巨大的差异,但我们仍然不需要这么多细节,并且鉴于我们需要通过网络传输所有这些信息,它不会有效。

现在,根据人机界面指南,我们知道可点击区域应该在44x44像素左右。有了这些信息,我们可以将阵列的大小减少十倍。

让我们定义一个合适的块大小(2的幂),这样我们就不会丢失很多信息。

M =(Wd / S)×(Hd / S)×I

S =块大小,在我们的情况下为16

最大大小(1024x768)现在只需要3 KB(3072字节)的内存,甚至可以通过网络进行传输。

要访问数组的索引,只需将值除以块大小。

Mx = Px / S
M y = P y / S

  

  

相关最糟 Zyng 如果 例如 对于