让它自己跳吧 -- 微信小游戏跳一跳 (1)

微信上个月更新了6.6.1这个版本,带来了”跳一跳”这一个悠闲游戏,刚上手玩得可谓虐心,半个小时后可以根据蓄力时背景音乐节奏点对应距离进行判断了,但还是十分闹心。

总得来说,这个游戏一般人在熟练后,跳的格数时差不多的,高低分差别主要在棋子落点是否多在中点上,因为棋子落点在中心,分数不断加2,封顶32分每跳。那能不能有个辅助的玩意,能帮助我们跳得更加精准呢?比如这个

f492c0d3bbde4813

分析

  • 玩法

这个游戏是根据按压时间长短来决定棋子的跳跃距离远近的
2018-01-07-21515330870_.pic

  • 找控制器

既然要在这个界面搞事情,那就先找到它的控制器,可以ssh到手机,用 cycript 查看UI控件的nextResponder,不断查找,总会找到控制器。其实 Reveal 里已经能看到了

2018-03-11-15153313664761

接着就可以到微信对应的文件里探索一番了,微信的头文件,人手一份的东西就不多说了。不过这次玩耍不看微信头文件也行。

辅助思路

首先,这次需要的是一个辅助工具,帮我们跳得更准,那怎么才能跳得更准呢?上面那张物理外挂图已经给了答案,那就是获得棋子起始位置和落点位置之间的距离,进而算出一个近似的按压时间。

需要解决

  • 获取两点间距离
  • 计算按压时间
  • 模拟点击事件

获取两点间距离

直接在控制器上的

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
``` 是获取不到触摸时间的,估计是被上面的view处理了,那就不钻牛角尖了,在控制的view上在加一层屏幕大小view覆盖它所有的子view,跳之前,点两下,获取两次点击的位置,计算距离就可以了。

大概是这样子

```objc
%hook WAGameViewController
UIView *xdHUDView;
- (void)viewDidLoad
{
xdHUDView = [UIView new];
xdHUDView.frame = self.view.bounds;
xdHUDView.backgroundColor = [UIColor yellowColor];
xdHUDView.alpha = 0.1;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.view insertSubview:xdHUDView belowSubview:xdAssistBtn];
}
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 这里记录点击位置,且在第二次点击计算距离,算出事件,进行模拟点击
}
%end

计算距离

都知道速度路程除以速度等于时间,那么这个棋子的速度是多少呢,是一个固定的速度吗?

这些都是不能确定的,看上面的截图,这个WAGameViewController 下面的view也该由OpenGL对layer进行操作画出来的,我对 OpenGL 是一点也不了解,只听说 无尽之剑 是用它开发的,那么 跳一跳 里面的距离可能是按照三维来算的。

不过其实也不需要这么高的精度,保证能棋子能上方块就不错了。这里暂时不表。

模拟点击

有个叫SimulateTouch库挺出名的,但这是越狱开发使用的,hook住的是系统程序com.apple.backboardd。
但还有一个 PTFakeTouch,是封装KIF的实现模拟点击的库,KIF是一个自动化测试框架,估计是使用了某些私有API实现了模拟点击,具体要去看源码,这里直接使用了,使用方法相当简单,如下实现了一秒点击

1
2
3
4
NSInteger pointId = arc4random()%50+1;
[PTFakeMetaTouch fakeTouchId:pointId AtPoint:point withTouchPhase:UITouchPhaseBegan];
[NSThread sleepForTimeInterval:1];
[PTFakeMetaTouch fakeTouchId:pointId AtPoint:point withTouchPhase:UITouchPhaseEnded];

由上,获得了距离,模拟了点击,接着便是猜出一个系数来计算按压时长了,按压时间如果是这样来计算 按压时长 = 距离(point)/系数,这个系数4寸屏为220,4.7寸屏为260,5.5寸屏为285

按照以上思路即可完成每点击两次,棋子便会跳到指定的位置(大概)