关于开放式多人游戏,我想到了几个想法。我使用的语言是JavaScript。由于我不太了解他,所以出现了一个问题。
有一个有条件的游戏世界。目前 - 画布600x400像素。此阶段的玩家用圆圈表示。由于使用websocket实现的python服务器,他们可以在画布上移动并看到彼此的动作。
问题
我们需要实现一个摄像头来跟踪玩家在更大的游戏世界中移动。
尝试解决问题
说实话,由于对技术的了解不够,我只找到了实现的信息ctx.translate()
,但据我了解,这种方式并不适合我。因为有了它,游戏世界就会相对于玩家移动。我预见这对我的想法不起作用。
我想要什么?
如果有人能帮助我回答如何实现这样的相机,以便它在大世界范围内舒适地工作,那就太好了。作为示例,我可以给出diep.io、ponytown、surviv.io等。
材料
由于我不明白到底应该提供什么,所以我将提供整个客户端部分。
名为script.js的JavaScript 文件
HTML&СSS 文件分别名为index.html、index_style.css
首先,我们组织对地图上英雄(黑色圆圈)移动的控制。例如,我们可以使用光标设置地图上的移动方向,该函数
moveDir
将以毫秒为间隔触发inertia_frame
英雄( , )inertia_t
位置的变化,变化幅度为点击方向上的距离。改变步长可以是10毫秒。pos.x
pos.y
inertia_l
英雄的绘制(在新位置或先前位置)以最佳帧速率 (
animationFrame
) 进行处理。如果没有变化,则图形预处理器将保持帧不变。基于英雄的新位置,我们使用 移动坐标原点
translate(pos.x,pos.y)
,将英雄绘制在“零”位置并返回变换矩阵的设置 -ctx.resetTransform()
(或ctx.save() отрисовка ctx.restore()
)。现在来解决这个问题。在单独的画布上,我们绘制了一个 10000x10000 的世界。为了清楚起见,我们将其划分为 1/100x1/100 的单元格,并通过改变每个条件单元格的填充颜色进行渐变。
我们将英雄放置在这个大世界的中心(您可以指定任何坐标)。但现在,在绘制英雄时,我们首先使用 放置世界的一部分
ctx.drawImage(map, pos.x - w / 2, pos.y - h / 2, w, h, 0, 0, w, h)
。也就是说,我们以一张大地图画布作为图像,将片段的开头设置为相对于英雄的位置,并且片段的大小与比赛场地的大小一致。在运动场的画布上,我们将这个片段从 0.0 绘制到运动场的整个尺寸。将世界画布转换为应该更合理BitMap
- 位图也作为第一个参数传递给drawImage()
.英雄总是被画在场地的中央。移动函数是一样的,只是移动方向是从比赛场地的中心开始计算的。因此,出于制作目的,最好将英雄移动到单独的画布上,放在其他画布上(使用平庸的画布
css z-index
)。底层画布可以为其他玩家保留;该画布应为地图大小 (10000x10000),在其上放置其他玩家,其坐标通过网络套接字接收。最好将该层的控制权转移给 Web Worker,Web Worker 将保持与服务器的连接,并且播放器将放置在同一 Worker 中关联的 OffscreenCanvas 上。
第三个,也是世界碎片的最低画布——运动场。可以为对象、建筑物等分配附加层。除了最上面的英雄图层之外,所有图层的绘制方式都与世界 ( ) 完全相同
map
。