写点什么

Rust 元宇宙 6 —— 显示世界

作者:Miracle
  • 2021 年 11 月 29 日
  • 本文字数:883 字

    阅读完需:约 3 分钟

Rust 元宇宙 6 —— 显示世界

做好前述准备工作之后,我们可以使用 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(&center_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();
复制代码


用户头像

Miracle

关注

三十年资深码农 2019.10.25 加入

还未添加个人简介

评论

发布
暂无评论
Rust 元宇宙 6 —— 显示世界