Rust 元宇宙 6 —— 显示世界
作者:Miracle
- 2021 年 11 月 29 日
本文字数:883 字
阅读完需:约 3 分钟
做好前述准备工作之后,我们可以使用 SDL 绘制服务器端的世界了。
根据分而治之的思想,既然 角色是按照 region 分治的,我们的绘制也应该按照 region
我们首先设定 观察者所在的坐标,假设是 x,y
左上角显示当前屏幕中心对应的世界坐标:
self.canvas.set_draw_color(Color::RGBA(0x0, 0x0, 0x0, 0x0));
self.canvas.clear();
let center_text = format!("[{},{}]", self.center.0, self.center.1);
let bitmaps = self.get_text_bitmaps(¢er_text, 14.0);
Display::draw_text_canvas(bitmaps, 0, 0, 0xffff00, &mut self.canvas);
复制代码
那么,观察者可以看到的区域如下
let center = ((self.size.0 >> 1) as i32, (self.size.1 >> 1) as i32);
for _y in -1..=1 {
for _x in -1..=1 {
if center.0 + _x * self.region_size >= -(self.region_size >> 1) && center.0 + _x * self.region_size < self.size.0 as i32 + (self.region_size >> 1) &&
center.1 + _y * self.region_size >= -(self.region_size >> 1) && center.1 + _y * self.region_size < self.size.1 as i32 + (self.region_size >> 1) {
let _pos = Position{ x: 0.0 + (_x * self.region_size) as f32, y: 0.0 + (_y * self.region_size) as f32};
let region = (center.0 + _x * self.region_size as i32, center.1 - _y * self.region_size as i32);
if let Some(Response::Roles(roles)) = self.caller.call(|tx| Request::GetRoles(_pos.x as i32, _pos.y as i32, tx) ) {
self.draw_region(region.0, region.1, &_pos, roles);
}
}
}
}
复制代码
这个我们可以直接调用 World 的获取邻近角色信息函数,也可以使用一个消息通道,RPC 的方式获取邻近角色信息。
最后绘制出来
self.draw_nodes();
self.canvas.present();
self.clear_nodes();
复制代码
划线
评论
复制
发布于: 2021 年 11 月 29 日阅读数: 15
Miracle
关注
三十年资深码农 2019.10.25 加入
还未添加个人简介
评论