资讯专栏INFORMATION COLUMN

根据地理信息绘画的html5 小游戏 - 简单实现

microcosm1994 / 2797人阅读

摘要:地理信息的返回,是带有一个的精度值,是以米为单位的,对地理信息的舍弃与否,主要取决于你期望的这个精确值。可以自定义放大倍数,根据用户的速度,改变不同的放大。

好久没写文章了,之前一直有一个想法,就是做一个根据用户行走的路线,获取地理位置,然后把它们绘制出来,最后产生的效果,类似蜗牛行走留下的痕迹。

最近思考了一下,搭了一个https,简单实现了一下,提供一下思路给大家看看,具体的细节还有很多需要完善。

demo:

demo页面地址: (不会泄露你的隐私,请用移动端访问,耐心等待位置获取)
https://www.yudonghan.com/snail/

1.地理信息接口

要做这样一个东西首先要去了解html5提供了哪些地理信息接口,这些内容可以在MDN上找到:
主要是一个 Geolocation.watchPosition() 和 Geolocation.getCurrentPosition()

getCurrentPosition 是一次性的获取你的地理信息位置,watchPosition是监听地理信息位置的改变。

2.https

了解到接口以后,遇到的第一个问题是,发现普通的http协议由于隐私限制,已经取消了对上述两个接口的支持,解决方法是必须搭建https协议的服务器!
上网找到方法,我使用伪造的假证书搭建了nginx 的https服务,但问题是用户在访问的时候需要手动确认这个不安全的访问,不过这也正常,作为定位这样敏感的信息,确实是需要极高的安全性。

3.实现思路

我希望可以过一段时间拿到一个定位,只有一个,所以我设置了一个时间周期的循环,并记录当前在哪个循环内,如果这个周期内已经拿到过watch接口得到的位置,那么我就不做操作,如果没拿到过,我就给放到记录里,如果整个周期都没拿到,也没关系,我就抛弃这个周期,去获取更精确的值。

地理信息的返回,是带有一个accurancy的精度值,是以米为单位的,对地理信息的舍弃与否,主要取决于你期望的这个精确值。

关于绘制,这边就是用一个最基本的带有透明度的圆。在最开始,我会记录下第一次进来的位置信息(对应画布的粗略的中点),之后每次跟这次进行比对,算出差值,然后放大,映射到画布坐标,作为圆心,绘制到画布上。

直接看代码:

</>复制代码

  1. (function () {
  2. // 初始化画布
  3. var canvas
  4. var ctx
  5. var width = 500;
  6. var height = 500;
  7. function initCanvas() {
  8. canvas = document.getElementById("snail_canvas");
  9. canvas.width = width;
  10. canvas.height = height;
  11. ctx = canvas.getContext("2d");
  12. }
  13. // 绘制点方法
  14. function drawPoint(x, y, r) {
  15. ctx.fillStyle = "rgba(0, 0, 200, 0.1)";
  16. ctx.beginPath();
  17. ctx.arc(x, y, r, 0, 2 * Math.PI);
  18. ctx.fill();
  19. }
  20. // 地理信息位置参数
  21. var options = {
  22. enableHighAccuracy: true,
  23. desiredAccuracy: 20
  24. }
  25. // 一些记录用的变量
  26. var pathArr = {}
  27. var pathIndex = 0
  28. var watchID = navigator.geolocation.watchPosition(checkLocation, onError, options);
  29. var firstFlag = true
  30. var centerPos = {}
  31. var centerPoint = {}
  32. centerPoint.x = width / 2
  33. centerPoint.y = height / 2
  34. // 检查位置,每次地理信息变化都会经过这个函数
  35. function checkLocation(position) {
  36. // 精度小于期望值过滤
  37. if (position.coords.accuracy <= options.desiredAccuracy) {
  38. // 当前周期内只能记录一次地理坐标
  39. if (!pathArr[pathIndex]) {
  40. var offset
  41. pathArr[pathIndex] = position
  42. document.getElementById("container").innerHTML += "render in period" + pathIndex + "
    ";
  43. // 获取地理坐标
  44. var geoX = position.coords.longitude
  45. var geoY = position.coords.latitude
  46. // 全局第一次坐标作为我们画布的中点绘制
  47. if (firstFlag) {
  48. offset = {
  49. x: 0,
  50. y: 0
  51. }
  52. centerPos = {
  53. x: geoX,
  54. y: geoY
  55. }
  56. firstFlag = false
  57. }
  58. else {
  59. // 后来的坐标我们算跟第一次坐标的差值记录
  60. offset = {
  61. x: geoX - centerPos.x,
  62. y: geoY - centerPos.y
  63. }
  64. }
  65. // 将差值传给点渲染方法
  66. renderPoint(offset)
  67. }
  68. }
  69. }
  70. // 地理坐标放大倍数
  71. var mulTime = 100000
  72. function renderPoint(offset) {
  73. // 用画布中点叠加放大后的差值,并绘制该点
  74. var x = centerPoint.x + offset.x * mulTime
  75. var y = centerPoint.y + offset.y * mulTime
  76. drawPoint(x, y, 5)
  77. document.getElementById("container").innerHTML += "**** : " + offset.x + "+" + offset.y + "
    ";
  78. }
  79. function main() {
  80. initCanvas()
  81. // 设置一个循环来计算周期,每个周期最多获取一次地理信息位置,最少0次
  82. setInterval(function () {
  83. pathIndex ++
  84. }, 2000)
  85. }
  86. // 页面加载和重新进入页面的时候都会运行main
  87. window.onload = main;
  88. window.focus = main;
  89. //失败时
  90. function onError(error){
  91. switch(error.code){
  92. case 1:
  93. alert("位置服务被拒绝");
  94. break;
  95. case 2:
  96. alert("暂时获取不到位置信息");
  97. break;
  98. case 3:
  99. alert("获取信息超时");
  100. break;
  101. case 4:
  102. alert("未知错误");
  103. break;
  104. }
  105. }
  106. })()
4.问题

目前这套系统还存在很多问题,比如精度问题,经常产生绘制不准确的情况。

绘制上,更是不够细致,尤其是当你走出画布是无法记录的,当前的放大值过大,还很容易走出画布。该点后续可以优化。

最大问题:作为html5页面,你必须一直开启浏览器访问才能持续获取定位,不能黑屏,不能暂存浏览器,导致这个页面非常不实用!

进化:
目前是透明圆点的绘制方法,可以改用折现等其他方式。
圆点可以自定义颜色,大小,成为真正的步行绘制系统。
可以自定义放大倍数,根据用户的速度,改变不同的放大。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81931.html

相关文章

  • 推荐一些好用 HTML5 & JavaScript 游戏引擎开发库

    摘要:推荐一些好用的游戏引擎开发库引言如果你是一个游戏开发者,并且正在寻找一个可以与和无缝工作的游戏引擎。是另一个容易使用,适用于移动设备和桌面的游戏引擎。是一个开源的用来创建使用高级技术和服务的游戏引擎。用于建立游戏和绘图引擎。 推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库 0. 引言 如果你是一个游戏开发者,并且正在寻找一个可以与 JavaScript 和 HT...

    happen 评论0 收藏0

发表评论

0条评论

microcosm1994

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<